====== 1.10.6) Beispiel: Besucherzähler ====== Eine häufige Anwendung in Verbindung mit Dateizugriffen ist die Einbettung eines Counters (Zugriffszählers) in eine Webseite. Ein Counter zählt die Anzahl der Webseiten-Zugriffe. Dabei wird bei jedem Zugriff die Zahl der bisherigen Besucher um eins erhöht. Das heißt, es wird auf eine bestehende Datei zugegriffen und mit ihrem Inhalt gerechnet. Das Ergebnis der Berechnung überschreibt dann den Inhalt der Datei. /** **Beispiel: counter.php** Herzlich willkommen Sie sind Besucher: " . ++$count . ""; // aktuellen Zähler erhöhen und ausgeben fwrite($datei, $count); fclose($datei); } else {echo "Datei ist gesperrt"; } } ?> **/ Hinweise zum Beispiel: * In den HTML-Text wird die Funktion ''counter()'' zur Anzeige der Besucherzahl eingebunden. * Die Funktion ''counter()'' wird angelegt. * Der Name der Datei, in der die Anzahl der Besucher abgelegt werden soll, lautet //counter.txt// und wird der Variablen $name zugewiesen. Die Variable $count erhält den Ausgangswert 0. * Die Datei //counter.txt// wird über die Funktion fopen() zum Lesen und Schreiben geöffnet. Der Zugriff auf diese Datei erfolgt über den Dateizeiger $datei. Der Dateizeiger wird mit dem Modus ''r+'' an den Anfang der Datei gesetzt. War der Zugriff auf die Datei nicht erfolgreich, wird das Skript mit einer Meldung verlassen. * Damit während der Arbeit mit der Datei kein weiterer Zugriff und somit ein gleichzeitiges Überschreiben der Daten möglich ist, wird die Datei exklusiv (''LOCK_EX'') gesperrt. ''LOCK_EX'' steht für eine exklusive, nur schreibende Verriegelung einer Datei (vgl. folgenden Abschnitt). * Mit ''fgets()'' werden die ersten 10 Zeichen der Datei ausgelesen. Der Wert 10 wurde gewählt, da hiermit ein Zählen der Besucherzahl mit 10 Stellen (bis 9999999999) gewährleistet ist. * Damit der neue Wert den alten Wert in der Datei überschreiben kann, wird der Dateizeiger mittels ''fseek()'' und der Angabe 0 an den Anfang der Datei gesetzt. * Nach dem Einlesen des Wertes wird er um eins erhöht und am Bildschirm fett formatiert ausgegeben. Über die Funktion ''fwrite()'' wird der neue Wert $count in die Datei geschrieben. * ''fclose()'' schließt die Datei //counter.txt// und beendet zugleich die Zugriffssperre, die über ''flock()'' veranlasst wurde. {{:inf:inf7b_201011:php:php5-s73.jpg?400|Ausgabe der Beispieldatei "counter.php"}} Mit dem Befehl ''flock()'' können Sie eine Datei in der Zeit, in der das Skript in eine Datei schreibt, zusätzlich für weitere Zugriffe sperren. **Syntax und Bedeutung der flock()-Anweisung** flock (Dateizeiger,Modus); * ''flock()'' sperrt den Zugriff auf die Datei, auf die der Parameter Dateizeiger verweist. Der Modus ermöglicht verschiedene Sperrzustände der Datei. * Darf während Ihres Zugriffs die Datei von anderen nur gelesen werden, setzen Sie den Modus auf ''LOCK_SH'' (Shared Lock, Lesezugriff). Soll kein anderer Nutzer zeitgleich die Datei nutzen dürfen, setzen Sie die Option ''LOCK_EX'' (Exclusive Lock), ''flock()'' wartet, bis die Datei wie angegeben benutzt werden kann. Geben Sie locknb (No Block) an, kehrt die Funktion mit dem Wert ''FALSE'' zurück, wenn die Datei bereits von einem anderen Programm gesperrt ist. Möchten Sie die Verriegelung wieder freigeben, geben Sie ''LOCK_UN'' (Unlock) an. * Die Funktion liefert bei Erfolg den Wert ''TRUE'' zurück bzw. ''FALSE'', wenn ein Fehler auftrat. Ob die Zugriffssicherung funktioniert, erfahren Sie, indem Sie den Rückgabewert überprüfen. * Die Sperre wird über die Funktion ''fclose()'' oder am Ende des Skripts automatisch aufgehoben. * Bei manchen Betriebssystemen ist die Funktion ''flock()'' auf Prozess-Ebene (Teil einer Applikation) implementiert. Hierbei können Sie sich nicht auf ''flock()'' verlassen, um Dateien vor dem Zugriff von anderen PHP-Skripten zu schützen. Zudem wird ''flock()'' nicht von allen Dateisystemen unterstützt und gibt deshalb in solchen Umgebungen immer ''FALSE'' zurück. ====== Den Dateizeiger mit ''fseek()'' an eine bestimmte Position setzen ====== Im vorher gezeigten Beispiel ist es notwendig, den Dateizeiger an den Anfang der Datei zu setzen, um den alten Wert des Zählers mit dem neuen Wert überschreiben zu können. Den Dateizeiger können Sie über ''fseek()'' positionieren. fseek (Dateizeiger,Stelle[,Wie]); * Hierbei geben Sie für den Parameter Stelle die Anzahl in Bytes, bezogen auf den Dateianfang, der durch den Dateizeiger festgelegt wird, an. * Der optionale Parameter ''[,Wie]'' legt bestimmte Bezugspunkte für die Ermittlung der Position fest: * Der Parameter ''SEEK_CUR'' ermöglicht die Verschiebung von der aktuellen Position des Dateizeigers plus Stelle, ''SEEK_END'' vom Dateiende und ''SEEK_SET'' vom Dateianfang. * Fehlt der Parameter Wie, ist standardmäßig die Option ''SEEK_SET'' gewählt.