Kurs PHP #4
Uprawnienia
Aby 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.serwera/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.
Je┐eli okre╢lony rodzaj dostΩpu nie mo┐e byµ w danej chwili uzyskany,
wykonanie skryptu zostanie wstrzymane do czasu, gdy bΩdzie to mo┐liwe. Plik
powinien byµ blokowany na jak najkr≤tszy czas, aby nie wstrzymywaµ
niepotrzebnie innych operacji. Je┐eli chcemy tylko sprawdziµ, czy plik jest
zablokowany, do argumentu mode nale┐y dodaµ 4 - wtedy funkcja zwr≤ci warto╢µ
TRUE je┐eli plik nie jest zablokowany, lub FALSE gdy jest.
Przyk│ad:
$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.
Kurs
pochodzi z serwisu YGREG http://ygreg.and.pl
_________________________ 46 _________________________
:: Poprzednia strona :: WstΩp :: NastΩpna strona ::
|