206 PHP i MySQL dla każdego
Aktualna pozycja w pliku może zostać zmieniona za pomocą funkcji fseek. Jej schematyczne wywołanie ma postać: fseek(deskryptor. i le[. skąd])
gdzie deskryptor to deskryptor pliku zwrócony przez funkcję fopen, i le określa liczbę bajtów przesunięcia, natomiast skąd — pozycję, od której nastąpi przesunięcie. Parametr skąd jest opcjonalny i został wprowadzony w PHP4 (wersja 4.0.0). Może on przyjmować następujące wartości:
♦ SEEK_SET — oznaczająca przesunięcie względem początku pliku,
♦ SEEK_CUR — oznaczająca przesunięcie względem pozycji bieżącej,
♦ SEEK_END — oznaczająca przesunięcie względem końca pliku.
Jeżeli parametr skąd nie zostanie podany, funkcja zachowa się tak, jakby miał on wartość SEEK_SET. Przykładowo, jeśli zmienna fd zawiera deskryptor pliku zwrócony przez metodę fopen, to wywołanie:
♦ fseek ($fd. 0) — ustawi wskaźnik na początku pliku,
♦ fseek($fd. 0. SEEK_SET) — ustawi wskaźnik na początku pliku,
♦ fseek($fd. 0. SEEK_END)—ustawi wskaźnik na końcu pliku,
♦ fseek($fd. 20. SEEK_SET)—ustawi wskaźnik na 20 bajcie pliku,
♦ fseek($fd. -10, SEEK_CURR) — ustawi wskaźnik na 10 bajcie przed aktualną pozycją w pliku,
♦ fseek($fd, 10. SEEK_CURR) — ustawi wskaźnik na 10 bajcie za aktualną pozycją w pliku,
♦ fseek($fd, -10. SEEK_END)—ustawi wskaźnik na 10 bajcie przed końcem pliku.
Funkcja fseek zwraca wartość 0, jeżeli jej wywołanie zakończyło się sukcesem, lub wartość 1 — w przeciwnym wypadku.
Ostatnia z omawianych funkcji — rewind — przesuwa wskaźnik pozycji w pliku na pozycję 0, czyli na początek pliku. Jej wywołanie ma zatem takie samo znaczenie, jak wywołanie fseek($fd. 0. SEEK_SET). Funkcja rewind przyjmuje tylko jeden argument, którym jest deskryptor pliku, i zwraca wartość true, jeżeli jej wywołanie zakończyło się sukcesem, lub wartość fal se, jeżeli ustawienie wskaźnika nie powiodło się.
Przechowywanie danych w plikach może przysporzyć nam wielu problemów, o ile nie zadbamy o prawidłową synchronizację dostępu. Co się bowiem stanie, jeśli naszą witrynę odwiedzi jednocześnie kilka osób i wszystkie wywołają skrypt operujący na danych zapisanych w jednym z plików? Rezultat niestety będzie całkowicie nieprzewidywalny. Dane mogą zostać zapisane poprawnie, ale również mogą zostać utracone lub przemieszane ze sobą. Nie będzie to miało tak wielkiego znaczenia, kiedy skrypt obsługuje jedynie licznik odwołań do strony (najwyżej zgubimy część odwołań), jednak