You are on page 1of 24

PHP.

Praktyczne skrypty,
ktre oszczdz Twj czas
Autor: William Steinmetz, Brian Ward
Tumaczenie: Mikoaj Szczepaniak
ISBN: 978-83-246-1851-4
Tytu oryginau: Wicked Cool PHP: Real-World Scripts
That Make Difficult Things Possible
Format: 80x235, stron: 248

Obszerny zbir przydatnych skryptw! Musisz go mie!


Jak skonfigurowa rodowisko PHP?
Jak tworzy bezpieczne skrypty PHP?
Jakie skrypty musisz zna?
PHP jest atwym w uyciu jzykiem skryptowym. atwym, a przez to niezwykle popularnym.
Jednak, czy kto mwi, e w atwym jzyku nie mona napotka na skomplikowane
problemy? Niestety odpowiedz brzmi nie. Jednak nie zaamuj rk! Dziki swej popularnoci,
w sieci istnieje niezliczona liczba stron zawierajcych informacje, ktre mog by przydatne
w rozwizywaniu Twoich problemw.
Ale po co szuka pereek wrd masy kiepskich rozwiza? Czy nie lepiej sign po
ksik, ktra zawieraaby rozwizania najczstszych zada? Oczywicie, e tak. Wanie
tak ksik trzymasz przed sob! Ksika ta zawiera blisko 80 skryptw pozwalajcych
na rozwizanie najrniejszych zada, poczwszy od formatowania dat i cigw znakw,
skoczywszy na skryptach wykorzystujcych poczt elektroniczn. Dziki tej ksice dowiesz
si midzy innymi, jak tworzy bezpieczne skrypty oraz pracowa z formularzami. Dodatkowo
poznasz sposoby konfiguracji samego PHP. Dziki ksice Praktyczne skrypty, ktre
oszczdz Twj czas twoje skrypty bd lepsze, a Ty zyskasz wicej wolnego czasu!
Zestaw skryptw, ktre musi zna kady programista
Tworzenie szablonw Smarty
Konfigurowanie rodowiska PHP
Przegld wszystkich ustawie PHP
Zastosowanie pakietu SafeHTML
Zapobieganie atakom XSS
Zapewnienie bezpieczestwa w skryptach PHP
Generowanie losowych hase
Praca z formularzami
Weryfikacja danych z formularza
Weryfikacja kart kredytowych
Operacje wykonywane na datach
Praca z tekstem oraz kodem HTML
Wykorzystanie plikw w codziennej pracy
Monitorowanie sesji uytkownika
Mechanizm logowania do aplikacji
Tworzenie obrazw CAPTCHA
Operowanie danymi w formacie XML
Operowanie grafik
Nie tra czasu na poszukiwanie dobrych rozwiza! Miej je pod rk!

Spis treci
WPROWADZENIE ....................................................................................... 9
1.
NAJCZCIEJ ZADAWANE YCIOWE PYTANIA SKRYPTY,
KTRE KADY PROGRAMISTA PHP CHCE (MUSI) ZNA ...................... 11
Skrypt nr 1: Doczenie innego pliku w formie czci danego skryptu ..................................12
Co moe pj nie po naszej myli? ...................................................................................13
Skrypt nr 2: Naprzemienne kolorowanie wierszy tabeli ........................................................15
Doskonalenie tego skryptu ................................................................................................16
Skrypt nr 3: Tworzenie czy Poprzednia/Nastpna ..............................................................18
Stosowanie tego skryptu ....................................................................................................21
Skrypt nr 4: Wywietlanie zawartoci tablicy .........................................................................22
Skrypt nr 5: Przeksztacanie tablicy w zmienn .....................................................................23
nietablicow z moliwoci przywrcenia oryginalnej struktury ...........................................24
Co moe pj nie po naszej myli? ...................................................................................24
Skrypt nr 6: Sortowanie tablic wielowymiarowych ................................................................25
Doskonalenie tego skryptu ................................................................................................26
Skrypt nr 7: Tworzenie dla witryny internetowej szablonw Smarty ....................................26
Instalacja biblioteki Smarty .................................................................................................27
Krtki podrcznik Smarty ..................................................................................................28
Co moe pj nie po naszej myli? ...................................................................................29
Doskonalenie tego skryptu ................................................................................................30
2.
KONFIGUROWANIE PHP ......................................................................... 31
Ustawienia konfiguracyjne i plik php.ini .................................................................................31
Lokalizowanie pliku php.ini ................................................................................................32
Skrypt nr 8: Odkrywanie wszystkich ustawie PHP ..............................................................33
Skrypt nr 9: Odczytywanie poszczeglnych ustawie ........................................................33
Skrypt nr 10: Raportowanie o bdach ...................................................................................35
Typowe komunikaty o bdach ..........................................................................................35

Skrypt nr 11: Ukrywanie wszystkich komunikatw o bdach .............................................. 37


Skrypt nr 12: Wyduanie czasu wykonywania skryptu ......................................................... 38
Co moe pj nie po naszej myli? ................................................................................... 38
Skrypt nr 13: Uniemoliwianie uytkownikom wysyania wielkich plikw ........................... 38
Skrypt nr 14: Wyczanie rejestrowanych zmiennych globalnych ......................................... 39
Skrypt nr 15: Wczanie magicznych cudzysoww ........................................................... 39
Co moe pj nie po naszej myli? ................................................................................... 40
Skrypt nr 16: Ograniczanie dostpu PHP do plikw ......................................................... 40
Co moe pj nie po naszej myli? ................................................................................... 41
Skrypt nr 17: Wyczanie obsugi okrelonych funkcji ........................................................... 41
Skrypt nr 18: Dodawanie rozszerze do PHP ....................................................................... 41
Dodawanie rozszerze jzyka PHP ................................................................................... 43
Instalacja rozszerze za pomoc internetowego panelu sterowania ................................. 44
Co moe pj nie po naszej myli? ................................................................................... 48
3.
BEZPIECZESTWO W PHP ....................................................................... 49
Ustawienia konfiguracyjne zalecane z uwagi na bezpieczestwo .......................................... 51
Skrypt nr 19: Wstrzykiwanie kodu jzyka SQL ..................................................................... 52
Skrypt nr 20: Zapobieganie prostym atakom typu XSS ......................................................... 54
Skrypt nr 21: Stosowanie pakietu SafeHTML ........................................................................ 56
Co moe pj nie po naszej myli? ................................................................................... 57
Skrypt nr 22: Ochrona danych za pomoc jednokierunkowej funkcji generujcej skrty ..... 58
Doskonalenie tego skryptu ................................................................................................ 59
Skrypt nr 23: Szyfrowanie danych za pomoc rozszerzenia Mcrypt ..................................... 60
Doskonalenie tego skryptu ................................................................................................ 62
Skrypt nr 24: Generowanie hase losowych .......................................................................... 62
Stosowanie tego skryptu ................................................................................................... 63
4.
PRACA Z FORMULARZAMI ..................................................................... 65
rodki bezpieczestwa: formularze nie s godne zaufania .................................................... 65
Strategie weryfikacji .............................................................................................................. 66
Stosowanie zmiennych $_POST, $_GET, $_REQUEST
oraz $_FILES do uzyskiwania dostpu do danych formularza ............................................... 67
Skrypt nr 25: Spjne i bezpieczne uzyskiwanie zmiennych formularza ................................. 67
Skrypt nr 26: Usuwanie zbdnych znakw biaych .................................................................... 68
Skrypt nr 27: Importowanie zmiennych formularza do tablicy ............................................. 69
Skrypt nr 28: Sprawdzanie, czy odpowied
naley do zbioru prawidowych wartoci ......... 72
Doskonalenie tego skryptu ................................................................................................ 73
Skrypt nr 29: Stosowanie wielu przyciskw akceptacji formularza ....................................... 74
Skrypt nr 30: Weryfikacja kart kredytowych ......................................................................... 74
Stosowanie tego skryptu ................................................................................................... 77
Doskonalenie tego skryptu ................................................................................................ 77

Spis treci

Skrypt nr 31: Podwjne sprawdzanie daty wyganicia wanoci karty kredytowej .............77
Stosowanie tego skryptu ....................................................................................................79
Skrypt nr 32: Sprawdzanie poprawnoci adresw poczty elektronicznej ..............................79
Skrypt nr 33: Sprawdzanie poprawnoci numerw telefonu .................................................80
5.
PRACA Z TEKSTEM I KODEM JZYKA HTML .......................................... 83
Skrypt nr 34: Wyodrbnianie fragmentu acucha ....................................................................83
Doskonalenie tego skryptu ................................................................................................86
Skrypt nr 35: Zmiana liter acucha na wielkie,
mae lub wielkie litery na pocztku wyrazw ........................................................................86
Co moe pj nie po naszej myli? ...................................................................................87
Skrypt nr 36: Odnajdywanie podacuchw ..........................................................................88
Co moe pj nie po naszej myli? ...................................................................................89
Skrypt nr 37: Zastpowanie podacuchw ...........................................................................89
Co moe pj nie po naszej myli? ...................................................................................90
Skrypt nr 38: Odnajdywanie i poprawianie literwek za pomoc moduu pspell ..................91
Praca ze sownikiem domylnym .......................................................................................91
Dodawanie sownika niestandardowego do biblioteki pspell .............................................94
Co moe pj nie po naszej myli? ...................................................................................95
Skrypt nr 39: Wyraenia regularne ........................................................................................96
Podstawy wyrae regularnych .........................................................................................96
Sekwencje znakw specjalnych ..........................................................................................97
Repetytory wzorcw .........................................................................................................98
Grupowanie .......................................................................................................................99
Klasy znakw ......................................................................................................................99
Poczenie wszystkich omwionych elementw ...............................................................99
Dopasowywanie i wyodrbnianie tekstu za pomoc wyrae regularnych .....................100
Zastpowanie podacuchw za pomoc wyrae regularnych ......................................102
Skrypt nr 40: Przebudowa tabeli jzyka HTML ...................................................................103
Skrypt nr 41: Tworzenie screen scrapera ............................................................................104
Doskonalenie tego skryptu ..............................................................................................106
Skrypt nr 42: Konwersja zwykego tekstu na prawidowy kod jzyka HTML .....................106
Skrypt nr 43: Automatyczna konwersja adresw URL na hipercza ..................................109
Skrypt nr 44: Usuwanie znacznikw jzyka HTML z acuchw .........................................110
6.
PRACA Z DATAMI ................................................................................. 113
Jak liczony jest czas w systemie UNIX .................................................................................113
Skrypt nr 45: Uzyskiwanie biecego znacznika czasowego ................................................114
Skrypt nr 46: Uzyskiwanie znacznika czasowego dla daty z przeszoci lub w przyszoci .....115
Tworzenie znacznikw czasowych na podstawie acucha .............................................115
Tworzenie znacznikw czasowych na podstawie wartoci dat .......................................117
Skrypt nr 47: Formatowanie daty i godziny .........................................................................118
Skrypt nr 48: Wyznaczanie dnia tygodnia na podstawie danej daty .....................................121

Spis treci

Skrypt nr 49: Odnajdywanie rnic dzielcych dwie daty ................................................... 121


Stosowanie tego skryptu ................................................................................................. 123
Doskonalenie tego skryptu .............................................................................................. 123
Formaty dat systemu MySQL .............................................................................................. 123
7.
PRACA Z PLIKAMI ................................................................................ 125
Uprawnienia dostpu do plikw ......................................................................................... 125
Uprawnienia ustawiane za porednictwem programu FTP ............................................ 127
Wiersz polece ................................................................................................................ 127
Co moe pj nie po naszej myli? ................................................................................. 127
Skrypt nr 50: Umieszczanie zawartoci pliku w zmiennej ................................................... 128
Doskonalenie tego skryptu .............................................................................................. 130
Co moe pj nie po naszej myli? ................................................................................. 131
Skrypt nr 51: Tworzenie plikw i zapisywanie danych w plikach ....................................... 131
Skrypt nr 52: Sprawdzanie, czy interesujcy nas plik istnieje .............................................. 132
Skrypt nr 53: Usuwanie plikw ........................................................................................... 133
Skrypt nr 54: Wysyanie obrazw do katalogu .................................................................... 133
Stosowanie tego skryptu ................................................................................................. 138
Co moe pj nie po naszej myli? ................................................................................. 138
Doskonalenie tego skryptu .............................................................................................. 138
Skrypt nr 55: Odczytywanie plikw z danymi oddzielonymi przecinkami .......................... 138
8.
LEDZENIE UYTKOWNIKA I SESJI ...................................................... 141
ledzenie danych uytkownika z wykorzystaniem ciasteczek i sesji ................................... 142
Ciasteczka ........................................................................................................................ 142
Sesje ................................................................................................................................. 143
Skrypt nr 56: Tworzenie komunikatu
Witaj ponownie, nazwa_uytkownika! z wykorzystaniem ciasteczek .................................. 144
Co moe pj nie po naszej myli? ................................................................................. 145
Skrypt nr 57: Wykorzystywanie sesji do tymczasowego skadowania danych .................... 146
Co moe pj nie po naszej myli? ................................................................................. 148
Skrypt nr 58: Sprawdzanie, czy przegldarka internetowa uytkownika obsuguje ciasteczka .....148
Skrypt nr 59: Przekierowywanie uytkownikw na inne strony ......................................... 150
Skrypt nr 60: Wymuszanie na uytkownikach
stosowania stron szyfrowanych za pomoc SSL .................................................................. 151
Skrypt nr 61: Uzyskiwanie informacji o kliencie .................................................................. 151
Skrypt nr 62: Limity czasowe sesji ....................................................................................... 156
Skrypt nr 63: Prosty system logowania ............................................................................... 158
9.
PRACA Z POCZT ELEKTRONICZN ................................................... 161
Skrypt nr 64: Wysyanie wiadomoci poczty elektronicznej
z wykorzystaniem pakietu PHPMailer ................................................................................. 162

Spis treci

Instalacja pakietu PHPMailer ............................................................................................162


Stosowanie tego skryptu ..................................................................................................164
Dodawanie zacznikw ...................................................................................................165
Co moe pj nie po naszej myli ..................................................................................166
Skrypt nr 65: Wykorzystywanie wiadomoci poczty elektronicznej
do weryfikacji kont uytkownikw ......................................................................................167
10.
PRACA Z OBRAZAMI ............................................................................ 173
Skrypt nr 66: Tworzenie obrazw CAPTCHA zabezpieczajcych system ..........................173
Skrypt nr 67: Tworzenie miniaturek obrazw .....................................................................181
11.
STOSOWANIE BIBLIOTEKI CURL
DO INTERAKCJI Z INNYMI US UGAMI SIECIOWYMI ............................ 187
Skrypt nr 68: Nawizywanie poczenia z innymi witrynami internetowymi .......................188
Skrypt nr 69: Stosowanie ciasteczek ....................................................................................191
Skrypt nr 70: Transformacja danych w formacie XML na bardziej czyteln form .............192
Skrypt nr 71: Korzystanie z geograficznych usug sieciowych ..............................................194
Skrypt nr 72: Uzyskiwanie danych z witryny Amazon.com
za porednictwem skryptu PHP i protokou SOAP .............................................................198
Skrypt nr 73: Budowanie usugi sieciowej ............................................................................200
12.
PRZYK ADY BARDZIEJ Z OONYCH PROJEKTW .............................. 205
Skrypt nr 74: Internetowe gosowanie .................................................................................206
Tworzenie formularza z kart do gosowania ..................................................................207
Przetwarzanie karty do gosowania .................................................................................209
Uzyskiwanie wynikw gosowania ...................................................................................211
Doskonalenie tego skryptu ..............................................................................................213
Skrypt nr 75: Elektroniczne kartki z pozdrowieniami ..........................................................214
Wybr kartki ....................................................................................................................216
Wysyanie kartki elektronicznej .......................................................................................218
Wywietlanie kartki ..........................................................................................................221
Doskonalenie tego skryptu ..............................................................................................224
Skrypt nr 76: System blogu ..................................................................................................225
Tworzenie wpisw na blogu ............................................................................................226
Wywietlanie wpisu na blogu ...........................................................................................228
Dodawanie komentarzy ...................................................................................................232
Tworzenie indeksu blogu .................................................................................................233
Doskonalenie tego skryptu ..............................................................................................236
DODATEK .............................................................................................. 239
SKOROWIDZ .......................................................................................... 241

Spis treci

2
Konfigurowanie PHP
JAK

KA DY PAKIET OPROGRAMOWANIA, TAK I PHP OFERUJE


WIELE OPCJI KONFIGURACYJNYCH, KTRE W TEN CZY INNY
SPOSB WPYWAJ
NA SPOSB JEGO FUNKCJONOWANIA.

Wikszo tych opcji nie ma istotnego znaczenia, ale o kilku


najwaniejszych opcjach kady programista PHP z pewnoci
powinien wiedzie .
Co wicej, istnieje wiele dodatkw do PHP (okrelanych
mianem bibliotek) uzupeniajcych t technologi o nowe moliwoci. Na przykad rozszerzenie cURL umoliwia serwerowi wysyanie danych formularzy do innych serwerw i przetwarzanie odsyanych odpowiedzi. Inne przydatne rozszerzenie, Mcrypt, umoliwia nam atwe i skuteczne szyfrowanie danych celem
bezpiecznego skadowania poufnych informacji.
W tym rozdziale zajmiemy si ustawieniami konfiguracyjnymi najczciej wykorzystywanymi przez programistw PHP oraz sytuacjami, w ktrych stosowanie tych
ustawie jest uzasadnione.

Ustawienia konfiguracyjne i plik php.ini


Wikszo pocztkujcych programistw traktuje ustawienia domylne PHP, jakby
byli niemiaymi lokatorami wprowadzajcymi si do ekskluzywnego apartamentu
obawiaj si cokolwiek zmieni w obawie o wpacon kaucj. W postrzeganiu
PHP jako domu nie ma niczego zego. Bdziemy tam jaki czas mieszka , dlaczego wic nie poprzestawia mebli czy nie zburzy paru cian?

UWAGA

W zalenoci od konfiguracji samego komputera, na ktrym pracuje Twj serwer


WWW, moesz nie mie moliwoci samodzielnego modyfikowania ustawie .
Dobrzy operatorzy serwerw nie maj jednak nic przeciwko wprowadzaniu niezbdnych zmian w Twoim imieniu, a najlepsze firmy tego typu oferuj nawet moliwo modyfikacji ustawie za porednictwem specjalnych plikw konfiguracyjnych.
Ustawienia rodowiska PHP s skadowane w pliku nazwanym php.ini, ktry
mona przeglda i modyfikowa w dowolnym edytorze tekstu. Ustawienia, ktre
podzielono pomidzy sekcje, maj nastpujc posta :
max_execution_time = 30
max_input_time = 60
memory_limit = 8M

; Maksymalny czas wykonywania


; Maksymalny czas analizy skadniowej danych wejciowych
; Maksymalna ilo pamici zajmowanej przez skrypt

Parametry konfiguracyjne mona ustawia za pomoc znaku rwnoci (=).


rednik (;) oznacza, e mamy do czynienia z komentarzem; okazuje si jednak,
e istniej wyjtki od tej reguy umoliwiajce stosowanie rednikw w niektrych parametrach. Gdybymy chcieli trwale zmieni jakie ustawienie, powinnimy
sporzdzi kopi zapasow pliku php.ini, zmodyfikowa oryginalny plik konfiguracyjny i ponownie uruchomi serwer Apache. Gdybymy chcieli zmienia
ustawienia na poziomie skryptu, powinnimy uy funkcji ini_set().

Lokalizowanie pliku php.ini


W niektrych przypadkach wskazanie miejsca skadowania pliku php.ini w systemie, w ktrym pracujemy (szczeglnie jeli korzystamy z wielu instalacji rodowiska
PHP), bywa trudne. Poniej opisano kilka sposobw lokalizowania tego pliku:
Q Uytkownicy systemw UNIX powinni zajrze do katalogu /usr/lib
lub /usr/local/lib. Plik php.ini powinien si znajdowa w podkatalogu lib
w miejscu, w ktrym zainstalowano PHP.
Q Uytkownicy systemu Windows powinni zwrci uwag na katalog C:\php.
Q Mona te wywoa funkcj phpinfo() w kodzie skryptu PHP (wicej
informacji na ten temat w kolejnym podrozdziale). Lokalizacja pliku
php.ini zostanie wywietlona w pocztkowej czci danych wynikowych
obok etykiety Configuration File (php.ini) Location.
Q W wielu systemach UNIX mona uzyska list wszystkich plikw
pasujcych do wzorca php.ini za pomoc polecenia locate php.ini.
UWAGA

32

Wiele ustawie nie jest definiowanych w domylnym pliku php.ini; rodowisko PHP
stosuje dla niezdefiniowanych ustawie wasne wartoci domylne. List ustawie
domylnych PHP mona znale na stronie internetowej http://www.php.net/
manual/en/ini.php.

Rozdzia 2

Skrypt nr 8: Odkrywanie
wszystkich ustawie PHP
PHP oferuje bogat funkcjonalno , jednak nie zawsze wszystkie te funkcje s
wczone lub wbudowane w stosowanej instalacji. Do sprawdzenia, jakie elementy wchodz w skad danej instalacji rodowiska PHP, mona wykorzysta
bardzo prosty skrypt. Moliwo uzyskiwania tego rodzaju danych jest o tyle niebezpieczna, e szeroki zakres prezentowanych informacji stanowi swoisty podrcznik dla potencjalnych atakujcych. Funkcja phpinfo() zdaje si mwi : Tutaj.
To s moje sabe punkty. Wprost nie mog si doczeka wamania do mojego
systemu. W tej sytuacji naley pamita o koniecznoci usunicia tego skryptu
zaraz po uzyskaniu interesujcych nas informacji:
<?php
phpinfo();
?>

Funkcja phpinfo() wywietla wszystko, co rodowisko PHP wie o swojej konfiguracji. Naprawd wszystko. Zwracane informacje nie ograniczaj si tylko do stanu poszczeglnych ustawie konfiguracyjnych PHP, pooenia pliku php.ini czy
wersji samego rodowiska PHP obejmuj take wersj serwera WWW, skompilowane rozszerzenia oraz dane interfejsu API serwera. Warto zwrci szczegln
uwag na opcje konfiguracyjne, aby mie pewno , e wszystkie niezbdne funkcje
zostay prawidowo zainstalowane i wczone.
Aby uruchomi ten skrypt, odwied odpowiedni stron za pomoc swojej
przegldarki internetowej. Nie zapomnij usun tego skryptu po uzyskaniu potrzebnych informacji.

Skrypt nr 9: Odczytywanie
poszczeglnych ustawie
Czasem, kiedy wiemy, czego szukamy, stosowanie funkcji phpinfo() jest przesadne i niepotrzebne. Moemy na przykad by zainteresowani tylko sprawdzeniem, czy mechanizm magicznych cudzysoww jest wczony, lub okreleniem cieki doczania. Co wicej, funkcja phpinfo() w aden sposb nam nie
pomoe, jeli pisany skrypt zachowuje si inaczej w razie wczenia jakiego ustawienia i inaczej w sytuacji, gdy to ustawienie jest wyczone.
Aby uzyska warto okrelonego ustawienia konfiguracyjnego, naley uy
funkcji ini_get():

Konfigurowanie PHP

33

<?php
echo "Warto opcji register_globals: " . ini_get('register_globals');
?>

Wystarczy przekaza na wejciu funkcji ini_get() prawidow nazw parametru konfiguracji, a otrzymamy aktualne ustawienie tego parametru na biecym
serwerze. Opcja jest zwracana w formie zwykej wartoci, zatem mona j wywietli , przypisa do zmiennej itd. Korzystajc z tej funkcji, musimy jednak mie na
uwadze dwa aspekty.
Po pierwsze: wartoci logiczne, np. "false", z reguy s zwracane w formie
acuchw pustych, zatem jeli sprbujemy wywietli ustawienie "off" parametru register_globals, by moe otrzymamy nastpujcy komunikat:
Warto opcji register_globals:

Po drugie: wartoci numeryczne czsto s reprezentowane w formie skrconej.


Jeli na przykad parametrowi upload_max_filesize przypisano warto 8192 bajtw, zostanie zwrcona warto 8 kB. Podobnie, jeli maksymalny rozmiar wysyanego pliku ustalono na poziomie 2 MB, dla parametru upload_max_filesize
otrzymamy warto 2 MB, a nie 2 097 152 bajty.
Taki sposb reprezentowania numerycznych ustawie konfiguracyjnych moe stanowi powany problem, jeli chcemy na tych liczbach wykonywa operacje arytmetyczne. Oficjalna dokumentacja PHP wspomina o funkcji konwertujcej wartoci skrcone (kilo- i mega-) na prawdziwe wartoci:
function return_bytes($val) {
$val = trim($val);
$last = $val{strlen($val)-1};
switch(strtoupper($last)) {
case 'K':
return (int) $val * 1024;
break;
case 'M':
return (int) $val * 1048576;
break;
default:
return $val;
}
}

34

Rozdzia 2

Skrypt nr 10: Raportowanie o bdach


Pracujc nad kodem, czsto zapominamy nazw stosowanych zmiennych lub korzystamy z przestarzaych, niezalecanych konstrukcji. W niektrych przypadkach jzyk PHP okazuje si na tyle przyjazny uytkownikowi (przynajmniej jak
na standardy programowania), e sam naprawia wiele drobnych bdw w kodzie.
PHP umoliwia nam midzy innymi pisanie programw bez koniecznoci
deklarowania wszystkich niezbdnych zmiennych na pocztku kodu, co jest bardzo
wygodne, przynajmniej do momentu gdy zamiast nazwy $string omykowo
uyjemy nazwy $stirng reprezentujcej warto pust. Mona te przekazywa
zmienne na wejciu funkcji w zupenie niewaciwy sposb, a mimo to skrypt
PHP bdzie dziaa prawidowo, poniewa w wikszoci przypadkw bdzie
przyjmowa pewne zaoenia wobec zamiarw programisty. Tego rodzaju mechanizmy s oczywicie bardzo podane, dopki PHP prawidowo odgaduje nasze intencje w przeciwnym razie poszukiwanie tajemniczego bdu moe nam zaj
mnstwo czasu.
Aby wyczy mechanizmy automatycznego usuwania problemw, mona
wczy tryb raportowania o bdach, co spowoduje, e PHP bdzie wywietla
na ekranie niezliczone komunikaty w reakcji na kady wykryty bd (niezalenie
od jego faktycznej wagi). Mona te komunikaty wykorzysta do eliminowania
potencjalnych luk w zabezpieczeniach i wykrywania bdnych zmiennych przed
skierowaniem programu do rodowiska kocowego. Wczenie trybu raportowania o bdach wymaga umieszczenia nastpujcego kodu na pocztku tworzonego
skryptu:
<?php
error_reporting(E_ALL);
// Tutaj naley umieci dalsz cz skryptu.

?>

Wczenie trybu raportowania o bdach powoduje, e PHP wywietla komunikaty jeszcze przed przetworzeniem dalszej czci danego programu. (Takie
rozwizanie uniemoliwia ustawianie ciasteczek w razie wystpienia bdu, zatem
nie powinnimy nawet prbowa zmienia wartoci ciasteczek po wczeniu tego
trybu).

Typowe komunikaty o bdach


Warto dobrze opanowa i zrozumie trzy najczciej generowane komunikaty
o bdach.
Notice: Undefined variable: var in script.php on line n

Konfigurowanie PHP

35

Komunikat w tej formie oznacza, e korzystamy ze zmiennej, ktrej wczeniej


nie zdefiniowano w danym skrypcie. Taka sytuacja moe mie miejsce w kilku
przypadkach:
Q By moe popenilimy bd w pisowni nazwy zmiennej.
Q By moe uylimy wyraenia warunkowego zawierajcego definicj
zmiennej, np.:
if ($fred == "Jestem Fred") {
$he_is_fred = "yes";
}

Q By moe prbujemy konkatenowa zmienn bez jej uprzedniego


zadeklarowania.
Inny popularny problem wystpuje duo czciej w sytuacji, gdy w swoim
programie prbujemy korzysta ze starszego kodu PHP:
Notice: Use of undefined constant k - assumed 'k' in script.php on line n

Komunikat ostrzeenia w tej formie zwykle oznacza, e programista podj


prb przekazania acucha na wejciu funkcji bez otaczajcych go cudzysoww. Innymi sowy, uyto na przykad wywoania strtolower(acuch) zamiast
metody strtolower("acuch").
I wreszcie istnieje popularny komunikat o bdzie generowany w sytuacji,
gdy uzyskujemy dostp do tablicy:
Notice: Undefined index: i in script.php on line n

W praktyce komunikat w tej formie oznacza, e podjto prb odczytania


elementu $tablica[i], mimo e tablica $tablica nie definiuje elementu pod
tym indeksem. Z tego rodzaju bdami mamy do czynienia w sytuacji, gdy uzyskujemy warto z formularza za porednictwem zmiennej $_POST lub $_GET,
chocia adna z tych zmiennych nie zawiera tak nazwanej wartoci. Najczciej
podobne bdy wynikaj z tego, e uytkownik nie zaznaczy odpowiedniego
pola wyboru lub przycisku opcji w takim przypadku zmienna reprezentujca
ten element formularza w ogle nie jest przekazywana w ramach dania GET
(jako cz adresu URL).
Tryb raportowania o bdach naley wyczy z chwil wdraania skryptu na
docelowej witrynie, aby uytkownicy nie mogli si zapoznawa z popenionymi
przez nas bdami i aby wyeliminowa wpyw tego trybu na ciasteczka (w szczeglnoci problemy ze ledzeniem sesji).

36

Rozdzia 2

Skrypt nr 11: Ukrywanie wszystkich


komunikatw o bdach
W pewnych sytuacjach dysponujemy prawidowo dziaajcym skryptem, a mimo
to rodowisko PHP wci sugeruje potencjalne usterki. Innym razem nie chcemy,
by oczekiwane problemy powodoway, e nasi uytkownicy bd naraeni na
odraajcy widok komunikatw o bdach (odkrywajcych informacje, co szczeglnie ceni sobie hakerzy).
Na szczcie istnieje moliwo powstrzymania PHP przed wywietlaniem
wszystkich komunikatw o bdach. Wystarczy w pliku php.ini umieci nastpujcy wiersz:
display_errors = Off

Przytoczone rozwizanie warto stosowa w rodowisku docelowym aplikacji


internetowej, aby w przyszoci nie obawia si szerokiej dostpnoci komunikatw diagnostycznych PHP odnonie do naszego kodu. Gdybymy chcieli zapozna si z tymi komunikatami celem wyeliminowania ewentualnych problemw,
powinnimy uy nastpujcego ustawienia konfiguracyjnego wymuszajcego
kierowanie tych komunikatw do dziennika zdarze serwera Apache:
log_errors = On

W razie potrzeby mona nawet wysya komunikaty diagnostyczne do dziennika systemowego lub wskazanego pliku parametrowi error_log naley wwczas przypisa odpowiednio warto syslog lub nazw pliku.
Pozostaje jeszcze kwestia naszego rodowiska wytwarzania, gdzie z reguy
chcemy uzyskiwa moliwie wiele komunikatw diagnostycznych. Po przypisaniu parametrowi display_errors wartoci On mona dodatkowo (w pliku php.ini)
ustawi struktur bitow w parametrze error_reporting (wicej szczegw na
ten temat mona znale w przykadowym pliku php.ini instalowanym wraz ze
rodowiskiem PHP). Jeli jednak chcemy uciszy jaki skrypt, ktry nieustannie
zasypuje nas tymi samymi komunikatami, moemy uy w jego kodzie nastpujcego wywoania funkcji:
error_reporting(0);

Konfigurowanie PHP

37

Skrypt nr 12: Wyduanie czasu


wykonywania skryptu
Pracowaem kiedy w firmie, ktra postawia sobie za cel zmian mechanizmu
obsugi koszykw z zakupami. Do moich zada naleao napisanie skryptu odpowiedzialnego za konwersj 250 MB danych o produktach ze starego na nowy
format. Skrypt dziaa co prawda znakomicie, jednak ilo przetwarzanych danych powodowaa, e rodowisko PHP stale przerywao jego wykonywanie po
upywie 30 sekund, a wic na dugo przed osigniciem zamierzonego celu.
Wanie wwczas odkryem drobne rozszerzenie, ktre umoliwio mojemu
skryptowi wykonanie zleconego zadania. Poniszy wiersz dodany na pocztku
skryptu powoduje, e bdzie on mia maksymalnie 240 sekund na przetworzenie
danych:
ini_set(max_execution_time, "240");

Parametr konfiguracyjny max_execution_time okrela maksymalny czas wykonywania skryptu przed jego automatycznym zakoczeniem. Nie naley jednak tego
parametru naduywa . Jeli dany skrypt dziaa kilka minut, to albo usprawiedliwia nas ogromna ilo przetwarzanych informacji (najpewniej zaczerpnitych
z bazy danych), albo nasz skrypt jest bardzo nieefektywny, albo korzystamy z
niewaciwego jzyka programowania.

Co moe pj nie po naszej myli?


Jeli nasz serwer pracuje w trybie awaryjnym, ustawianie wartoci parametru
max_execution_time w czasie wykonywania jest niemoliwe.
Warto te dokadnie sprawdzi kod skryptu. By moe omykowo zawarlimy
tam nieskoczon ptl lub ptl wykonywan w innej ptli i niepodejmujc
adnych sensownych dziaa.

Skrypt nr 13: Uniemoliwianie uytkownikom


wysyania wielkich plikw
Gdybymy chcieli uniemoliwi uytkownikom naszej aplikacji wysyanie na
serwer 70-gigabajtowych MPEG-w z najnowszym filmem Gwiezdne wojny,
powinnimy okreli maksymalny rozmiar plikw kopiowanych na serwer.
(Szczegowe omwienie samych technik przetwarzania wysyanych plikw
mona znale w podrozdziale Skrypt nr 54: Wysyanie obrazw do katalogu
w rozdziale 7.).
upload_max_filesize = 500K

38

Rozdzia 2

Maksymalny rozmiar plikw wysyanych na serwer mona okreli na jeden


z trzech sposobw:
Q w formie wartoci cakowitoliczbowej (wyraajcej czn liczb bajtw);
Q w formie liczby z przyrostkiem M reprezentujcej megabajty
(2M to 2 megabajty);
Q w formie liczby z przyrostkiem K reprezentujcej kilobajty
(8K to 8 kilobajtw).
Niezalenie od uytego formatu nasi uytkownicy nie bd mogli wysa na
serwer pliku, ktrego rozmiar bdzie przekracza tak zdefiniowany prg. Domylnym rozmiarem maksymalnym s 2 MB.

Skrypt nr 14: Wyczanie rejestrowanych


zmiennych globalnych
Jzyk PHP oferuje przestarza, niezalecan funkcj, ktra nieznacznie uatwia
dostp do parametrw da GET i POST protokou HTTP. Jeli na przykad danie POST zawiera parametr nazwany mojparam, PHP moe automatycznie umieci jego warto w zmiennej nazwanej $mojparam. Dziaanie tego mechanizmu
stwarza powane ryzyko dla bezpieczestwa aplikacji, poniewa umoliwia
uytkownikom ustawianie dowolnych zmiennych globalnych jeli zapomnimy
zainicjalizowa odpowiednie zmienne, uytkownik zyska moliwo wpywania
na istotne elementy naszego skryptu.
Wspomniany mechanizm mona wyczy , ustawiajc w zmiennej register_
globals warto Off w pliku php.ini serwera:
register_globals = Off

Opisana funkcja na szczcie zostaa wyczona w wersjach 4.2 i nowszych


jzyka PHP. Waga problemu jest jednak na tyle dua, e warto to dwukrotnie
sprawdzi .

Skrypt nr 15: Wczanie


magicznych cudzysoww
Magiczne cudzysowy (ang. magic quotes) to wygodne narzdzie stosowane
przez administratorw serwerw do ochrony przed atakami polegajcymi na
wstrzykiwaniu kodu SQL-a (patrz podrozdzia Skrypt nr 19: Wstrzykiwanie
kodu jzyka SQL w rozdziale 3.). Dziaanie tego mechanizmu polega na po-

Konfigurowanie PHP

39

przedzaniu wszystkich apostrofw, cudzysoww i lewych ukonikw dodatkowym


znakiem lewego ukonika (tzw. znakiem ucieczki) we wszystkich danych zapisywanych w zmiennych skryptu PHP i pochodzcych z formularzy HTML. W ten
sposb na przykad acuch "Ferrett's Book" zostanie przeksztacony w acuch
\"Ferrett\'s Book\".
Mechanizm magicznych cudzysoww nie jest rozwizaniem idealnym, jeli korzystamy z bazy danych MySQL w takim przypadku naley stosowa raczej
wyspecjalizowan funkcj mysql_real_escape_string() jednak generalnie
magiczne cudzysowy zdaj egzamin. Mona ten mechanizm wczy w pliku
php.ini za pomoc nastpujcego wyraenia:
magic_quotes_gpc = 1

Co moe pj nie po naszej myli?


Jeli nie wczymy mechanizmu magicznych cudzysoww, bdziemy musieli
korzysta z funkcji mysql_real_escape_string(), aby zagwarantowa stosowanie
sekwencji ucieczki w wykorzystywanych danych. Jeli jednak uyjemy tej funkcji dla danych w sytuacji, gdy mechanizm magicznych cudzysoww bdzie
wczony, ryzykowne znaki zostan poprzedzone podwjnymi lewymi ukonikami
(zamiast \"Ferrett\'s Book\" otrzymamy \\"Ferrett\\'s Book\\"). Jak wida ,
konsekwencja popaca chwila nieuwagi moe spowodowa , e tabele naszej
bazy danych bd zawieray niemal wycznie lewe ukoniki.

Skrypt nr 16: Ograniczanie dostpu PHP


do plikw
Jeli obawiasz si wrogiego skryptu PHP uzyskujcego dostp do plikw systemowych (np. do pliku hase), moesz uy ustawienia open_basedir do ograniczenia zbioru katalogw dostpnych z poziomu kodu PHP. Po ustawieniu tej
opcji skrypt PHP nie bdzie mg otwiera ani modyfikowa adnych plikw
spoza wskazanego katalogu. Poniej przedstawiono wiersz pliku php.ini ograniczajcy dostp tylko do katalogu /home/www:
open_basedir = /home/www

Istnieje moliwo zapewniania skryptom dostpu do wielu katalogw


w systemie UNIX naley je oddziela dwukropkami (:); w systemie Windows
kolejne katalogi oddzielamy rednikami (;).
UWAGA

40

PHP domylnie zapewnia dostp zarwno do wskazanego katalogu, jak i wszystkich


jego podkatalogw. Gdybymy chcieli ograniczy ten dostp tylko do plikw w okrelonym katalogu, na ko cu uytej cieki powinnimy uy ukonika (np. /home/www/).

Rozdzia 2

Co moe pj nie po naszej myli?


Jeli uytkownicy musz wysya pliki na serwer, to do czasu ich przetworzenia
przez skrypt otrzymane pliki s skadowane w katalogu tymczasowym. Poniewa katalog tymczasowy z reguy dzieli spora odlego od pozostaych plikw
PHP, koniecznie musimy pamita o jego uwzgldnieniu na licie reprezentowanej
przez parametr open_basedir.

Skrypt nr 17: Wyczanie


obsugi okrelonych funkcji
Przypu my, e uznalimy funkcj exec(), ktra umoliwia bezporednie wykonywanie polece na serwerze z poziomu skryptw PHP, za zbyt niebezpieczn.
Okazuje si, e istnieje moliwo wyczania obsugi poszczeglnych funkcji
PHP (wanie z myl o wyeliminowaniu luk w zabezpieczeniach) z zachowaniem moliwoci stosowania wszystkich pozostaych funkcji. Poniej przedstawiono przykad wiersza pliku php.ini wyczajcego obsug kilku szczeglnie
ryzykownych funkcji:
disable_functions = system, exec, passthru, shell_exec, proc_open

Skrypt nr 18: Dodawanie rozszerze do PHP


Naprawd powani programici prdzej czy pniej odkrywaj pewne ograniczenia jzyka PHP. Mimo ogromnej liczby wbudowanych funkcji i mechanizmw sam jzyk PHP nie oferuje rdzennych rozwiza w zakresie szyfrowania,
grafiki, dostpu do innych stron internetowych czy przetwarzania danych w formacie XML.
Te i inne cele mona jednak osiga dziki niezliczonym rozszerzeniom wykorzystujcym biblioteki tworzone przez niezalenych programistw i podmioty.
Kilka najbardziej przydatnych rozszerze jzyka PHP opisano poniej:
cURL
cURL umoliwia naszemu serwerowi PHP uzyskiwanie dostpu do innych
witryn internetowych, w tym wysyanie i odbieranie informacji za porednictwem swoistego protokou zbudowanego na bazie adresw URL. (Najczciej
korzystamy z protokou HTTP, ktry umoliwia nam komunikacj z innymi
stronami internetowymi, oraz protokou FTP umoliwiajcego nam wysyanie
i pobieranie plikw). W praktyce oznacza to, e nasz serwer moe by traktowany przez inne witryny jak przegldarka internetowa, a pobierane strony
WWW moemy umieszcza w dowolnych zmiennych w ramach swoich
skryptw.

Konfigurowanie PHP

41

cURL jest niezwykle wanym narzdziem dla programistw pracujcych nad


powanymi sklepami internetowymi, poniewa umoliwia nam akceptowanie patnoci kartami kredytowymi i wyceny towarw dla poszczeglnych
klientw w czasie rzeczywistym. Za pomoc rozszerzenia cURL mona nawizywa poczenia i wysya dane o transakcjach na serwer innej firmy. W odpowiedzi otrzymujemy wwczas informacje o akceptacji bd odrzuceniu
dania dokonania patnoci.
Mcrypt
Musiae kiedy co zaszyfrowa ? Wszystkie poufne informacje umieszczane
w ciasteczkach i sesjach powinny by szyfrowane. Co wicej, jeli gdziekolwiek
zapisujemy co naprawd wartociowego, jak numery kart kredytowych czy
dane osobowe, z pewnoci powinnimy si upewni , e odczyt tych informacji nie bdzie moliwy przez zwyky zrzut zawartoci bazy danych. Na
szczcie biblioteka Mcrypt umoliwia nam naprawd skuteczne szyfrowanie danych bez cho by szcztkowej znajomoci technik szyfrowania! (Sposoby
korzystania z tego rozszerzenia zostan szczegowo omwione w podrozdziale Skrypt nr 23: Szyfrowanie danych za pomoc rozszerzenia Mcrypt
w rozdziale 3.).
GD
Gdybymy chcieli tworzy obrazy graficzne na danie lub po prostu uzyskiwa szczegowe informacje o obrazach ju istniejcych, powinnimy si
zapozna z moliwociami biblioteki GD. Biblioteka GD umoliwia nam prac
na plikach JPEG i GIF moemy je tworzy z myl o graficznej prezentacji
rozmaitych danych (np. w formie wykresw) albo modyfikowa (np. tworzc
miniaturki istniejcych obrazw).
MySQL
Podstawowa wersja rodowiska PHP w ogle nie wie, jak uzyskiwa dostp do baz danych. Poniewa jednak system MySQL i jzyk PHP s jak Zan
i Jayna z popularnej kreskwki, wikszo serwerw WWW przystosowanych do obsugi PHP oferuje te domylnie instalowane biblioteki systemu
MySQL, zatem wikszo programistw korzysta z funkcji mysql_connect(),
nie wiedzc, e jest ona czci rozszerzenia.
Zbir rozszerze PHP jest oczywicie duo bogatszy i obejmuje takie biblioteki
jak SOAP (zapewniajca dostp do usug internetowych), PDF czy Verisign
Payment Pro. Na pierwszy rzut oka moe si wydawa , e najlepszym rozwizaniem jest doczanie do rodowiska PHP wszystkich rozszerze, ktre tylko
udao nam si odnale , jednak warto mie na uwadze, e kade z nich moe
wyduy czas inicjalizacji i stwarza dodatkowe luki w zabezpieczeniach. Co
wicej, mniej popularne rozszerzenia z reguy nie s na bieco aktualizowane
ani rozwijane.

42

Rozdzia 2

Dodawanie rozszerze jzyka PHP


Skoro wiemy ju, co mona zyska , instalujc rozszerzenia, przyjrzyjmy si samem procesowi ich instalowania. W pierwszej kolejnoci naley sprawdzi , czy
przypadkiem ju nie dysponujemy tym, czego szukamy.
Sprawdzanie, czy interesujce nas rozszerzenia nie zostay ju zaadowane
Wiele serwerw WWW domylnie instaluje najbardziej przydatne i najpopularniejsze rozszerzenia, zatem przed podjciem prb odszukania i instalacji interesujcej nas biblioteki powinnimy si upewni , czy nie zostaa ju zainstalowana
i zaadowana.
Najprostszym sposobem sprawdzenia ewentualnej obecnoci rozszerze jest
wywoanie funkcji phpinfo() (opisanej w podrozdziale Skrypt nr 8: Odkrywanie wszystkich ustawie PHP we wczeniejszej czci tego rozdziau). List
zwrcon przez t funkcj naley dokadnie przejrze w poszukiwaniu naszych
bibliotek. Jeli na przykad rodowisko PHP obejmuje zainstalowane rozszerzenie MySQL, dane wynikowe funkcji phpinfo() bd zawieray wiersz podobny
do poniszego:
mysql
MySQL Support => enabled
...

Jeli uznasz, e takie rozwizanie nie jest dla Ciebie, jeli wyda Ci si zbyt
wolne, moesz skorzysta z innych moliwoci.
Kade rozszerzenie dodaje do PHP nowe funkcje na przykad cURL
uzupenia funkcjonalno PHP o takie funkcje jak cURL_init() czy cURL_setopt(),
Mcrypt dodaje funkcje mcrypt_encrypt() oraz mcrypt_decrypt() itd. Przypu my
jednak, e nie zainstalowano rozszerzenia Mcrypt. W takim przypadku PHP nie
ma pojcia o funkcji mcrypt_decrypt() i traktuje j jako funkcj niezdefiniowan.
Mona to wykorzysta , stosujc funkcj function_exists() jzyka PHP. Poniej
przedstawiono przykadowy skrypt wykrywajcy rozszerzenie MySQL:
<?php
if (function_exists(mysql_connect)) {
print 'Wykryto rozszerzenie MySQL';
} else {
print 'Nie wykryto rozszerzenia MySQL';
}
?>

adowanie rozszerze przy pomocy administratorw zdalnych serwerw


Jeli korzystamy z serwera WWW bdcego wasnoci innej firmy (tak robi
wikszo programistw), musimy si zda na ask administratora tego serwera. Poniewa z natury rzeczy nie dysponujemy hasem administratora, nie

Konfigurowanie PHP

43

moemy instalowa niezbdnych bibliotek samodzielnie. W takim przypadku


musimy o to poprosi administratora wynajmowanego serwera. Kierujc odpowiednie zlecenie, powinnimy si upewni , e administrator dysponuje precyzyjnymi informacjami; w przeciwnym razie moe si okaza , e zostaa zainstalowana niewaciwa wersja lub wrcz niewaciwe rozszerzenie.
Niektre firmy zrealizuj nasz prob bez najmniejszych problemw. Inne
bd oczekiway dodatkowych opat za obcianie swoich serwerw dodatkowymi rozszerzeniami. Jeszcze inne odpowiedz: Nasza oferta nie obejmuje obsugi dodatkowych rozszerze. Ograniczamy si tylko do standardowego PHP.
Jeli z jakiego powodu nie moesz zainstalowa potrzebnych rozszerze,
moesz albo sprbowa poradzi sobie bez nich, albo zmieni firm obsugujc
serwery.
UWAGA

Nawet jeli korzystamy z wasnego serwera, ale nie potrafimy prawidowo zainstalowa niezbdnych rozszerze , warto zwrci si z prob o instalacj nowych
bibliotek do pracownikw wsparcia technicznego. W takim przypadku w razie niepowodzenia procesu instalacji technicy bd w stanie naprawi usterk (przynajmniej teoretycznie).

Instalacja rozszerze
za pomoc internetowego panelu sterowania
Dzierawione serwery czsto oferuj specjalne panele sterowania, za porednictwem ktrych moemy realizowa typowe zadania administracyjne (w tym
zadanie ponownego uruchomienia usugi Apache lub restartu caego serwera)
w oknie przegldarki internetowej.
Niektre panele sterowania oferuj nawet moliwo automatycznego kompilowania serwera Apache i rodowiska PHP wskutek zaznaczenia pl wyboru
lub wyboru z list rozwijanych opcji reprezentujcych dodawane rozszerzenia.
Na przykad WHM (popularny, cho do trudny w obsudze panel sterowania)
udostpnia opcj Update Apache, ktra powoduje ponown instalacj serwera
Apache i rodowiska PHP wraz z wybranymi daniami.
Jeli Twj serwer nie udostpnia preinstalowanego panelu sterowania, z reguy za
niewielk opat mona taki panel zainstalowa ju po wdroeniu oprogramowania
serwera.
Rczna instalacja rozszerze
Ponowna kompilacja PHP jest w systemach UNIX traktowana jako ponowna instalacja tego rodowiska wraz z niezbdnymi rozszerzeniami. Dla programistw,
ktrzy nie maj dowiadczenia w roli administratorw systemw UNIX, ponowna
kompilacja rodowiska PHP czsto jest powanym wyzwaniem.
Najlepszym rozwizaniem jest przystpienie do eksperymentw z lokalnym
serwerem Apache z dala od docelowego rodowiska pracy aplikacji internetowej. Poniewa zmiany wprowadzane w konfiguracji pracujcego serwera mog

44

Rozdzia 2

doprowadzi do powanych problemw, warto uprzednio sprawdzi , czy w razie


kopotw moemy liczy na pomoc techniczn i czy zdajemy sobie spraw z tego,
co moe si wydarzy . Jeli nie jestemy przygotowani do tego rodzaju zada,
powinnimy si zwrci o pomoc do kogo bardziej kompetentnego.
Instalacja biblioteki w rodowisku PHP jest procesem dwuetapowym
w pierwszej kolejnoci musimy zainstalowa same biblioteki rozszerze; drugim
krokiem jest takie skonfigurowanie rodowiska PHP, aby rozpoznawao te rozszerzenia.
Instalowanie bibliotek
Szczegowe kroki skadajce si na proces instalacji rozszerzenia w duej mierze zale od dodawanej biblioteki. Mona oczywicie sformuowa oglne zasady rzdzce tym procesem, jednak przed przystpieniem do instalacji zawsze
naley si zapozna z podrcznikami dostpnymi na stronie biblioteki oraz
wszystkimi plikami README. Czytelnicy zainteresowani szczegowym wyjanieniem pracy systemu Linux, w tym technik kompilowania oprogramowania,
powinni sign po ksik Briana Warda zatytuowan How Linux Works (No
Starch Press, 2004)1.
W poniszych punktach opisano oglne kroki skadajce si na proces instalacji bibliotek:
1. Zalogowanie na serwerze jako administrator lub uytkownik z prawem

instalacji nowych programw.


2. Pobranie archiwum biblioteki i umieszczenie go w katalogu gwnym

serwera. Wpisanie w wyszukiwarce Google nazwy biblioteki i sowa PHP


(np. mcrypt php) z reguy pozwoli byskawicznie odnale stron domow
interesujcego nas rozszerzenia, gdzie bd dostpne odpowiednie pliki
rdowe. Pliki rdowe najczciej s archiwizowane i kompresowane
za pomoc narzdzi Gzip i tar (z myl o oszczdzaniu przestrzeni),
zatem pobrany plik najprawdopodobniej bdzie nosi nazw
nazwaplikubiblioteki.tar.gz.
3. Wypakowanie zawartoci pobranego archiwum. Archiwum tar jest

w istocie zbiorem plikw i katalogw. Cae to archiwum jest nastpnie


kompresowane za pomoc pakietu Gzip, std rozszerzenie .gz jest
dopisywane na samym kocu. Oznacza to, e plik .tar.gz mona
traktowa tak samo jak plik .zip, z t rnic, e plik .tar.gz powstaje
w dwch etapach i z wykorzystaniem dwch rnych programw.
Okazuje si jednak, e nie musimy wprost uruchamia obu tych narzdzi,
poniewa program tar w wersji GNU wie, jak korzysta z narzdzia dekompresujcego. Wypakowanie zawartoci archiwum tar wymaga wydania
polecenia tar zxvf nazwaplikubiblioteki.tar.gz w wierszu polece. W wyniku
tego polecania otrzymamy list wypakowanych wszystkich plikw i katalogw.
1

Polskie wydanie: Jak dziaa Linux, Helion, 2005 przyp. tum.

Konfigurowanie PHP

45

Wikszo archiww tworzy drzewo poniej katalogu najwyszego poziomu,


zatem wanie takiej struktury powinnimy oczekiwa .
4. Przejcie do katalogu biblioteki za pomoc polecenia cd nazwakatalogu.

Jeli nie pamitamy lub w ogle przeoczylimy nazw z poprzedniego


kroku, z reguy moemy przyj , e nazwa tego katalogu bdzie odpowiadaa
nazwie samej biblioteki np. cd cURL. (Warto pamita , e wielko znakw
w nazwach katalogw jest istotna, zatem cURL to nie to samo co CURL).
5. Uruchomienie polecenia configure, aby sprawdzi, czy wszystkie

skadniki niezbdne do zako czenia instalacji na danym komputerze


zostay rozpakowane. Z uwagi na rnorodno dostpnych systemw
UNIX instalacja pakietw w tych systemach wymaga pewnej wiedzy
i dowiadczenia. Na szczcie polecenie configure w wikszoci przypadkw
potrafi wykona ca t brudn robot za nas, automatycznie analizujc
ustawienia serwera i stosujc wartoci umoliwiajce prawidowy przebieg
instalacji programu. Wpisz w wierszu polece wyraenie ./configure.
Niektre rozszerzenia wymagaj do waciwego dziaania stosowania dodatkowych flag za poleceniem configure. Na przykad rozszerzenie Mcrypt
wymaga od nas wydania polecenia ./configure --disable-nls --disableposix-threads, poniewa tylko w ten sposb mona zagwarantowa pen
zgodno z serwerem Apache. Poniewa dodatkowe opcje zale od samej
biblioteki, warto si zapozna z przewodnikami i plikami README, gdzie
mona znale precyzyjn dokumentacj wszystkich niezbdnych flag konfiguracyjnych.
6. Kompilacja i instalacja danego pakietu. W systemach UNIX standardowym
narzdziem kompilujcym i instalujcym pakiety jest make. Najpierw musimy
wyda wanie polecenie make, aby skompilowa nasz pakiet. Na ekranie

zostan wywietlone wykonywane polecenia, ktre skadaj si na proces


kompilacji. Nastpnie powinnimy uy polecenia make check celem
wykonania na tym pakiecie automatycznych testw (niektre pakiety nie
zawieraj testw, czym jednak nie powinnimy si przejmowa ). I wreszcie
naley wpisa polecenie make install, aby ostatecznie zainstalowa
rozszerzenie. Take proces instalacji bdzie dokumentowany na ekranie.
Po wykonaniu polecenia make install proces instalacji rozszerzenia
bdzie zakoczony.
7. Utworzenie skryptu phpinfo(). Ach, pewnie mylae, e to ju koniec,

prawda? Przykro mi, ale opisana powyej procedura prowadzi tylko do


instalacji rozszerzenia na serwerze. Musimy jeszcze ponownie zainstalowa
rodowisko PHP i wskaza , gdzie znajduje si nowe rozszerzenie i jak z niego
korzysta .
Za pomoc funkcji phpinfo() (patrz podrozdzia Skrypt nr 8: Odkrywanie
wszystkich ustawie PHP we wczeniejszej czci tego rozdziau) moemy
uzyska kompletny wykaz ustawie serwera. Gdzie na pocztku pierwszej

46

Rozdzia 2

strony danych wygenerowanych przez t funkcj mona znale sekcj zatytuowan Configure Command i zawierajc tajemnicz list elementw
podobn do poniszej:
'./configure' '--with-apxs=/usr/local/apache/bin/apxs' '--with-xml'
'--enable-bcmath' '--enable-calendar' '--enable-ftp' '--enable-magicquotes' '--with-mysql' '--enable-discard-path' '--with-pear' '--enablesockets' '--enable-track-vars' '--enable-versioning' '--with-zlib'

Gdybymy chcieli ponownie zainstalowa rodowisko PHP w stanie, w ktrym znajduje si obecnie, dysponowalibymy gotowym poleceniem (a przynajmniej prawie gotowym). W pierwszej kolejnoci naley usun apostrofy
wok polecenia configure, aby otrzyma polecenie w postaci:
./configure '--with-apxs=/usr/local/apache/bin/apxs' '--with-xml'
'--enable-bcmath' '--enable-calendar' '--enable-ftp' '--enable-magicquotes' '--with-mysql' '--enable-discard-path' '--with-pear' '--enablesockets' '--enable-track-vars' '--enable-versioning' '--with-zlib'

Celem tego kroku jest zachowanie ju zainstalowanych rozszerze jeli


dodajemy rozszerzenie GD, nie chcemy przecie przy tej okazji utraci innych, zainstalowanych wczeniej rozszerze. Gotowe polecenie configure
naley skopiowa do pliku tekstowego i dopisa na jego kocu odpowiednie
wyraenia --with. Jeli na przykad dodajemy do serwera rozszerzenie
Mcrypt, powinnimy dopisa wyraenie --with-mcrypt. Waciwy parametr
--with z reguy mona znale w dokumentacji instalowanego rozszerzenia.
UWAGA

Jeli zastpimy oryginaln struktur katalogw zawart w pliku tar i umiecimy


nasz bibliotek w folderze innym ni domylny, bdziemy musieli doda do flagi
--with ciek, aby rodowisko PHP mogo t bibliotek odnale. W powyszym
przykadzie taka sytuacja miaa miejsce w przypadku biblioteki apxs (Apache Extension Tool Synopsis), gdzie flaga --with-apxs=/usr/local/apache/bin/apxs okrelaa,
e wspomniana biblioteka jest skadowana w katalogu /usr/local/apache/bin/apxs.
8. Pobranie i rozpakowanie plikw
rdowych nowej dystrybucji PHP

oraz przejcie do katalogu, w ktrym umieszczono rozpakowane pliki.


Kod rdowy PHP mona rozpakowa dokadnie tak, jak wczeniej
rozpakowalimy kod rdowy biblioteki. Jeli dysponujesz ju
utworzonym wczeniej drzewem kodu PHP, moesz je wykorzysta ,
jednak w takim przypadku koniecznie uyj polecenia make clean.
9. Skopiowanie polecenia configure utworzonego wczeniej w pliku

tekstowym, wklejenie go w wierszu polece i nacinicie klawisza Enter,


aby je wykona. W ten sposb ponownie skonfigurujemy rodowisko
PHP z now bibliotek i wszystkimi dotychczasowymi bibliotekami.

Konfigurowanie PHP

47

10. Kompilacja kodu


rdowego PHP. Naley wykona kolejno polecenia
make i make install. Warto si przygotowa na dugie oczekiwanie, a

wymienione polecenia odpowiednio skompiluj i zainstaluj wszystkie


komponenty PHP.
UWAGA

W razie dokonania jakichkolwiek zmian w plikach .ini (podobnych do tych pokazanych we wczeniejszej czci tego rozdziau) wprowadzone modyfikacje mog
zosta nadpisane ustawieniami domylnymi w czasie ponownego kompilowania
PHP. W takim przypadku warto do tych ustawie wrci, aby mie pewno, e
nasza konfiguracja nie zostaa zmieniona.
11. Ponowne uruchomienie serwera Apache. Naley wykona polecenie
apachectl graceful.
12. Przetestowanie rodowiska PHP. W pierwszej kolejnoci warto uruchomi

skrypt Witaj wiecie!, aby sprawdzi , czy wanie zainstalowane rodowisko


dziaa waciwie. Nastpnie dobrze jest poeksperymentowa z wywoaniami
rozmaitych funkcji definiowanych przez biblioteki, aby mie pewno ,
e take nowe biblioteki nie stwarzaj niespodziewanych problemw.

Co moe pj nie po naszej myli?


Liczba problemw, ktre mog wystpi w czasie kompilacji, jest tak duga, e
omwienie ich wszystkich jest niemal niemoliwe. Chocia wiele bdw jest
do skomplikowanych, a znaczna ich cz jest cile zwizana z poszczeglnymi
bibliotekami (i tym samym wymaga bardzo specjalistycznych porad), trzy typowe problemy wystpuj niemal zawsze.
Pierwszym powanym problemem, z ktrym moemy si zetkn , jest brak
zainstalowanych pakietw wytwarzania oprogramowania w pobranej dystrybucji lub wersji. W takim przypadku bdziemy potrzebowali kompilatora jzyka C
i rozmaitych wersji deweloperskich wielu innych bibliotek potrzebnych do
skompilowania kodu.
Po drugie, moemy stan przed koniecznoci skonfigurowania rodowiska
PHP z wykorzystaniem parametru --with definiujcego wprost ciek do doczanej biblioteki, np. --with-mcrypt=/usr/lib/mcrypt.
Innym powszechnym rdem problemw s le skonfigurowane pakiety bibliotek rozszerze. Jak ju wspomniano, bibliotek Mcrypt naley skonfigurowa z flagami --disable-nls --disable-posix-threads; w przeciwnym razie stosowanie tego pakietu moe prowadzi nawet do awarii serwera Apache. Take
inne biblioteki wymagaj do prawidowego funkcjonowania w rodowisku PHP
i na serwerze Apache pewnych dodatkowych zabiegw. Szczegowych informacji na ten temat naley szuka na stronach internetowych z najczciej zadawanymi pytaniami, stronach pomocy systemowej oraz w plikach README.

48

Rozdzia 2

You might also like