autor: Grzegorz Plebañski
Krótki kurs jêzyka PHP.
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:
$znak=getc($file);
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:
flock($file, mode);
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 4.
(C)opyright 1999-2000 by Grzegorz Plebañski
ygreg@and.pl
http://ygreg.and.pl
|