PHP. Praktyczne skrypty,
które oszczêdz¹ Twój czas
Autor: William Steinmetz, Brian Ward
T³umaczenie: Miko³aj Szczepaniak
ISBN: 978-83-246-1851-4
Wicked Cool PHP: Real-World Scripts
That Make Difficult Things Possible
Format: 80x235, stron: 248
Obszerny zbiór przydatnych skryptów! Musisz go mieæ!
•
Jak skonfigurowaæ œrodowisko PHP?
•
Jak tworzyæ bezpieczne skrypty PHP?
•
Jakie skrypty musisz znaæ?
PHP jest ³atwym w u¿yciu jêzykiem skryptowym. £atwym, a przez to niezwykle popularnym.
Jednak, czy ktoœ mówi³, ¿e w ³atwym jêzyku nie mo¿na napotkaæ na skomplikowane
problemy? Niestety odpowiedz brzmi – nie. Jednak nie za³amuj r¹k! Dziêki swej popularnoœci,
w sieci istnieje niezliczona liczba stron zawieraj¹cych informacje, które mog¹ byæ przydatne
w rozwi¹zywaniu Twoich problemów.
Ale po co szukaæ pere³ek wœród masy kiepskich rozwi¹zañ? Czy¿ nie lepiej siêgn¹æ po
ksi¹¿kê, która zawiera³aby rozwi¹zania najczêstszych zadañ? Oczywiœcie, ¿e tak. W³aœnie
tak¹ ksi¹¿kê trzymasz przed sob¹! Ksi¹¿ka ta zawiera blisko 80 skryptów pozwalaj¹cych
na rozwi¹zanie najró¿niejszych zadañ, pocz¹wszy od formatowania dat i ci¹gów znaków,
skoñczywszy na skryptach wykorzystuj¹cych pocztê elektroniczn¹. Dziêki tej ksi¹¿ce dowiesz
siê miêdzy innymi, jak tworzyæ bezpieczne skrypty oraz pracowaæ z formularzami. Dodatkowo
poznasz sposoby konfiguracji samego PHP. Dziêki ksi¹¿ce
„
Praktyczne skrypty, które
oszczêdz¹ Twój czas
”
twoje skrypty bêd¹ lepsze, a Ty zyskasz wiêcej wolnego czasu!
•
Zestaw skryptów, które musi znaæ ka¿dy programista
•
Tworzenie szablonów Smarty
•
Konfigurowanie œrodowiska PHP
•
Przegl¹d wszystkich ustawieñ PHP
•
Zastosowanie pakietu SafeHTML
•
Zapobieganie atakom XSS
•
Zapewnienie bezpieczeñstwa 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 plików w codziennej pracy
•
Monitorowanie sesji u¿ytkownika
•
Mechanizm logowania do aplikacji
•
Tworzenie obrazów CAPTCHA
•
Operowanie danymi w formacie XML
•
Operowanie grafik¹
Nie traæ czasu na poszukiwanie dobrych rozwi¹zañ! Miej je pod rêk¹!
Spis treci
WPROWADZENIE ....................................................................................... 9
1.
NAJCZCIEJ ZADAWANE YCIOWE PYTANIA — SKRYPTY,
KTÓRE KADY PROGRAMISTA PHP CHCE (MUSI) ZNA ...................... 11
Skrypt nr 1: Doczenie innego pliku w formie czci danego skryptu ..................................12
Co moe pój 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 przywrócenia oryginalnej struktury ...........................................24
Co moe pój nie po naszej myli? ...................................................................................24
Skrypt nr 6: Sortowanie tablic wielowymiarowych ................................................................25
Doskonalenie tego skryptu ................................................................................................26
Skrypt nr 7: Tworzenie dla witryny internetowej szablonów Smarty ....................................26
Instalacja biblioteki Smarty .................................................................................................27
Krótki podrcznik Smarty ..................................................................................................28
Co moe pój 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 poszczególnych ustawie ........................................................33
Skrypt nr 10: Raportowanie o bdach ...................................................................................35
Typowe komunikaty o bdach ..........................................................................................35
4
S p i s t r e c i
Skrypt nr 11: Ukrywanie wszystkich komunikatów o bdach .............................................. 37
Skrypt nr 12: Wyduanie czasu wykonywania skryptu ......................................................... 38
Co moe pój nie po naszej myli? ................................................................................... 38
Skrypt nr 13: Uniemoliwianie uytkownikom wysyania wielkich plików ........................... 38
Skrypt nr 14: Wyczanie rejestrowanych zmiennych globalnych ......................................... 39
Skrypt nr 15: Wczanie „magicznych cudzysowów” ........................................................... 39
Co moe pój nie po naszej myli? ................................................................................... 40
Skrypt nr 16: Ograniczanie dostpu PHP do plików ......................................................... 40
Co moe pój 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 pój 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 pój nie po naszej myli? ................................................................................... 57
Skrypt nr 22: Ochrona danych za pomoc jednokierunkowej funkcji generujcej skróty ..... 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: Spójne i bezpieczne uzyskiwanie zmiennych formularza ................................. 67
Skrypt nr 26: Usuwanie zbdnych znaków 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 przycisków akceptacji formularza ....................................... 74
Skrypt nr 30: Weryfikacja kart kredytowych ......................................................................... 74
Stosowanie tego skryptu ................................................................................................... 77
Doskonalenie tego skryptu ................................................................................................ 77
S p i s t r e c i
5
Skrypt nr 31: Podwójne sprawdzanie daty wyganicia wanoci karty kredytowej .............77
Stosowanie tego skryptu ....................................................................................................79
Skrypt nr 32: Sprawdzanie poprawnoci adresów poczty elektronicznej ..............................79
Skrypt nr 33: Sprawdzanie poprawnoci numerów 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 wyrazów ........................................................................86
Co moe pój nie po naszej myli? ...................................................................................87
Skrypt nr 36: Odnajdywanie podacuchów ..........................................................................88
Co moe pój nie po naszej myli? ...................................................................................89
Skrypt nr 37: Zastpowanie podacuchów ...........................................................................89
Co moe pój nie po naszej myli? ...................................................................................90
Skrypt nr 38: Odnajdywanie i poprawianie literówek za pomoc moduu pspell ..................91
Praca ze sownikiem domylnym .......................................................................................91
Dodawanie sownika niestandardowego do biblioteki pspell .............................................94
Co moe pój nie po naszej myli? ...................................................................................95
Skrypt nr 39: Wyraenia regularne ........................................................................................96
Podstawy wyrae regularnych .........................................................................................96
Sekwencje znaków specjalnych ..........................................................................................97
Repetytory wzorców .........................................................................................................98
Grupowanie .......................................................................................................................99
Klasy znaków ......................................................................................................................99
Poczenie wszystkich omówionych elementów ...............................................................99
Dopasowywanie i wyodrbnianie tekstu za pomoc wyrae regularnych .....................100
Zastpowanie podacuchów 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 adresów URL na hipercza ..................................109
Skrypt nr 44: Usuwanie znaczników jzyka HTML z acuchów .........................................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 znaczników czasowych na podstawie acucha .............................................115
Tworzenie znaczników 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
6
S p i s t r e c i
Skrypt nr 49: Odnajdywanie rónic 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 plików ......................................................................................... 125
Uprawnienia ustawiane za porednictwem programu FTP ............................................ 127
Wiersz polece ................................................................................................................ 127
Co moe pój nie po naszej myli? ................................................................................. 127
Skrypt nr 50: Umieszczanie zawartoci pliku w zmiennej ................................................... 128
Doskonalenie tego skryptu .............................................................................................. 130
Co moe pój nie po naszej myli? ................................................................................. 131
Skrypt nr 51: Tworzenie plików i zapisywanie danych w plikach ....................................... 131
Skrypt nr 52: Sprawdzanie, czy interesujcy nas plik istnieje .............................................. 132
Skrypt nr 53: Usuwanie plików ........................................................................................... 133
Skrypt nr 54: Wysyanie obrazów do katalogu .................................................................... 133
Stosowanie tego skryptu ................................................................................................. 138
Co moe pój nie po naszej myli? ................................................................................. 138
Doskonalenie tego skryptu .............................................................................................. 138
Skrypt nr 55: Odczytywanie plików 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 pój nie po naszej myli? ................................................................................. 145
Skrypt nr 57: Wykorzystywanie sesji do tymczasowego skadowania danych .................... 146
Co moe pój nie po naszej myli? ................................................................................. 148
Skrypt nr 58: Sprawdzanie, czy przegldarka internetowa uytkownika obsuguje ciasteczka .....148
Skrypt nr 59: Przekierowywanie uytkowników 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
S p i s t r e c i
7
Instalacja pakietu PHPMailer ............................................................................................162
Stosowanie tego skryptu ..................................................................................................164
Dodawanie zaczników ...................................................................................................165
Co moe pój nie po naszej myli ..................................................................................166
Skrypt nr 65: Wykorzystywanie wiadomoci poczty elektronicznej
do weryfikacji kont uytkowników ......................................................................................167
10.
PRACA Z OBRAZAMI ............................................................................ 173
Skrypt nr 66: Tworzenie obrazów CAPTCHA zabezpieczajcych system ..........................173
Skrypt nr 67: Tworzenie miniaturek obrazów .....................................................................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 PROJEKTÓW .............................. 205
Skrypt nr 74: Internetowe gosowanie .................................................................................206
Tworzenie formularza z kart do gosowania ..................................................................207
Przetwarzanie karty do gosowania .................................................................................209
Uzyskiwanie wyników gosowania ...................................................................................211
Doskonalenie tego skryptu ..............................................................................................213
Skrypt nr 75: Elektroniczne kartki z pozdrowieniami ..........................................................214
Wybór kartki ....................................................................................................................216
Wysyanie kartki elektronicznej .......................................................................................218
Wywietlanie kartki ..........................................................................................................221
Doskonalenie tego skryptu ..............................................................................................224
Skrypt nr 76: System blogu ..................................................................................................225
Tworzenie wpisów na blogu ............................................................................................226
Wywietlanie wpisu na blogu ...........................................................................................228
Dodawanie komentarzy ...................................................................................................232
Tworzenie indeksu blogu .................................................................................................233
Doskonalenie tego skryptu ..............................................................................................236
DODATEK .............................................................................................. 239
SKOROWIDZ .......................................................................................... 241
2
Konfigurowanie PHP
J
AK KADY PAKIET OPROGRAMOWANIA
,
TAK I
PHP
OFERUJE
WIELE OPCJI KONFIGURACYJNYCH
,
KTÓRE W TEN CZY INNY
SPOSÓB WPYWAJ NA SPOSÓB 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 dodatków do PHP (okrelanych
mianem bibliotek) uzupeniajcych t technologi o nowe moliwoci. Na przy-
kad rozszerzenie cURL umoliwia serwerowi wysyanie danych formularzy do in-
nych serwerów i przetwarzanie odsyanych odpowiedzi. Inne przydatne rozsze-
rzenie, Mcrypt, umoliwia nam atwe i skuteczne szyfrowanie danych celem
bezpiecznego skadowania poufnych informacji.
W tym rozdziale zajmiemy si ustawieniami konfiguracyjnymi najczciej wyko-
rzystywanymi przez programistów PHP oraz sytuacjami, w których stosowanie tych
ustawie jest uzasadnione.
Ustawienia konfiguracyjne i plik php.ini
Wikszo pocztkujcych programistów 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 , dlacze-
go wic nie poprzestawia mebli czy nie zburzy paru cian?
32
R o z d z i a 2
W zalenoci od konfiguracji samego komputera, na którym pracuje Twój serwer
WWW, moesz nie mie moliwoci samodzielnego modyfikowania ustawie .
Dobrzy operatorzy serwerów nie maj jednak nic przeciwko wprowadzaniu nie-
zbdnych zmian w Twoim imieniu, a najlepsze firmy tego typu oferuj nawet moli-
wo modyfikacji ustawie za porednictwem specjalnych plików konfiguracyjnych.
Ustawienia rodowiska PHP s skadowane w pliku nazwanym php.ini, który
mona przeglda i modyfikowa w dowolnym edytorze tekstu. Ustawienia, które
podzielono pomidzy sekcje, maj nastpujc posta :
max_execution_time = 30
; Maksymalny czas wykonywania
max_input_time = 60
; Maksymalny czas analizy skadniowej danych wejciowych
memory_limit = 8M
; Maksymalna ilo pamici zajmowanej przez skrypt
Parametry konfiguracyjne mona ustawia za pomoc znaku równoci (
=
).
rednik (
;
) oznacza, e mamy do czynienia z komentarzem; okazuje si jednak,
e istniej wyjtki od tej reguy umoliwiajce stosowanie redników w niektó-
rych parametrach. Gdybymy chcieli trwale zmieni jakie ustawienie, powinnimy
sporzdzi kopi zapasow pliku php.ini, zmodyfikowa oryginalny plik konfi-
guracyjny i ponownie uruchomi serwer Apache. Gdybymy chcieli zmienia
ustawienia na poziomie skryptu, powinnimy uy funkcji
ini_set()
.
Lokalizowanie pliku php.ini
W niektórych przypadkach wskazanie miejsca skadowania pliku php.ini w syste-
mie, w którym pracujemy (szczególnie jeli korzystamy z wielu instalacji rodowiska
PHP), bywa trudne. Poniej opisano kilka sposobów lokalizowania tego pliku:
Q
Uytkownicy systemów UNIX powinni zajrze do katalogu /usr/lib
lub /usr/local/lib. Plik php.ini powinien si znajdowa w podkatalogu lib
w miejscu, w którym zainstalowano PHP.
Q
Uytkownicy systemu Windows powinni zwróci 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 plików
pasujcych do wzorca php.ini za pomoc polecenia
locate php.ini
.
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.
UWAGA
UWAGA
K o n f i g u r o w a n i e P H P
33
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 ele-
menty wchodz w skad danej instalacji rodowiska PHP, mona wykorzysta
bardzo prosty skrypt. Moliwo uzyskiwania tego rodzaju danych jest o tyle nie-
bezpieczna, e szeroki zakres prezentowanych informacji stanowi swoisty pod-
rcznik dla potencjalnych atakujcych. Funkcja
phpinfo()
zdaje si mówi : „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 kon-
figuracji. Naprawd wszystko. Zwracane informacje nie ograniczaj si tylko do sta-
nu poszczególnych ustawie konfiguracyjnych PHP, pooenia pliku php.ini czy
wersji samego rodowiska PHP — obejmuj take wersj serwera WWW, skompi-
lowane rozszerzenia oraz dane interfejsu API serwera. Warto zwróci szczególn
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 po-
trzebnych informacji.
Skrypt nr 9: Odczytywanie
poszczególnych ustawie
Czasem, kiedy wiemy, czego szukamy, stosowanie funkcji
phpinfo()
jest prze-
sadne i niepotrzebne. Moemy na przykad by zainteresowani tylko sprawdze-
niem, czy mechanizm „magicznych cudzysowów” jest wczony, lub okrele-
niem cieki doczania. Co wicej, funkcja
phpinfo()
w aden sposób nam nie
pomoe, jeli pisany skrypt zachowuje si inaczej w razie wczenia jakiego usta-
wienia i inaczej w sytuacji, gdy to ustawienie jest wyczone.
Aby uzyska warto okrelonego ustawienia konfiguracyjnego, naley uy
funkcji
ini_get()
:
34
R o z d z i a 2
<?php
echo "Warto opcji register_globals: " . ini_get('register_globals');
?>
Wystarczy przekaza na wejciu funkcji
ini_get()
prawidow nazw para-
metru konfiguracji, a otrzymamy aktualne ustawienie tego parametru na biecym
serwerze. Opcja jest zwracana w formie zwykej wartoci, zatem mona j wywie-
tli , 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
acuchów pustych, zatem jeli spróbujemy wywietli ustawienie
"off"
para-
metru
register_globals
, by moe otrzymamy nastpujcy komunikat:
Warto opcji register_globals:
Po drugie: wartoci numeryczne czsto s reprezentowane w formie skróconej.
Jeli na przykad parametrowi
upload_max_filesize
przypisano warto 8192 baj-
tów, zostanie zwrócona warto 8 kB. Podobnie, jeli maksymalny rozmiar wysya-
nego pliku ustalono na poziomie 2 MB, dla parametru
upload_max_filesize
otrzymamy warto 2 MB, a nie 2 097 152 bajty.
Taki sposób reprezentowania numerycznych ustawie konfiguracyjnych mo-
e stanowi powany problem, jeli chcemy na tych liczbach wykonywa opera-
cje arytmetyczne. Oficjalna dokumentacja PHP wspomina o funkcji konwertuj-
cej wartoci skrócone (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;
}
}
K o n f i g u r o w a n i e P H P
35
Skrypt nr 10: Raportowanie o bdach
Pracujc nad kodem, czsto zapominamy nazw stosowanych zmiennych lub ko-
rzystamy z przestarzaych, niezalecanych konstrukcji. W niektórych przypad-
kach jzyk PHP okazuje si na tyle przyjazny uytkownikowi (przynajmniej jak
na standardy programowania), e sam naprawia wiele drobnych bdów w kodzie.
PHP umoliwia nam midzy innymi pisanie programów 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 sposób, a mimo to skrypt
PHP bdzie dziaa prawidowo, poniewa w wikszoci przypadków bdzie
przyjmowa pewne zaoenia wobec zamiarów programisty. Tego rodzaju mechani-
zmy s oczywicie bardzo podane, dopóki PHP prawidowo odgaduje nasze in-
tencje — w przeciwnym razie poszukiwanie tajemniczego bdu moe nam zaj
mnóstwo czasu.
Aby wyczy mechanizmy automatycznego usuwania problemów, 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 raporto-
wania 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 ko-
munikaty jeszcze przed przetworzeniem dalszej czci danego programu. (Takie
rozwizanie uniemoliwia ustawianie ciasteczek w razie wystpienia bdu, zatem
nie powinnimy nawet próbowa 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
36
R o z d z i a 2
Komunikat w tej formie oznacza, e korzystamy ze zmiennej, której 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 próbujemy konkatenowa zmienn bez jej uprzedniego
zadeklarowania.
Inny popularny problem wystpuje duo czciej w sytuacji, gdy w swoim
programie próbujemy 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
prób przekazania acucha na wejciu funkcji bez otaczajcych go cudzyso-
wów. 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 prób odczytania
elementu
$tablica[i]
, mimo e tablica
$tablica
nie definiuje elementu pod
tym indeksem. Z tego rodzaju bdami mamy do czynienia w sytuacji, gdy uzy-
skujemy 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 ogóle 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 szcze-
gólnoci problemy ze ledzeniem sesji).
K o n f i g u r o w a n i e P H P
37
Skrypt nr 11: Ukrywanie wszystkich
komunikatów 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 komunikatów o bdach (odkrywajcych informacje, co szcze-
gólnie ceni sobie hakerzy).
Na szczcie istnieje moliwo powstrzymania PHP przed wywietlaniem
wszystkich komunikatów o bdach. Wystarczy w pliku php.ini umieci nast-
pujcy wiersz:
display_errors = Off
Przytoczone rozwizanie warto stosowa w rodowisku docelowym aplikacji
internetowej, aby w przyszoci nie obawia si szerokiej dostpnoci komuni-
katów diagnostycznych PHP odnonie do naszego kodu. Gdybymy chcieli za-
pozna si z tymi komunikatami celem wyeliminowania ewentualnych problemów,
powinnimy uy nastpujcego ustawienia konfiguracyjnego wymuszajcego
kierowanie tych komunikatów do dziennika zdarze serwera Apache:
log_errors = On
W razie potrzeby mona nawet wysya komunikaty diagnostyczne do dzien-
nika systemowego lub wskazanego pliku — parametrowi
error_log
naley wów-
czas przypisa odpowiednio warto
syslog
lub nazw pliku.
Pozostaje jeszcze kwestia naszego rodowiska wytwarzania, gdzie z reguy
chcemy uzyskiwa moliwie wiele komunikatów diagnostycznych. Po przypisa-
niu parametrowi
display_errors
wartoci
On
mona dodatkowo (w pliku php.ini)
ustawi struktur bitow w parametrze
error_reporting
(wicej szczegóów na
ten temat mona znale w przykadowym pliku php.ini instalowanym wraz ze
rodowiskiem PHP). Jeli jednak chcemy „uciszy ” jaki skrypt, który nieustannie
zasypuje nas tymi samymi komunikatami, moemy uy w jego kodzie nastpuj-
cego wywoania funkcji:
error_reporting(0);
38
R o z d z i a 2
Skrypt nr 12: Wyduanie czasu
wykonywania skryptu
Pracowaem kiedy w firmie, która postawia sobie za cel zmian mechanizmu
obsugi koszyków z zakupami. Do moich zada naleao napisanie skryptu od-
powiedzialnego za konwersj 250 MB danych o produktach ze starego na nowy
format. Skrypt dziaa co prawda znakomicie, jednak ilo przetwarzanych da-
nych powodowaa, e rodowisko PHP stale przerywao jego wykonywanie po
upywie 30 sekund, a wic na dugo przed osigniciem zamierzonego celu.
Wanie wówczas odkryem drobne rozszerzenie, które 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 wyko-
nywania skryptu przed jego automatycznym zakoczeniem. Nie naley jednak tego
parametru naduywa . Jeli dany skrypt dziaa kilka minut, to albo usprawie-
dliwia nas ogromna ilo przetwarzanych informacji (najpewniej zaczerpnitych
z bazy danych), albo nasz skrypt jest bardzo nieefektywny, albo korzystamy z
niewaciwego jzyka programowania.
Co moe pój 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 plików
Gdybymy chcieli uniemoliwi uytkownikom naszej aplikacji wysyanie na
serwer 70-gigabajtowych MPEG-ów z najnowszym filmem „Gwiezdne wojny”,
powinnimy okreli maksymalny rozmiar plików kopiowanych na serwer.
(Szczegóowe omówienie samych technik przetwarzania wysyanych plików
mona znale w podrozdziale „Skrypt nr 54: Wysyanie obrazów do katalogu”
w rozdziale 7.).
upload_max_filesize = 500K
K o n f i g u r o w a n i e P H P
39
Maksymalny rozmiar plików wysyanych na serwer mona okreli na jeden
z trzech sposobów:
Q
w formie wartoci cakowitoliczbowej (wyraajcej czn liczb bajtów);
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 kilobajtów).
Niezalenie od uytego formatu nasi uytkownicy nie bd mogli wysa na
serwer pliku, którego rozmiar bdzie przekracza tak zdefiniowany próg. Domyl-
nym rozmiarem maksymalnym s 2 MB.
Skrypt nr 14: Wyczanie rejestrowanych
zmiennych globalnych
Jzyk PHP oferuje przestarza, niezalecan funkcj, która nieznacznie uatwia
dostp do parametrów da
GET
i
POST
protokou HTTP. Jeli na przykad da-
nie
POST
zawiera parametr nazwany
mojparam
, PHP moe automatycznie umie-
ci 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 cudzysowów”
„Magiczne cudzysowy” (ang. magic quotes) to wygodne narzdzie stosowane
przez administratorów serwerów 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-
40
R o z d z i a 2
przedzaniu wszystkich apostrofów, cudzysowów i lewych ukoników dodatkowym
znakiem lewego ukonika (tzw. znakiem ucieczki) we wszystkich danych zapisywa-
nych w zmiennych skryptu PHP i pochodzcych z formularzy HTML. W ten
sposób na przykad acuch
"Ferrett's Book"
zostanie przeksztacony w acuch
\"Ferrett\'s Book\"
.
Mechanizm „magicznych cudzysowów” nie jest rozwizaniem idealnym, je-
li 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 pój nie po naszej myli?
Jeli nie wczymy mechanizmu „magicznych cudzysowów”, bdziemy musieli
korzysta z funkcji
mysql_real_escape_string()
, aby zagwarantowa stosowanie
sekwencji ucieczki w wykorzystywanych danych. Jeli jednak uyjemy tej funk-
cji dla danych w sytuacji, gdy mechanizm „magicznych cudzysowów” bdzie
wczony, ryzykowne znaki zostan poprzedzone podwójnymi 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 plików
Jeli obawiasz si wrogiego skryptu PHP uzyskujcego dostp do plików syste-
mowych (np. do pliku hase), moesz uy ustawienia
open_basedir
do ograni-
czenia zbioru katalogów dostpnych z poziomu kodu PHP. Po ustawieniu tej
opcji skrypt PHP nie bdzie móg otwiera ani modyfikowa adnych plików
spoza wskazanego katalogu. Poniej przedstawiono wiersz pliku php.ini ograni-
czajcy dostp tylko do katalogu /home/www:
open_basedir = /home/www
Istnieje moliwo zapewniania skryptom dostpu do wielu katalogów —
w systemie UNIX naley je oddziela dwukropkami (
:
); w systemie Windows
kolejne katalogi oddzielamy rednikami (
;
).
PHP domylnie zapewnia dostp zarówno do wskazanego katalogu, jak i wszystkich
jego podkatalogów. Gdybymy chcieli ograniczy ten dostp tylko do plików w okre-
lonym katalogu, na ko cu uytej cieki powinnimy uy ukonika (np. /home/www/).
UWAGA
K o n f i g u r o w a n i e P H P
41
Co moe pój 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. Ponie-
wa katalog tymczasowy z reguy dzieli spora odlego od pozostaych plików
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()
, która umoliwia bezporednie wyko-
nywanie polece na serwerze z poziomu skryptów PHP, za zbyt niebezpieczn.
Okazuje si, e istnieje moliwo wyczania obsugi poszczególnych funkcji
PHP (wanie z myl o wyeliminowaniu luk w zabezpieczeniach) z zachowa-
niem moliwoci stosowania wszystkich pozostaych funkcji. Poniej przedsta-
wiono przykad wiersza pliku php.ini wyczajcego obsug kilku szczególnie
ryzykownych funkcji:
disable_functions = system, exec, passthru, shell_exec, proc_open
Skrypt nr 18: Dodawanie rozszerze do PHP
Naprawd powani programici prdzej czy póniej odkrywaj pewne ograni-
czenia jzyka PHP. Mimo ogromnej liczby wbudowanych funkcji i mechani-
zmów sam jzyk PHP nie oferuje rdzennych rozwiza w zakresie szyfrowania,
grafiki, dostpu do innych stron internetowych czy przetwarzania danych w forma-
cie XML.
Te i inne cele mona jednak osiga dziki niezliczonym rozszerzeniom wy-
korzystujcym biblioteki tworzone przez niezalenych programistów 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 porednic-
twem swoistego protokou zbudowanego na bazie adresów URL. (Najczciej
korzystamy z protokou HTTP, który umoliwia nam komunikacj z innymi
stronami internetowymi, oraz protokou FTP umoliwiajcego nam wysyanie
i pobieranie plików). W praktyce oznacza to, e nasz serwer moe by trak-
towany przez inne witryny jak przegldarka internetowa, a pobierane strony
WWW moemy umieszcza w dowolnych zmiennych w ramach swoich
skryptów.
42
R o z d z i a 2
cURL jest niezwykle wanym narzdziem dla programistów pracujcych nad
powanymi sklepami internetowymi, poniewa umoliwia nam akceptowa-
nie patnoci kartami kredytowymi i wyceny towarów dla poszczególnych
klientów w czasie rzeczywistym. Za pomoc rozszerzenia cURL mona nawi-
zywa poczenia i wysya dane o transakcjach na serwer innej firmy. W od-
powiedzi otrzymujemy wówczas 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 infor-
macji nie bdzie moliwy przez zwyky zrzut zawartoci bazy danych. Na
szczcie biblioteka Mcrypt umoliwia nam naprawd skuteczne szyfrowa-
nie danych bez cho by szcztkowej znajomoci technik szyfrowania! (Sposoby
korzystania z tego rozszerzenia zostan szczegóowo omówione w podroz-
dziale „Skrypt nr 23: Szyfrowanie danych za pomoc rozszerzenia Mcrypt”
w rozdziale 3.).
GD
Gdybymy chcieli tworzy obrazy graficzne na danie lub po prostu uzy-
skiwa szczegóowe 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 wykresów) albo modyfikowa (np. tworzc
miniaturki istniejcych obrazów).
MySQL
Podstawowa wersja rodowiska PHP w ogóle „nie wie”, jak uzyskiwa do-
stp do baz danych. Poniewa jednak system MySQL i jzyk PHP s jak Zan
i Jayna z popularnej kreskówki, wikszo serwerów WWW przystosowa-
nych do obsugi PHP oferuje te domylnie instalowane biblioteki systemu
MySQL, zatem wikszo programistów korzysta z funkcji
mysql_connect()
,
nie wiedzc, e jest ona czci rozszerzenia.
Zbiór 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 rozwi-
zaniem jest doczanie do rodowiska PHP wszystkich rozszerze, które 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.
K o n f i g u r o w a n i e P H P
43
Dodawanie rozszerze jzyka PHP
Skoro wiemy ju, co mona zyska , instalujc rozszerzenia, przyjrzyjmy si sa-
mem 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 serwerów WWW domylnie instaluje najbardziej przydatne i najpopular-
niejsze rozszerzenia, zatem przed podjciem prób odszukania i instalacji intere-
sujcej 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: Odkrywa-
nie wszystkich ustawie PHP” we wczeniejszej czci tego rozdziau). List
zwrócon przez t funkcj naley dokadnie przejrze w poszukiwaniu naszych
bibliotek. Jeli na przykad rodowisko PHP obejmuje zainstalowane rozszerze-
nie 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 administratorów zdalnych serwerów
Jeli korzystamy z serwera WWW bdcego wasnoci innej firmy (tak robi
wikszo programistów), musimy si zda na ask administratora tego ser-
wera. Poniewa z natury rzeczy nie dysponujemy hasem administratora, nie
44
R o z d z i a 2
moemy instalowa niezbdnych bibliotek samodzielnie. W takim przypadku
musimy o to poprosi administratora wynajmowanego serwera. Kierujc odpo-
wiednie zlecenie, powinnimy si upewni , e administrator dysponuje precy-
zyjnymi informacjami; w przeciwnym razie moe si okaza , e zostaa zainsta-
lowana niewaciwa wersja lub wrcz niewaciwe rozszerzenie.
Niektóre firmy zrealizuj nasz prob bez najmniejszych problemów. Inne
bd oczekiway dodatkowych opat za obcianie swoich serwerów dodatko-
wymi rozszerzeniami. Jeszcze inne odpowiedz: „Nasza oferta nie obejmuje ob-
sugi dodatkowych rozszerze. Ograniczamy si tylko do standardowego PHP”.
Jeli z jakiego powodu nie moesz zainstalowa potrzebnych rozszerze,
moesz albo spróbowa poradzi sobie bez nich, albo zmieni firm obsugujc
serwery.
Nawet jeli korzystamy z wasnego serwera, ale nie potrafimy prawidowo zain-
stalowa niezbdnych rozszerze , warto zwróci si z prob o instalacj nowych
bibliotek do pracowników wsparcia technicznego. W takim przypadku w razie nie-
powodzenia procesu instalacji technicy bd w stanie naprawi usterk (przy-
najmniej teoretycznie).
Instalacja rozszerze
za pomoc internetowego panelu sterowania
Dzierawione serwery czsto oferuj specjalne panele sterowania, za pored-
nictwem których moemy realizowa typowe zadania administracyjne (w tym
zadanie ponownego uruchomienia usugi Apache lub restartu caego serwera)
w oknie przegldarki internetowej.
Niektóre panele sterowania oferuj nawet moliwo automatycznego kom-
pilowania serwera Apache i rodowiska PHP wskutek zaznaczenia pól 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, która powoduje ponown instalacj serwera
Apache i rodowiska PHP wraz z wybranymi daniami.
Jeli Twój 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 in-
stalacja tego rodowiska wraz z niezbdnymi rozszerzeniami. Dla programistów,
którzy nie maj dowiadczenia w roli administratorów systemów UNIX, ponowna
kompilacja rodowiska PHP czsto jest powanym wyzwaniem.
Najlepszym rozwizaniem jest przystpienie do eksperymentów z lokalnym
serwerem Apache z dala od docelowego rodowiska pracy aplikacji interneto-
wej. Poniewa zmiany wprowadzane w konfiguracji pracujcego serwera mog
UWAGA
K o n f i g u r o w a n i e P H P
45
doprowadzi do powanych problemów, warto uprzednio sprawdzi , czy w razie
kopotów 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 zwróci 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 roz-
szerzenia.
Instalowanie bibliotek
Szczegóowe kroki skadajce si na proces instalacji rozszerzenia w duej mie-
rze zale od dodawanej biblioteki. Mona oczywicie sformuowa ogólne za-
sady rzdzce tym procesem, jednak przed przystpieniem do instalacji zawsze
naley si zapozna z podrcznikami dostpnymi na stronie biblioteki oraz
wszystkimi plikami README. Czytelnicy zainteresowani szczegóowym wyja-
nieniem 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 ogólne kroki skadajce si na proces insta-
lacji bibliotek:
1.
Zalogowanie na serwerze jako administrator lub uytkownik z prawem
instalacji nowych programów.
2.
Pobranie archiwum biblioteki i umieszczenie go w katalogu gównym
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
ródowe. Pliki ródowe 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 plików i katalogów. 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 rónic, e plik .tar.gz powstaje
w dwóch etapach i z wykorzystaniem dwóch rónych programów.
Okazuje si jednak, e nie musimy wprost uruchamia obu tych narzdzi,
poniewa program tar w wersji GNU „wie”, jak korzysta z narzdzia de-
kompresujcego. Wypakowanie zawartoci archiwum tar wymaga wydania
polecenia
tar zxvf
nazwaplikubiblioteki.tar.gz
w wierszu polece. W wyniku
tego polecania otrzymamy list wypakowanych wszystkich plików i katalogów.
1
Polskie wydanie: Jak dziaa Linux, Helion, 2005 — przyp. tum.
46
R o z d z i a 2
Wikszo archiwów 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 ogóle 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 znaków
w nazwach katalogów 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 rónorodno dostpnych systemów
UNIX instalacja pakietów w tych systemach wymaga pewnej wiedzy
i dowiadczenia. Na szczcie polecenie
configure
w wikszoci przypadków
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
.
Niektóre rozszerzenia wymagaj do waciwego dziaania stosowania dodat-
kowych flag za poleceniem
configure
. Na przykad rozszerzenie Mcrypt
wymaga od nas wydania polecenia
./configure --disable-nls --disable-
posix-threads
, poniewa tylko w ten sposób 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 kon-
figuracyjnych.
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, które skadaj si na proces
kompilacji. Nastpnie powinnimy uy polecenia
make check
celem
wykonania na tym pakiecie automatycznych testów (niektóre pakiety nie
zawieraj testów, 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
K o n f i g u r o w a n i e P H P
47
strony danych wygenerowanych przez t funkcj mona znale sekcj za-
tytuowan Configure Command i zawierajc tajemnicz list elementów
podobn do poniszej:
'./configure' '--with-apxs=/usr/local/apache/bin/apxs' '--with-xml'
´'--enable-bcmath' '--enable-calendar' '--enable-ftp' '--enable-magic-
´quotes' '--with-mysql' '--enable-discard-path' '--with-pear' '--enable-
´sockets' '--enable-track-vars' '--enable-versioning' '--with-zlib'
Gdybymy chcieli ponownie zainstalowa rodowisko PHP w stanie, w któ-
rym znajduje si obecnie, dysponowalibymy gotowym poleceniem (a przy-
najmniej 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-magic-
´quotes' '--with-mysql' '--enable-discard-path' '--with-pear' '--enable-
´sockets' '--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 in-
nych, 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.
Jeli zastpimy oryginaln struktur katalogów 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 Exten-
sion 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 plików
ródowych nowej dystrybucji PHP
oraz przejcie do katalogu, w którym umieszczono rozpakowane pliki.
Kod ródowy PHP mona rozpakowa dokadnie tak, jak wczeniej
rozpakowalimy kod ródowy 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 sposób ponownie skonfigurujemy rodowisko
PHP z now bibliotek i wszystkimi dotychczasowymi bibliotekami.
UWAGA
48
R o z d z i a 2
10.
Kompilacja kodu ródowego 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.
W razie dokonania jakichkolwiek zmian w plikach .ini (podobnych do tych poka-
zanych we wczeniejszej czci tego rozdziau) wprowadzone modyfikacje mog
zosta nadpisane ustawieniami domylnymi w czasie ponownego kompilowania
PHP. W takim przypadku warto do tych ustawie wróci, 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 problemów.
Co moe pój nie po naszej myli?
Liczba problemów, które mog wystpi w czasie kompilacji, jest tak duga, e
omówienie ich wszystkich jest niemal niemoliwe. Chocia wiele bdów jest
do skomplikowanych, a znaczna ich cz jest cile zwizana z poszczególnymi
bibliotekami (i tym samym wymaga bardzo specjalistycznych porad), trzy typo-
we problemy wystpuj niemal zawsze.
Pierwszym powanym problemem, z którym moemy si zetkn , jest brak
zainstalowanych pakietów wytwarzania oprogramowania w pobranej dystrybu-
cji 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 do-
czanej biblioteki, np.
--with-mcrypt=/usr/lib/mcrypt
.
Innym powszechnym ródem problemów s le skonfigurowane pakiety bi-
bliotek rozszerze. Jak ju wspomniano, bibliotek Mcrypt naley skonfiguro-
wa z flagami
--disable-nls --disable-posix-threads
; w przeciwnym razie stoso-
wanie 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 zabiegów. Szczegóowych infor-
macji na ten temat naley szuka na stronach internetowych z najczciej zada-
wanymi pytaniami, stronach pomocy systemowej oraz w plikach README.
UWAGA