Kurs PHP - Część IV
Uprawnienia
by skrypt PHP mógł odwołać się do pliku, musi mieć odpowiednie uprawnienia.
Szczegóły są zależne od serwera. Najczęściej chyba skrypt ma uprawnienia
takie, jak użytkownik który go umieścił. Może też mieć uprawnienia
użytkownika nobody - wtedy żeby móc ze skryptu zmodyfikować jakiś
plik, trzeba nadać prawo zapisu wszystkim użytkownikom. Dokładne
inforacje na ten temat powinien dostarczyć administrator serwera
na którym umieszczamy skrypty.
Otwieranie plików
Przed wykonaniem jakiejkolwiek operacji na pliku, należy go otworzyć.
Służy do tego funkcja fopen. Pobiera ona 2 argumenty: pierwszy to
nazwa pliku który chcemy otworzyć. Drugi parametr może mieć następujące
wartości:
- r - otwiera plik do odczytu
- r+ - otwiera plik do odczytu i zapisu
- w - kasuje zawartość pliku i otwiera go do zapisu
- w+ - kasuje zawartość pliku i otwiera go do zapisu i odczytu
- a - otwiera plik do dopisywania
- a+ - otwiera plik do dopisywania i odczytu
Co ciekawe, funkcja fopen może otworzyć plik na innym serwerze przez
protokół http (tylko odczyt), lub ftp (odczyt lub zapis, ale nie
jednocześnie). fopen zwraca liczbę, która służy do identyfikowania
otwartego pliku. Przykład:
$file=fopen("file.txt", "r");
// otwiera plik file.txt do odczytu
$file=fopen("file.txt", "w");
/* otwiera plik do zapisu. Jeżeli
plik nie istnieje, zostanie utworzony */
$file=fopen("ftp://adres.pl/plik", "r");
// otwiera plik przez protokół ftp
|
Po zakończeniu operacji na pliku, należy go zamknąć funkcją fclose,
np:
$file=fopen("file.txt", "r");
fclose($file);
|
Odczyt z pliku
Jest kilka funkcji służących do odczytu z pliku. Zacznę może od funkcji
fgetc - odczytuje ona 1 znak z pliku:
Jeśli funkcja napotka koniec pliku, zwróci wartość FALSE. Po odczytaniu
znaku, pozycja w pliku jest przesuwana o 1 do przodu. Dzięki temu,
po kolejnym wywołaniu funkcji getc otrzymamy kolejny znak, a nie
jeszcze raz ten sam.
Kolejną funkcją jest funkcja fgets:
|
$linia=fgets($file, $maxLen);
|
Drugi parametr określa ile znaków funkcja może odczytać. Trzecią funkcją
do odczytu z pliku jest fread. Działa ona podobnie do fgets, z tym
że nie przerywa czytania gdy natrafi na znak nowej lini.
Zapis do pliku
Do zapisywania w pliku służy funkcja fwrite:
|
fwrite($file, $tekst, $maxLen);
|
Funkcja ta zapisuje tekst podany jako 2 parametr do pliku identyfikowanego
przez $file. 3 parametr jest opcjonalny i określa maksymalną długość
tekstu, jaka może zostać zapisana. Jest jeszcze funkcja fputs, ale
działa ona dokładnie tak samo. W PHP często występują identyczne
funkcje pod innymi nazwami - ułatwia to życie osobom przyzwyczajonym
do innych języków.
Blokowanie plików
Jak dotąd wszystko wydaje się proste. Co jednak stanie się, jeżeli
jednocześnie zostaną uruchomione dwie kopie skryptu, i obie będą
próbowały zmienić ten sam plik? Sytuacja taka jak łatwo się domyślić,
może miec przykre konsekwencje. Aby rozwiązać ten problem należy
użyć blokowania plików. Służy do tego funkcja flock:
Pierwszy argument funkcji flock to identyfikator otwartego pliku.
Argument mode określa typ dostępu, jaki chcemy uzyskać. Może mieć
następujące wartości:
- 1 - dostęp do odczytu
- 2 - dostęp do zapisu
- 3 - zwolnienie blokady
Jeżeli chcemy uzyskać dostęp do zapisu, najpierw wszystkie inne blokady
muszą być zwolnione. Do uzyskania dostępu do odczytu wystarczy, ze
plik nie będzie zablokowany do zapisu - w ten sposób wiele skryptów
może jednocześnie czytać z pliku, ale tylko jeden może do niego zapisywać.
Dodatkowo w trakcie zapisu żaden inny skrypt nie może odczytywać
z pliku - dzięki temu nie natrafi na niekompletne dane.
$file1=fopen("jakis.plik", "r");
// otwiera 2 razy ten sam plik
$file2=fopen("jakis.plik", "r");
flock($file1, 2);
// blokuje pierwszą kopie
if(flock($file2, 6))
/* funkcja flock zwróci false,
ponieważ plik jest już zablokowany */
{
echo("Plik nie zablokowany");
}else{
echo("Plik zablokowany");
}
flock($file, 3); /* odblokowuje plik */
|
Inne funkcje
PHP zawiera wiele funkcji służących do obsługi plików. Oto niektóre
z nich:
- file_exists(nazwa) - sprawdza, czy istnieje plik o podanej nazwie
- filegroup(nazwa) - zwraca identyfikator grupy, do której należy plik
- fileowner(nazwa) - zwraca identyfikator właściciela pliku
- filesize(nazwa) - zwraca rozmiar pliku o podanej nazwie
- ftell($file) - zwraca pozycję w otwartym pliku
- is_readable(nazwa) - sprawdza, czy skrypt ma uprawnienia do odczytania pliku
- is_writeable(nazwa) - sprawdza, czy skrypt może zapisać do pliku
- mkdir(nazwa) - tworzy katalog o podanej nazwie
- readfile(nazwa) - wyświetla zawartość pliku
Prosty licznik tekstowy
Licznik tekstowy posłuży jako praktyczny przykład wykorzystania dostępu
do plików:
if(file_exists("counter.n"))
// sprawdza, czy plik istnieje
{
$file=fopen("counter.n", "r");
// otwiera plik
flock($file, 1);
// blokuje plik
$ile=fgets($file, 100);
// odczytuje wartość
flock($file, 3); // odblokowuje plik
fclose($file); // zamyka plik
$ile++; // zwiększa wartość o 1
}
else
$ile=1; /* jeśli plik nie istnieje,
wyświetli się 1 */
$file=fopen("counter.n", "w");
// otwiera plik do zapisu
flock($file, 2); // blokuje do zapisu
fwrite($file, $ile); // zapisuje wartość
flock($file, 3); // odblokowuje plik
fclose($file); // zamyka plik
echo($ile); // wyświetla wartość
|
Ten skrypt odczytuje z pliku wartość, zwiększa ją o 1, a następnie
wyświetla na stronie. Jeżeli plik counter.n nie istnieje, skrypt
spróbuje go utworzyć. Ten licznik zwiększy się za każdym razem gry
użytkownik wejdzie na stronę, lub ją odświeży. Licznik odporny na
odświeżanie pokaże w części 5.
|