YGREG.COM - Kurs PHP - Część 4 

29.07.2004
Nowa oferta hostingowa.

29.07.2004
Kurs XPath.

13.10.2002
Poprawiony problem z oznaczaniem przeczytanych wiadomości na forum.

13.06.2002
PHP z Zend Engine 2 już dostępne!

17.02.2002
Zmiany w organizacji serwisu.








Początek strony

(C)opyright 1997-2007
by Grzegorz Plebański
INDEX I ARTYKUŁY I SKRYPTY I DOWNLOAD

Dodaj stronę
do ulubionych

Artykuły i kursy
   PHP
   XML
   CGI
   HTML
   Inne

Skrypty PHP
   Komunikacja
   Księgi gości
   Statystyki
   Głosowania
   Bannery
   Inne
Skrypty CGI

Download



Kurs PHP - Część 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.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:

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


Grzegorz 'Ygreg' Plebański
ygreg@ygreg.com
http://www.ygreg.com