Tom: Besucherzähler in PHP Nr.2

Beitrag lesen

Hello,

Spätens mit der nächsten Zeile wir es unsauber:

if (file_exists($datei) && ($aktiv==0 || ($aktiv==1 &&

ein separates file_exists() auf eine Datei, die dann erst einite Momemte später geöffnet wird, ist keine wirkliche Lösung. Zwischen die "Prüfung" und die Sperre passen mindestens drei Omnibusse

check_IP($REMOTE_ADDR)==0))) {
$fpv=fopen($vdatei,"r+");

spätestens hier muss die Datei auch exclusiv gesperrt werden

$fp=fopen($datei,"r+");
$zahl=fgets($fp,$stellen);
$zahl++;
rewind($fp);
flock($fp,2);

Das exclusive Sperren ist hier zu spät.
Benutze zum Sperren außerdem die Konstanten, die dafür vorgesehen sind

  • LOCK_EX
  • LOCK_SH
  • LOCK_UN  (was Du aber im Normalfall nie benötigst)

fputs($fp,$zahl,$stellen);
fputs($fpv,"var Counter = 'Besucher: 000".$zahl."';");
flock($fp,3);

Ein Unlock ist hier falsch, wenn Du nicht vorher ein fflush() durchgeführt hast!

fclose($fp);

Besser ist es, die Datei nur zu schließen.
Dadurch wird sie erst geflusht und dann geschlossen und die Sperre entfernt.

} else {
$fp=fopen($datei,"r");

Heru wäre dann aber ein LOCK_SH angebracht, nicht dass mitten im Auslesen die Datei beschrieben wird.

Ich bin mir zwar nicht sicher, wie PHP die Stream-Direktiven von POSIX umsetzt (insbesondere auf Windows, da muss das ja "frei übrsetzt" werden), aber besser ist es, ein sauberes Programm zu schreiben.

Anderenfalls würden die Streams die Atomarisierung der Lese- und der Schreibprozesse steuern.
Da Du nur zum Zwecke des Anzeigens auslesen willst, wäre es egal, ob sich sofort nach dem Auslesen der Datei der Inhalt ändert, eventuell sogar noch bevor Du ihn angezeigt hast.

Liebe Grüße aus Syburg bei Dortmund

Tom vom Berg

--
Nur selber lernen macht schlau
http://bergpost.annerschbarrich.de