:: Redakcyjne :: Klasyka & Emulacja :: Komputery & Internet :: Inne :: W sieci :: MS on-line ::



Komputery & Internet



      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:

   $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 5.


Kurs pochodzi z serwisu YGREG http://ygreg.and.pl

_________________________ 46 _________________________

:: Poprzednia strona :: WstΩp :: NastΩpna strona ::



     

Prenumerata

Adres e-mail:





Kontakt

redaktor naczelny
macland@topnet.pl

z-ca red. nacz.
bosss@box43.gnet.pl


Zalecana konfiguracja

- Windows
- IE 4.0 +
- 800 x 600
- High Color (16 bit)















































































































































































































































Copyright(C)'2001 Memories Service
Wszystkie prawa zastrze┐one!