W tym artykule postaram się opisać pełną interakcję systemem plików oraz serwerem, która jest niezbędna każdemu programiście PHP, który myśli poważnie o dobrym i poprawnym pisaniu swoich skryptów.
Na interakcje z systemem plików i serwerem składają się:
•
•
• funkcje katalogowe
• interakcja z plikami znajdującymi się na serwerze
• uruchamianie poleceń na serwerze
• stosowanie zmiennych środowiskowych serwera
Ponieważ dwa pierwsze zagadnienia zostały omówione już wcześniej w naszym serwisie, zalecam lekturę tych zagadnień, natomiast my zajmiemy się w tym artykule pozostałymi czteroma.
Funkcje katalogowe
Często w naszych skryptach potrzebne jest listowanie danego katalogu w celu np. wybrania odpowiadającej nam ikonki do newsa. Na początku katalog ten musimy najpierw otworzyć, do tego celu służy funkcja opendir(), która jako parametr pobiera ścieżkę do katalogu, a zwraca natomiast uchwyt katalogu, podobnie do funkcji fopen(), która zwraca uchwyt pliku.
Kiedy katalog zostanie już otwarty można pobrać nazwy plików poprzez wywołanie funkcji readdir(), która jako parametr pobiera uchwyt katalogu. Funkcja ta zwraca false jeśli wszystkie pliki zostaną odczytane. Funkcję readdir() możemy zatem umieścić w pętli, aby wylistować cały katalog. Po zakończeniu odczytu z katalogu należy go zamknąć za pomocą funkcji closedir(). Poniższy skrypt przedstawia listowanie przykładowego katalogu:
| <?php $opdir = opendir(„images/”); while($file = readdir($opdir)){ echo $file.” „; } closedir($opdir); ?> |
Jak pewnie zauważyliście wyświetliły się też dwa pliki: „.” i „..” nie są to w prawdzie pliki lecz katalogi. Aby ich nie wyświetlać należy w pętli umieścić odpowiedni warunek.
Język skryptowy PHP posiada funkcje, które „wycinają” fragmenty ścieżek dirname() – katalogową, basename() – plikową. Może to być w niektórych skryptach spore udogodnienie. W PHP znajdziemy też funkcję, które zwrócą nam ilość wolnego miejsca oraz ilość miejsca całkowitego. Obie funkcję zwracają liczbę w bajtach. A więc można obliczyć np. procent zajmowanego miejsca. Jeżeli chcesz zobaczyć jak napisać taki skrypt, zapraszam do
W PHP nie tylko jesteśmy skazani na „podziwianie” zawartości katalogów. Możemy także je tworzyć i usuwać. Rzeczą oczywistą jet, że możemy jedynie tworzyć i usuwać katalogi do których nasz skrypt ma dostęp.
W celu stworzenia nowego katalogu, należy użyć polecenia mkdir(), znanego pewnie niektórym z powłoki BASH. Funkcja mkdir() pobiera dwa parametry pierwszy to ścieżka bezwzględna zawierająca nazwę nowego katalogu oraz jako drugi uprawnienia tego katalogu, czyli tzw. chmod. Chmod podajemy w formie liczby ósemkowej czyli po prostu poprzedzamy uprawnienia zerem.
| <?php mkdir(„C:usrusersnowy_user”, 0777); ?> |
Pewnie niektórych zdziwi fakt, iż utworzony katalog nie ma wcale chmodu 777 tylko np. 755, spowodowane jest to wartością umask, czyli wartość jaką należy odjąć od podanych uprawnień, aby otrzymać uprawnienia końcowe. Możliwa jest zmiana parametru umask przed stworzeniem katalogu. Funkcja umask zmienia jego wartość na wpisany argument i zwraca starą wartość umask.
Aby usunąć katalog w PHP należy użyć funkcji rmdir(), która pobiera jako parametr ścieżkę bezwzględną do katalogu. Przy usuwaniu katalogu musi on być pusty!
| <?php rmdir(„C:\usrusernowy_user”); ?> |
Ciekawostką jest, że PHP nie umożliwia zmiany nazwy katalogu. Można to jednak wykonać w inny sposób. Opis tej czynności przedstawiam w tym .
Interakcja z plikami znajdującymi się na serwerze
PHP udostępnia wiele funkcji, dzięki którym możemy otrzymywać informację na temat plików na serwerze. Poniżej w tabelce przedstawię przydatne funkcję dotyczące otrzymywania informacji o plikach wraz z opisami.
| Nazwa funkcji | Opis |
| fileatime() | Zwraca znacznik czasu unixa ostatniego otwarcia pliku. |
| filemtime() | Zwraca znacznik czasu unixa ostatniej modyfikacji pliku. |
| fileowner() | Zwraca identyfikator użytkownika tego pliku, który może zostać później przetworzony. Opis poniżej tabelki |
| filegroup() | Zwraca identyfikator grupy tego pliku, który może zostać później przetworzony. Opis poniżej tabelki |
| fileperms() | Zwraca uprawnienia pliku w systemie dziesiętnym. |
| filetype() | Zwraca typ pliku. Możliwe wartości to: file, link, dir, unknown, block, char, fifo |
| filesize() | Zwraca wielkość pliku w bajtach. |
| is_dir() | Sprawdza czy plik jest katalogiem. |
| is_executable() | Sprawdza czy plik jest wykonywalny. |
| is_file() | Sprawdza czy plik jest plikiem |
| is_link() | Sprawdza czy plik jest linkiem/skrótem |
| is_readable() | Sprawdza czy plik jest do odczytu |
| is_writable() | Sprawdza czy plik jest do zapisu |
Teraz trochę wyjaśnień. Wszystkie funkcje opisane powyżej pobierają ścieżkę do pliku. Funkcje fileatime() i filemtime() zwracają znacznik czasu unixa, czyli liczbę sekund od 1 lipca 1970, możemy w funkcji date() ustawić format daty i jako drugi parametr podać właśnie znacznik czasu unixa. Przykładowy kod zwracający datę ostatniego otwarcia wygląda następująco:
| <?php echo date(„d-m-Y”, fileatime(„/home/costam/plik.tam”)); ?> |
Następne dwie funkcje zwracają odpowiednio identyfikator użytkownika pliku oraz identyfikator grupy pliku. Oba identyfikatory możemy przekonwertować za pomocą funkcji posix_getpwuid() i posix_getgrgid() odpowiednio dla użytkownika i grupy. Funkcje te zwracają tablicę asocjacyjną zawierające informację o użytkowniku i grupie w tym ich nazwy. Funkcje typu is_ zwracają true jeżeli plik jest danym typem, lub false jeżeli nie.
Oprócz zestawu funkcji przedstawionych powyżej istnieją funkcje, które zwracają tablicę tych danych. Przykładami takich funkcji są stat() i jej uboższa wersja lstat().
Funkcje sprawdzające właściwości pliku pożerają bardzo dużo pamięci podczas trwania tego procesu. Aby wyczyścić bufor pamięci podręcznej należy użyć funkcji clearstatcache(), która usunie poprzednie wyniki z pamięci.
Właściwości plików możemy także modyfikować. Funkcje te dotyczą przeważnie uprawnień.
Funkcje opisane poniżej są odpowiednikami funkcji z systemów Unixowych, zatem nie będą działały w systemach Windows. Funkcja chgrp() zmienia grupę pliku. Może być stosowana do zmiany grupy na grupę, której członkiem jest aktualny użytkownik. Opisana funkcja pobiera jako pierwszy argument ścieżkę do pliku, a jako drugi nazwę grupy.
Funkcja chmod() służy do zmiany uprawnień pliku. Pobiera ona ścieżkę do pliku oraz uprawnienia poprzedzone 0, aby wskazać, że posiadają one format ósemkowy.
Funkcja chown() jest stosowana w celu zmiany właściciela pliku. Może ona być wykorzystana wówczas, gdy skrypt posiada uprawnienia użytkownika root, co ze względu bezpieczeństwa nie powinno się nigdy zdarzyć.
Za pomocą PHP możemy zmienić czas ostatniej modyfikacji pliku. Służy do tego celu funkcja touch(), która pobiera jako pierwszy parametr ścieżkę do pliku. Natomiast drugi parametr jest opcjonalny, należy w nim podać znacznik czasu unixa ostatniej modyfikacji. Jeżeli nie podamy drugiego parametru, czas ostatniej modyfikacji zostanie zmieniony na aktualny. Natomiast jeśli plik nie istnieje to zostanie on utworzony.
Aby usunąć plik znajdujący się na serwerze należy użyć funkcji unlink(), która pobiera jako parametr ścieżkę do pliku. Trzeba wspomnieć, że funkcja o nazwie delete nie istnieje, co jest utrudnieniem dla młodych programistów. Aby skopiować plik należy użyć polecenia copy() gdzie jako pierwszy parametr podajemy ścieżkę źródłową, a jako drugi ścieżkę przeznaczenia.
Ciekawostką jest fakt, że funkcja rename() w niektórych systemach zamiast zmieniać nazwę pliku, również go kopiuje. Prototyp funkcji jest taki sam jak prototyp funkcji copy.
Uruchamianie poleceń na serwerze
Istnieją cztery sposoby uruchamiania poleceń na serwerze:
Pierwsza z nich to funkcja exec(), której jako podstawowy parametr przekazujemy polecenie systemowe. Na przykład poniższy kod spowoduje wylistowanie bieżącego katalogu.
| <?php exec(„ls –la”); ?> |
Drugim sposobem jest użycie funkcji passthru(), która zwraca bezpośrednio wynik do przeglądarki, jednak nie zwraca ona żadnej wartości. Parametry są identyczne jak w przypadku funkcji exec(). Trzecim sposobem jest użycie funkcji system(), zwraca ona wynik polecenia w przeglądarce. Parametry są identyczne jak w przypadku wcześniejszych funkcji.
Ostatnim sposobem jest użycie odwróconych apostrofów „ między które umieszczamy polecenia. Sposób ten nie wyświetla bezpośredniego wyniku. Wynik wykonania jest zwracany jako ciąg, który może zostać wyświetlony lub mogą być wykonywane na nim dowolne operacje. Jeżeli częścią polecenia mają być dane przekazane przez użytkownika, należy zabezpieczyć się przed zagrożeniami z tym idącymi. Funkcja escapeshellcmd(), uniemożliwia złośliwe wykonywanie poleceń w systemie. Funkcje należy wykonać w następujący sposób:
| <?php exec(escapeshellcmd(„polecenie użytkownika”)); ?> |
Interakcja ze środowiskiem
Zmienne środowiskowe inaczej zmienne serwera zwracają nam bardzo przydatne dane jak np: adres IP odwiedzającego, URL strony poprzedniej i wiele innych. Możemy do nich uzyskać dostęp za pomocą odwołania do specjalnej tablicy $_SERVER[] lub za pomocą polecenia getenv(); Na przykład, aby pobrać wspomniany adres IP należy użyć: $_SERVER[REMOTE_ADDR] lub getenv(„REMOTE_ADDR”);
Samo odczytywanie zmiennych środowiskowych jest już wielkim udogodnieniem, na pewno jeszcze większym jest fakt iż możemy je modyfikować. Służy do tego funkcja putenv();
W której podajemy jako parametr nazwe_zmiennej=wartość_zmiennej, np: putenv(„HOME=/home/krzasz”);
Tak dobrnęliśmy do końca tego obszernego tematu dotyczącego interakcji z systemem plików i serwerem. Jeżeli czegoś nie zrozumiałeś zadaj pytanie na naszym . Życzę powodzenia w pracy z plikami.
