PHP. Praktyczne skrypty, które oszczędzą Twój czas

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    Favorites, Groups & Events

    PHP. Praktyczne skrypty, które oszczędzą Twój czas - Presentation Transcript

    1. 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 Tytu³ orygina³u: 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¹!
    2. Spis tre ci WPROWADZENIE ....................................................................................... 9 1. NAJCZ}¥CIEJ ZADAWANE ¿YCIOWE PYTANIA — SKRYPTY, KTÓRE KA¿DY PROGRAMISTA PHP CHCE (MUSI) ZNAm ...................... 11 Skrypt nr 1: DoïÈczenie innego pliku w formie czÚ ci danego skryptu ..................................12 Co mo e pój Ê nie po naszej my li? ...................................................................................13 Skrypt nr 2: Naprzemienne kolorowanie wierszy tabeli ........................................................15 Doskonalenie tego skryptu ................................................................................................16 Skrypt nr 3: Tworzenie ïÈczy Poprzednia/NastÚpna ..............................................................18 Stosowanie tego skryptu ....................................................................................................21 Skrypt nr 4: Wy wietlanie zawarto ci tablicy .........................................................................22 Skrypt nr 5: Przeksztaïcanie tablicy w zmiennÈ .....................................................................23 nietablicowÈ z mo liwo ciÈ przywrócenia oryginalnej struktury ...........................................24 Co mo e pój Ê nie po naszej my li? ...................................................................................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 podrÚcznik Smarty ..................................................................................................28 Co mo e pój Ê nie po naszej my li? ...................................................................................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 bïÚdach ...................................................................................35 Typowe komunikaty o bïÚdach ..........................................................................................35
    3. Skrypt nr 11: Ukrywanie wszystkich komunikatów o bïÚdach .............................................. 37 Skrypt nr 12: Wydïu anie czasu wykonywania skryptu ......................................................... 38 Co mo e pój Ê nie po naszej my li? ................................................................................... 38 Skrypt nr 13: Uniemo liwianie u ytkownikom wysyïania wielkich plików ........................... 38 Skrypt nr 14: WyïÈczanie rejestrowanych zmiennych globalnych ......................................... 39 Skrypt nr 15: WïÈczanie „magicznych cudzysïowów” ........................................................... 39 Co mo e pój Ê nie po naszej my li? ................................................................................... 40 Skrypt nr 16: Ograniczanie dostÚpu PHP do plików ......................................................... 40 Co mo e pój Ê nie po naszej my li? ................................................................................... 41 Skrypt nr 17: WyïÈczanie obsïugi okre lonych funkcji ........................................................... 41 Skrypt nr 18: Dodawanie rozszerzeñ do PHP ....................................................................... 41 Dodawanie rozszerzeñ jÚzyka PHP ................................................................................... 43 Instalacja rozszerzeñ za pomocÈ internetowego panelu sterowania ................................. 44 Co mo e pój Ê nie po naszej my li? ................................................................................... 48 3. BEZPIECZE”STWO W PHP ....................................................................... 49 Ustawienia konfiguracyjne zalecane z uwagi na bezpieczeñstwo .......................................... 51 Skrypt nr 19: Wstrzykiwanie kodu jÚzyka SQL ..................................................................... 52 Skrypt nr 20: Zapobieganie prostym atakom typu XSS ......................................................... 54 Skrypt nr 21: Stosowanie pakietu SafeHTML ........................................................................ 56 Co mo e pój Ê nie po naszej my li? ................................................................................... 57 Skrypt nr 22: Ochrona danych za pomocÈ jednokierunkowej funkcji generujÈcej 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 bezpieczeñstwa: formularze nie sÈ godne zaufania .................................................... 65 Strategie weryfikacji .............................................................................................................. 66 Stosowanie zmiennych $_POST, $_GET, $_REQUEST oraz $_FILES do uzyskiwania dostÚpu do danych formularza ............................................... 67 Skrypt nr 25: Spójne i bezpieczne uzyskiwanie zmiennych formularza ................................. 67 Skrypt nr 26: Usuwanie zbÚdnych znaków biaïych .................................................................... 68 Skrypt nr 27: Importowanie zmiennych formularza do tablicy ............................................. 69 Skrypt nr 28: Sprawdzanie, czy odpowied nale y do zbioru prawidïowych warto ci ......... 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 4 Spis tre ci
    4. Skrypt nr 31: Podwójne sprawdzanie daty wyga niÚcia wa no ci karty kredytowej .............77 Stosowanie tego skryptu ....................................................................................................79 Skrypt nr 32: Sprawdzanie poprawno ci adresów poczty elektronicznej ..............................79 Skrypt nr 33: Sprawdzanie poprawno ci numerów telefonu .................................................80 5. PRACA Z TEKSTEM I KODEM J}ZYKA HTML .......................................... 83 Skrypt nr 34: WyodrÚbnianie fragmentu ïañcucha ....................................................................83 Doskonalenie tego skryptu ................................................................................................86 Skrypt nr 35: Zmiana liter ïañcucha na wielkie, maïe lub wielkie litery na poczÈtku wyrazów ........................................................................86 Co mo e pój Ê nie po naszej my li? ...................................................................................87 Skrypt nr 36: Odnajdywanie podïañcuchów ..........................................................................88 Co mo e pój Ê nie po naszej my li? ...................................................................................89 Skrypt nr 37: ZastÚpowanie podïañcuchów ...........................................................................89 Co mo e pój Ê nie po naszej my li? ...................................................................................90 Skrypt nr 38: Odnajdywanie i poprawianie literówek za pomocÈ moduïu pspell ..................91 Praca ze sïownikiem domy lnym .......................................................................................91 Dodawanie sïownika niestandardowego do biblioteki pspell .............................................94 Co mo e pój Ê nie po naszej my li? ...................................................................................95 Skrypt nr 39: Wyra enia regularne ........................................................................................96 Podstawy wyra eñ regularnych .........................................................................................96 Sekwencje znaków specjalnych ..........................................................................................97 Repetytory wzorców .........................................................................................................98 Grupowanie .......................................................................................................................99 Klasy znaków ......................................................................................................................99 PoïÈczenie wszystkich omówionych elementów ...............................................................99 Dopasowywanie i wyodrÚbnianie tekstu za pomocÈ wyra eñ regularnych .....................100 ZastÚpowanie podïañcuchów za pomocÈ wyra eñ regularnych ......................................102 Skrypt nr 40: Przebudowa tabeli jÚzyka HTML ...................................................................103 Skrypt nr 41: Tworzenie screen scrapera ............................................................................104 Doskonalenie tego skryptu ..............................................................................................106 Skrypt nr 42: Konwersja zwykïego tekstu na prawidïowy kod jÚzyka HTML .....................106 Skrypt nr 43: Automatyczna konwersja adresów URL na hiperïÈcza ..................................109 Skrypt nr 44: Usuwanie znaczników jÚzyka HTML z ïañcuchów .........................................110 6. PRACA Z DATAMI ................................................................................. 113 Jak liczony jest czas w systemie UNIX .................................................................................113 Skrypt nr 45: Uzyskiwanie bie Ècego znacznika czasowego ................................................114 Skrypt nr 46: Uzyskiwanie znacznika czasowego dla daty z przeszïo ci lub w przyszïo ci .....115 Tworzenie znaczników czasowych na podstawie ïañcucha .............................................115 Tworzenie znaczników czasowych na podstawie warto ci dat .......................................117 Skrypt nr 47: Formatowanie daty i godziny .........................................................................118 Skrypt nr 48: Wyznaczanie dnia tygodnia na podstawie danej daty .....................................121 Spis tre ci 5
    5. Skrypt nr 49: Odnajdywanie ró nic dzielÈcych dwie daty ................................................... 121 Stosowanie tego skryptu ................................................................................................. 123 Doskonalenie tego skryptu .............................................................................................. 123 Formaty dat systemu MySQL .............................................................................................. 123 7. PRACA Z PLIKAMI ................................................................................ 125 Uprawnienia dostÚpu do plików ......................................................................................... 125 Uprawnienia ustawiane za po rednictwem programu FTP ............................................ 127 Wiersz poleceñ ................................................................................................................ 127 Co mo e pój Ê nie po naszej my li? ................................................................................. 127 Skrypt nr 50: Umieszczanie zawarto ci pliku w zmiennej ................................................... 128 Doskonalenie tego skryptu .............................................................................................. 130 Co mo e pój Ê nie po naszej my li? ................................................................................. 131 Skrypt nr 51: Tworzenie plików i zapisywanie danych w plikach ....................................... 131 Skrypt nr 52: Sprawdzanie, czy interesujÈcy nas plik istnieje .............................................. 132 Skrypt nr 53: Usuwanie plików ........................................................................................... 133 Skrypt nr 54: Wysyïanie obrazów do katalogu .................................................................... 133 Stosowanie tego skryptu ................................................................................................. 138 Co mo e pój Ê nie po naszej my li? ................................................................................. 138 Doskonalenie tego skryptu .............................................................................................. 138 Skrypt nr 55: Odczytywanie plików z danymi oddzielonymi przecinkami .......................... 138 8. ¥LEDZENIE U¿YTKOWNIKA I SESJI ...................................................... 141 ¥ledzenie danych u ytkownika z wykorzystaniem ciasteczek i sesji ................................... 142 Ciasteczka ........................................................................................................................ 142 Sesje ................................................................................................................................. 143 Skrypt nr 56: Tworzenie komunikatu „Witaj ponownie, nazwa_u ytkownika!” z wykorzystaniem ciasteczek .................................. 144 Co mo e pój Ê nie po naszej my li? ................................................................................. 145 Skrypt nr 57: Wykorzystywanie sesji do tymczasowego skïadowania danych .................... 146 Co mo e pój Ê nie po naszej my li? ................................................................................. 148 Skrypt nr 58: Sprawdzanie, czy przeglÈdarka internetowa u ytkownika obsïuguje ciasteczka .....148 Skrypt nr 59: Przekierowywanie u ytkowników na inne strony ......................................... 150 Skrypt nr 60: Wymuszanie na u ytkownikach 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 POCZTk ELEKTRONICZNk ................................................... 161 Skrypt nr 64: Wysyïanie wiadomo ci poczty elektronicznej z wykorzystaniem pakietu PHPMailer ................................................................................. 162 6 Spis tre ci
    6. Instalacja pakietu PHPMailer ............................................................................................162 Stosowanie tego skryptu ..................................................................................................164 Dodawanie zaïÈczników ...................................................................................................165 Co mo e pój Ê nie po naszej my li ..................................................................................166 Skrypt nr 65: Wykorzystywanie wiadomo ci poczty elektronicznej do weryfikacji kont u ytkowników ......................................................................................167 10. PRACA Z OBRAZAMI ............................................................................ 173 Skrypt nr 66: Tworzenie obrazów CAPTCHA zabezpieczajÈcych 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: NawiÈzywanie poïÈczenia 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 usïug sieciowych ..............................................194 Skrypt nr 72: Uzyskiwanie danych z witryny Amazon.com za po rednictwem skryptu PHP i protokoïu SOAP .............................................................198 Skrypt nr 73: Budowanie usïugi sieciowej ............................................................................200 12. PRZYK’ADY BARDZIEJ Z’O¿ONYCH PROJEKTÓW .............................. 205 Skrypt nr 74: Internetowe gïosowanie .................................................................................206 Tworzenie formularza z kartÈ do gïosowania ..................................................................207 Przetwarzanie karty do gïosowania .................................................................................209 Uzyskiwanie wyników gïosowania ...................................................................................211 Doskonalenie tego skryptu ..............................................................................................213 Skrypt nr 75: Elektroniczne kartki z pozdrowieniami ..........................................................214 Wybór kartki ....................................................................................................................216 Wysyïanie kartki elektronicznej .......................................................................................218 Wy wietlanie kartki ..........................................................................................................221 Doskonalenie tego skryptu ..............................................................................................224 Skrypt nr 76: System blogu ..................................................................................................225 Tworzenie wpisów na blogu ............................................................................................226 Wy wietlanie wpisu na blogu ...........................................................................................228 Dodawanie komentarzy ...................................................................................................232 Tworzenie indeksu blogu .................................................................................................233 Doskonalenie tego skryptu ..............................................................................................236 DODATEK .............................................................................................. 239 SKOROWIDZ .......................................................................................... 241 Spis tre ci 7
    7. 2 Konfigurowanie PHP JAK KA¿DY PAKIET OPROGRAMOWANIA, TAK I PHP OFERUJE WIELE OPCJI KONFIGURACYJNYCH, KTÓRE W TEN CZY INNY SPOSÓB WP’YWAJk NA SPOSÓB JEGO FUNKCJONOWANIA. WiÚkszo Ê tych opcji nie ma istotnego znaczenia, ale o kilku najwa niejszych opcjach ka dy programista PHP z pewno ciÈ powinien wiedzieÊ. Co wiÚcej, istnieje wiele dodatków do PHP (okre lanych mianem bibliotek) uzupeïniajÈcych tÚ technologiÚ o nowe mo liwo ci. Na przy- kïad rozszerzenie cURL umo liwia serwerowi wysyïanie danych formularzy do in- nych serwerów i przetwarzanie odsyïanych odpowiedzi. Inne przydatne rozsze- rzenie, Mcrypt, umo liwia nam ïatwe i skuteczne szyfrowanie danych celem bezpiecznego skïadowania poufnych informacji. W tym rozdziale zajmiemy siÚ ustawieniami konfiguracyjnymi najczÚ ciej wyko- rzystywanymi przez programistów PHP oraz sytuacjami, w których stosowanie tych ustawieñ jest uzasadnione. Ustawienia konfiguracyjne i plik php.ini WiÚkszo Ê poczÈtkujÈcych programistów traktuje ustawienia domy lne PHP jakby , byli nie miaïymi lokatorami wprowadzajÈcymi siÚ do ekskluzywnego apartamentu — obawiajÈ siÚ cokolwiek zmieniÊ w obawie o wpïaconÈ kaucjÚ. W postrzeganiu PHP jako domu nie ma niczego zïego. BÚdziemy tam jaki czas mieszkaÊ, dlacze- go wiÚc nie poprzestawiaÊ mebli czy nie zburzyÊ paru cian?
    8. UWAGA W zale no ci od konfiguracji samego komputera, na którym pracuje Twój serwer WWW, mo esz nie mieÊ mo liwo ci samodzielnego modyfikowania ustawieñ. Dobrzy operatorzy serwerów nie majÈ jednak nic przeciwko wprowadzaniu nie- zbÚdnych zmian w Twoim imieniu, a najlepsze firmy tego typu oferujÈ nawet mo li- wo Ê modyfikacji ustawieñ za po rednictwem specjalnych plików konfiguracyjnych. Ustawienia rodowiska PHP sÈ skïadowane w pliku nazwanym php.ini, który mo na przeglÈdaÊ i modyfikowaÊ w dowolnym edytorze tekstu. Ustawienia, które podzielono pomiÚdzy sekcje, majÈ nastÚpujÈcÈ postaÊ: max_execution_time = 30 ; Maksymalny czas wykonywania max_input_time = 60 ; Maksymalny czas analizy skáadniowej danych wej ciowych memory_limit = 8M ; Maksymalna ilo ü pami ci zajmowanej przez skrypt Parametry konfiguracyjne mo na ustawiaÊ za pomocÈ znaku równo ci (=). ¥rednik (;) oznacza, e mamy do czynienia z komentarzem; okazuje siÚ jednak, e istniejÈ wyjÈtki od tej reguïy umo liwiajÈce stosowanie redników w niektó- rych parametrach. Gdyby my chcieli trwale zmieniÊ jakie ustawienie, powinni my sporzÈdziÊ kopiÚ zapasowÈ pliku php.ini, zmodyfikowaÊ oryginalny plik konfi- guracyjny i ponownie uruchomiÊ serwer Apache. Gdyby my chcieli zmieniaÊ ustawienia na poziomie skryptu, powinni my u yÊ funkcji ini_set(). Lokalizowanie pliku php.ini W niektórych przypadkach wskazanie miejsca skïadowania pliku php.ini w syste- mie, w którym pracujemy (szczególnie je li korzystamy z wielu instalacji rodowiska PHP), bywa trudne. Poni ej opisano kilka sposobów lokalizowania tego pliku: Q U ytkownicy 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 U ytkownicy systemu Windows powinni zwróciÊ uwagÚ na katalog C:php. Q Mo na te wywoïaÊ funkcjÚ phpinfo() w kodzie skryptu PHP (wiÚcej informacji na ten temat w kolejnym podrozdziale). Lokalizacja pliku php.ini zostanie wy wietlona w poczÈtkowej czÚ ci danych wynikowych obok etykiety Configuration File (php.ini) Location. Q W wielu systemach UNIX mo na uzyskaÊ listÚ wszystkich plików pasujÈcych do wzorca php.ini za pomocÈ polecenia locate php.ini. UWAGA Wiele ustawieñ nie jest definiowanych w domy lnym pliku php.ini; rodowisko PHP stosuje dla niezdefiniowanych ustawieñ wïasne warto ci domy lne. ListÚ ustawieñ domy lnych PHP mo na znale Ê na stronie internetowej http://www.php.net/ ´manual/en/ini.php. 32 Rozdziaï 2
    9. Skrypt nr 8: Odkrywanie wszystkich ustawieñ PHP PHP oferuje bogatÈ funkcjonalno Ê, jednak nie zawsze wszystkie te funkcje sÈ wïÈczone lub wbudowane w stosowanej instalacji. Do sprawdzenia, jakie ele- menty wchodzÈ w skïad danej instalacji rodowiska PHP mo na wykorzystaÊ , bardzo prosty skrypt. Mo liwo Ê uzyskiwania tego rodzaju danych jest o tyle nie- bezpieczna, e szeroki zakres prezentowanych informacji stanowi swoisty pod- rÚcznik dla potencjalnych atakujÈcych. Funkcja phpinfo() zdaje siÚ mówiÊ: „Tutaj. To sÈ moje sïabe punkty. Wprost nie mogÚ siÚ doczekaÊ wïamania do mojego systemu”. W tej sytuacji nale y pamiÚtaÊ o konieczno ci usuniÚcia tego skryptu zaraz po uzyskaniu interesujÈcych nas informacji: <?php phpinfo(); ?> Funkcja phpinfo() wy wietla 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 poïo enia pliku php.ini czy , wersji samego rodowiska PHP — obejmujÈ tak e 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 niezbÚdne funkcje zostaïy prawidïowo zainstalowane i wïÈczone. Aby uruchomiÊ ten skrypt, odwied odpowiedniÈ stronÚ za pomocÈ swojej przeglÈdarki 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. Mo emy na przykïad byÊ zainteresowani tylko sprawdze- niem, czy mechanizm „magicznych cudzysïowów” jest wïÈczony, lub okre le- niem cie ki doïÈczania. Co wiÚcej, funkcja phpinfo() w aden sposób nam nie pomo e, je li pisany skrypt zachowuje siÚ inaczej w razie wïÈczenia jakiego usta- wienia i inaczej w sytuacji, gdy to ustawienie jest wyïÈczone. Aby uzyskaÊ warto Ê okre lonego ustawienia konfiguracyjnego, nale y u yÊ funkcji ini_get(): Konfigurowanie PHP 33
    10. <?php echo "Warto Ê opcji register_globals: " . ini_get('register_globals'); ?> Wystarczy przekazaÊ na wej ciu funkcji ini_get() prawidïowÈ nazwÚ para- metru konfiguracji, a otrzymamy aktualne ustawienie tego parametru na bie Ècym serwerze. Opcja jest zwracana w formie zwykïej warto ci, zatem mo na jÈ wy wie- tliÊ, przypisaÊ do zmiennej itd. KorzystajÈc z tej funkcji, musimy jednak mieÊ na uwadze dwa aspekty. Po pierwsze: warto ci logiczne, np. "false", z reguïy sÈ zwracane w formie ïañcuchów pustych, zatem je li spróbujemy wy wietliÊ ustawienie "off" para- metru register_globals, byÊ mo e otrzymamy nastÚpujÈcy komunikat: Warto Ê opcji register_globals: Po drugie: warto ci numeryczne czÚsto sÈ reprezentowane w formie skróconej. Je li na przykïad parametrowi upload_max_filesize przypisano warto Ê 8192 baj- tów, zostanie zwrócona warto Ê 8 kB. Podobnie, je li maksymalny rozmiar wysyïa- 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Ê powa ny problem, je li chcemy na tych liczbach wykonywaÊ opera- cje arytmetyczne. Oficjalna dokumentacja PHP wspomina o funkcji konwertujÈ- cej warto ci skrócone (kilo- i mega-) na prawdziwe warto ci: 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
    11. Skrypt nr 10: Raportowanie o bïÚdach PracujÈc nad kodem, czÚsto zapominamy nazw stosowanych zmiennych lub ko- rzystamy z przestarzaïych, niezalecanych konstrukcji. W niektórych przypad- kach jÚzyk PHP okazuje siÚ na tyle przyjazny u ytkownikowi (przynajmniej jak na standardy programowania), e sam naprawia wiele drobnych bïÚdów w kodzie. PHP umo liwia nam miÚdzy innymi pisanie programów bez konieczno ci deklarowania wszystkich niezbÚdnych zmiennych na poczÈtku kodu, co jest bardzo wygodne, przynajmniej do momentu gdy zamiast nazwy $string omyïkowo u yjemy nazwy $stirng reprezentujÈcej warto Ê pustÈ. Mo na te przekazywaÊ zmienne na wej ciu funkcji w zupeïnie niewïa ciwy sposób, a mimo to skrypt PHP bÚdzie dziaïaï prawidïowo, poniewa w wiÚkszo ci przypadków bÚdzie przyjmowaï pewne zaïo enia wobec zamiarów programisty. Tego rodzaju mechani- zmy sÈ oczywi cie bardzo po Èdane, dopóki PHP prawidïowo odgaduje nasze in- tencje — w przeciwnym razie poszukiwanie tajemniczego bïÚdu mo e nam zajÈÊ mnóstwo czasu. Aby wyïÈczyÊ mechanizmy automatycznego usuwania problemów, mo na wïÈczyÊ tryb raportowania o bïÚdach, co spowoduje, e PHP bÚdzie wy wietlaï na ekranie niezliczone komunikaty w reakcji na ka dy wykryty bïÈd (niezale nie od jego faktycznej wagi). Mo na te komunikaty wykorzystaÊ do eliminowania potencjalnych luk w zabezpieczeniach i wykrywania bïÚdnych zmiennych przed skierowaniem programu do rodowiska koñcowego. WïÈczenie trybu raporto- wania o bïÚdach wymaga umieszczenia nastÚpujÈcego kodu na poczÈtku tworzonego skryptu: <?php error_reporting(E_ALL); // Tutaj nale y umie ciü dalsz cz ü skryptu. ?> WïÈczenie trybu raportowania o bïÚdach powoduje, e PHP wy wietla ko- munikaty jeszcze przed przetworzeniem dalszej czÚ ci danego programu. (Takie rozwiÈzanie uniemo liwia ustawianie ciasteczek w razie wystÈpienia bïÚdu, zatem nie powinni my nawet próbowaÊ zmieniaÊ warto ci ciasteczek po wïÈczeniu tego trybu). Typowe komunikaty o bïÚdach Warto dobrze opanowaÊ i zrozumieÊ trzy najczÚ ciej generowane komunikaty o bïÚdach. Notice: Undefined variable: var in script.php on line n Konfigurowanie PHP 35
    12. Komunikat w tej formie oznacza, e korzystamy ze zmiennej, której wcze niej nie zdefiniowano w danym skrypcie. Taka sytuacja mo e mieÊ miejsce w kilku przypadkach: Q ByÊ mo e popeïnili my bïÈd w pisowni nazwy zmiennej. Q ByÊ mo e u yli my wyra enia warunkowego zawierajÈcego definicjÚ zmiennej, np.: if ($fred == "Jestem Fred") { $he_is_fred = "yes"; } Q ByÊ mo e próbujemy konkatenowaÊ zmiennÈ bez jej uprzedniego zadeklarowania. Inny popularny problem wystÚpuje du o czÚ ciej 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 ostrze enia w tej formie zwykle oznacza, e programista podjÈï próbÚ przekazania ïañcucha na wej ciu funkcji bez otaczajÈcych go cudzysïo- wów. Innymi sïowy, u yto na przykïad wywoïania strtolower(ïañcuch) zamiast metody strtolower("ïañcuch"). I wreszcie istnieje popularny komunikat o bïÚdzie generowany w sytuacji, gdy uzyskujemy dostÚp do tablicy: Notice: Undefined index: i in script.php on line n W praktyce komunikat w tej formie oznacza, e podjÚto próbÚ odczytania elementu $tablica[i], mimo e tablica $tablica nie definiuje elementu pod tym indeksem. Z tego rodzaju bïÚdami mamy do czynienia w sytuacji, gdy uzy- skujemy warto Ê z formularza za po rednictwem zmiennej $_POST lub $_GET, chocia adna z tych zmiennych nie zawiera tak nazwanej warto ci. NajczÚ ciej podobne bïÚdy wynikajÈ z tego, e u ytkownik nie zaznaczyï odpowiedniego pola wyboru lub przycisku opcji — w takim przypadku zmienna reprezentujÈca ten element formularza w ogóle nie jest przekazywana w ramach Èdania GET (jako czÚ Ê adresu URL). Tryb raportowania o bïÚdach nale y wyïÈczyÊ z chwilÈ wdra ania skryptu na docelowej witrynie, aby u ytkownicy nie mogli siÚ zapoznawaÊ z popeïnionymi przez nas bïÚdami i aby wyeliminowaÊ wpïyw tego trybu na ciasteczka (w szcze- gólno ci problemy ze ledzeniem sesji). 36 Rozdziaï 2
    13. Skrypt nr 11: Ukrywanie wszystkich komunikatów o bïÚdach W pewnych sytuacjach dysponujemy prawidïowo dziaïajÈcym skryptem, a mimo to rodowisko PHP wciÈ sugeruje potencjalne usterki. Innym razem nie chcemy, by oczekiwane problemy powodowaïy, e nasi u ytkownicy bÚdÈ nara eni na odra ajÈcy widok komunikatów o bïÚdach (odkrywajÈcych informacje, co szcze- gólnie ceniÈ sobie hakerzy). Na szczÚ cie istnieje mo liwo Ê powstrzymania PHP przed wy wietlaniem wszystkich komunikatów o bïÚdach. Wystarczy w pliku php.ini umie ciÊ nastÚ- pujÈcy wiersz: display_errors = Off Przytoczone rozwiÈzanie warto stosowaÊ w rodowisku docelowym aplikacji internetowej, aby w przyszïo ci nie obawiaÊ siÚ szerokiej dostÚpno ci komuni- katów diagnostycznych PHP odno nie do naszego kodu. Gdyby my chcieli za- poznaÊ siÚ z tymi komunikatami celem wyeliminowania ewentualnych problemów, powinni my u yÊ nastÚpujÈcego ustawienia konfiguracyjnego wymuszajÈcego kierowanie tych komunikatów do dziennika zdarzeñ serwera Apache: log_errors = On W razie potrzeby mo na nawet wysyïaÊ komunikaty diagnostyczne do dzien- nika systemowego lub wskazanego pliku — parametrowi error_log nale y wów- czas przypisaÊ odpowiednio warto Ê syslog lub nazwÚ pliku. Pozostaje jeszcze kwestia naszego rodowiska wytwarzania, gdzie z reguïy chcemy uzyskiwaÊ mo liwie wiele komunikatów diagnostycznych. Po przypisa- niu parametrowi display_errors warto ci On mo na dodatkowo (w pliku php.ini) ustawiÊ strukturÚ bitowÈ w parametrze error_reporting (wiÚcej szczegóïów na ten temat mo na znale Ê w przykïadowym pliku php.ini instalowanym wraz ze rodowiskiem PHP). Je li jednak chcemy „uciszyÊ” jaki skrypt, który nieustannie zasypuje nas tymi samymi komunikatami, mo emy u yÊ w jego kodzie nastÚpujÈ- cego wywoïania funkcji: error_reporting(0); Konfigurowanie PHP 37
    14. Skrypt nr 12: Wydïu anie czasu wykonywania skryptu Pracowaïem kiedy w firmie, która postawiïa sobie za cel zmianÚ mechanizmu obsïugi koszyków z zakupami. Do moich zadañ nale aïo napisanie skryptu od- powiedzialnego za konwersjÚ 250 MB danych o produktach ze starego na nowy format. Skrypt dziaïaï co prawda znakomicie, jednak ilo Ê przetwarzanych da- nych powodowaïa, e rodowisko PHP stale przerywaïo jego wykonywanie po upïywie 30 sekund, a wiÚc na dïugo przed osiÈgniÚciem zamierzonego celu. Wïa nie wówczas odkryïem drobne rozszerzenie, które umo liwiïo mojemu skryptowi wykonanie zleconego zadania. Poni szy wiersz dodany na poczÈtku skryptu powoduje, e bÚdzie on miaï maksymalnie 240 sekund na przetworzenie danych: ini_set(max_execution_time, "240"); Parametr konfiguracyjny max_execution_time okre la maksymalny czas wyko- nywania skryptu przed jego automatycznym zakoñczeniem. Nie nale y jednak tego parametru nadu ywaÊ. Je li dany skrypt dziaïa kilka minut, to albo usprawie- dliwia nas ogromna ilo Ê przetwarzanych informacji (najpewniej zaczerpniÚtych z bazy danych), albo nasz skrypt jest bardzo nieefektywny, albo korzystamy z niewïa ciwego jÚzyka programowania. Co mo e pój Ê nie po naszej my li? Je li nasz serwer pracuje w trybie awaryjnym, ustawianie warto ci parametru max_execution_time w czasie wykonywania jest niemo liwe. Warto te dokïadnie sprawdziÊ kod skryptu. ByÊ mo e omyïkowo zawarli my tam nieskoñczonÈ pÚtlÚ lub pÚtlÚ wykonywanÈ w innej pÚtli i niepodejmujÈcÈ adnych sensownych dziaïañ. Skrypt nr 13: Uniemo liwianie u ytkownikom wysyïania wielkich plików Gdyby my chcieli uniemo liwiÊ u ytkownikom naszej aplikacji wysyïanie na serwer 70-gigabajtowych MPEG-ów z najnowszym filmem „Gwiezdne wojny”, powinni my okre liÊ maksymalny rozmiar plików kopiowanych na serwer. (Szczegóïowe omówienie samych technik przetwarzania wysyïanych plików mo na znale Ê w podrozdziale „Skrypt nr 54: Wysyïanie obrazów do katalogu” w rozdziale 7.). upload_max_filesize = 500K 38 Rozdziaï 2
    15. Maksymalny rozmiar plików wysyïanych na serwer mo na okre liÊ na jeden z trzech sposobów: Q w formie warto ci caïkowitoliczbowej (wyra ajÈcej ïÈcznÈ liczbÚ bajtów); Q w formie liczby z przyrostkiem M reprezentujÈcej megabajty (2M to 2 megabajty); Q w formie liczby z przyrostkiem K reprezentujÈcej kilobajty (8K to 8 kilobajtów). Niezale nie od u ytego formatu nasi u ytkownicy nie bÚdÈ mogli wysïaÊ na serwer pliku, którego rozmiar bÚdzie przekraczaï tak zdefiniowany próg. Domy l- nym rozmiarem maksymalnym sÈ 2 MB. Skrypt nr 14: WyïÈczanie rejestrowanych zmiennych globalnych JÚzyk PHP oferuje przestarzaïÈ, niezalecanÈ funkcjÚ, która nieznacznie uïatwia dostÚp do parametrów Èdañ GET i POST protokoïu HTTP Je li na przykïad Èda- . nie POST zawiera parametr nazwany mojparam, PHP mo e automatycznie umie- ciÊ jego warto Ê w zmiennej nazwanej $mojparam. Dziaïanie tego mechanizmu stwarza powa ne ryzyko dla bezpieczeñstwa aplikacji, poniewa umo liwia u ytkownikom ustawianie dowolnych zmiennych globalnych — je li zapomnimy zainicjalizowaÊ odpowiednie zmienne, u ytkownik zyska mo liwo Ê wpïywania na istotne elementy naszego skryptu. Wspomniany mechanizm mo na wyïÈczyÊ, ustawiajÈc w zmiennej register_ ´globals warto Ê Off w pliku php.ini serwera: register_globals = Off Opisana funkcja na szczÚ cie zostaïa wyïÈczona w wersjach 4.2 i nowszych jÚzyka PHP Waga problemu jest jednak na tyle du a, e warto to dwukrotnie . sprawdziÊ. Skrypt nr 15: WïÈczanie „magicznych cudzysïowów” „Magiczne cudzysïowy” (ang. magic quotes) to wygodne narzÚdzie stosowane przez administratorów serwerów do ochrony przed atakami polegajÈcymi na wstrzykiwaniu kodu SQL-a (patrz podrozdziaï „Skrypt nr 19: Wstrzykiwanie kodu jÚzyka SQL” w rozdziale 3.). Dziaïanie tego mechanizmu polega na po- Konfigurowanie PHP 39
    16. przedzaniu wszystkich apostrofów, cudzysïowów i lewych uko ników dodatkowym znakiem lewego uko nika (tzw. znakiem ucieczki) we wszystkich danych zapisywa- nych w zmiennych skryptu PHP i pochodzÈcych z formularzy HTML. W ten sposób na przykïad ïañcuch "Ferrett's Book" zostanie przeksztaïcony w ïañcuch "Ferrett's Book". Mechanizm „magicznych cudzysïowów” nie jest rozwiÈzaniem idealnym, je- li korzystamy z bazy danych MySQL — w takim przypadku nale y stosowaÊ raczej wyspecjalizowanÈ funkcjÚ mysql_real_escape_string() — jednak generalnie „magiczne cudzysïowy” zdajÈ egzamin. Mo na ten mechanizm wïÈczyÊ w pliku php.ini za pomocÈ nastÚpujÈcego wyra enia: magic_quotes_gpc = 1 Co mo e pój Ê nie po naszej my li? Je li nie wïÈczymy mechanizmu „magicznych cudzysïowów”, bÚdziemy musieli korzystaÊ z funkcji mysql_real_escape_string(), aby zagwarantowaÊ stosowanie sekwencji ucieczki w wykorzystywanych danych. Je li jednak u yjemy tej funk- cji dla danych w sytuacji, gdy mechanizm „magicznych cudzysïowów” bÚdzie wïÈczony, ryzykowne znaki zostanÈ poprzedzone podwójnymi lewymi uko nikami (zamiast "Ferrett's Book" otrzymamy "Ferrett's Book"). Jak widaÊ, konsekwencja popïaca — chwila nieuwagi mo e spowodowaÊ, e tabele naszej bazy danych bÚdÈ zawieraïy niemal wyïÈcznie lewe uko niki. Skrypt nr 16: Ograniczanie dostÚpu PHP do plików Je li obawiasz siÚ wrogiego skryptu PHP uzyskujÈcego dostÚp do plików syste- mowych (np. do pliku haseï), mo esz u yÊ ustawienia open_basedir do ograni- czenia zbioru katalogów dostÚpnych z poziomu kodu PHP Po ustawieniu tej . opcji skrypt PHP nie bÚdzie mógï otwieraÊ ani modyfikowaÊ adnych plików spoza wskazanego katalogu. Poni ej przedstawiono wiersz pliku php.ini ograni- czajÈcy dostÚp tylko do katalogu /home/www: open_basedir = /home/www Istnieje mo liwo Ê zapewniania skryptom dostÚpu do wielu katalogów — w systemie UNIX nale y je oddzielaÊ dwukropkami (:); w systemie Windows kolejne katalogi oddzielamy rednikami (;). UWAGA PHP domy lnie zapewnia dostÚp zarówno do wskazanego katalogu, jak i wszystkich jego podkatalogów. Gdyby my chcieli ograniczyÊ ten dostÚp tylko do plików w okre- lonym katalogu, na koñcu u ytej cie ki powinni my u yÊ uko nika (np. /home/www/). 40 Rozdziaï 2
    17. Co mo e pój Ê nie po naszej my li? Je li u ytkownicy muszÈ wysyïaÊ pliki na serwer, to do czasu ich przetworzenia przez skrypt otrzymane pliki sÈ skïadowane w katalogu tymczasowym. Ponie- wa katalog tymczasowy z reguïy dzieli spora odlegïo Ê od pozostaïych plików PHP koniecznie musimy pamiÚtaÊ o jego uwzglÚdnieniu na li cie reprezentowanej , przez parametr open_basedir. Skrypt nr 17: WyïÈczanie obsïugi okre lonych funkcji Przypu Êmy, e uznali my funkcjÚ exec(), która umo liwia bezpo rednie wyko- nywanie poleceñ na serwerze z poziomu skryptów PHP za zbyt niebezpiecznÈ. , Okazuje siÚ, e istnieje mo liwo Ê wyïÈczania obsïugi poszczególnych funkcji PHP (wïa nie z my lÈ o wyeliminowaniu luk w zabezpieczeniach) z zachowa- niem mo liwo ci stosowania wszystkich pozostaïych funkcji. Poni ej przedsta- wiono przykïad wiersza pliku php.ini wyïÈczajÈcego obsïugÚ kilku szczególnie ryzykownych funkcji: disable_functions = system, exec, passthru, shell_exec, proc_open Skrypt nr 18: Dodawanie rozszerzeñ do PHP NaprawdÚ powa ni programi ci prÚdzej czy pó niej odkrywajÈ pewne ograni- czenia jÚzyka PHP Mimo ogromnej liczby wbudowanych funkcji i mechani- . zmów sam jÚzyk PHP nie oferuje rdzennych rozwiÈzañ w zakresie szyfrowania, grafiki, dostÚpu do innych stron internetowych czy przetwarzania danych w forma- cie XML. Te i inne cele mo na jednak osiÈgaÊ dziÚki niezliczonym rozszerzeniom wy- korzystujÈcym biblioteki tworzone przez niezale nych programistów i podmioty. Kilka najbardziej przydatnych rozszerzeñ jÚzyka PHP opisano poni ej: cURL cURL umo liwia naszemu serwerowi PHP uzyskiwanie dostÚpu do innych witryn internetowych, w tym wysyïanie i odbieranie informacji za po rednic- twem swoistego protokoïu zbudowanego na bazie adresów URL. (NajczÚ ciej korzystamy z protokoïu HTTP który umo liwia nam komunikacjÚ z innymi , stronami internetowymi, oraz protokoïu FTP umo liwiajÈcego nam wysyïanie i pobieranie plików). W praktyce oznacza to, e nasz serwer mo e byÊ trak- towany przez inne witryny jak przeglÈdarka internetowa, a pobierane strony WWW mo emy umieszczaÊ w dowolnych zmiennych w ramach swoich skryptów. Konfigurowanie PHP 41
    18. cURL jest niezwykle wa nym narzÚdziem dla programistów pracujÈcych nad powa nymi sklepami internetowymi, poniewa umo liwia nam akceptowa- nie pïatno ci kartami kredytowymi i wyceny towarów dla poszczególnych klientów w czasie rzeczywistym. Za pomocÈ rozszerzenia cURL mo na nawiÈ- zywaÊ poïÈczenia i wysyïaÊ dane o transakcjach na serwer innej firmy. W od- powiedzi otrzymujemy wówczas informacje o akceptacji bÈd odrzuceniu Èdania dokonania pïatno ci. Mcrypt Musiaïe kiedy co zaszyfrowaÊ? Wszystkie poufne informacje umieszczane w ciasteczkach i sesjach powinny byÊ szyfrowane. Co wiÚcej, je li gdziekolwiek zapisujemy co naprawdÚ warto ciowego, jak numery kart kredytowych czy dane osobowe, z pewno ciÈ powinni my siÚ upewniÊ, e odczyt tych infor- macji nie bÚdzie mo liwy przez zwykïy zrzut zawarto ci bazy danych. Na szczÚ cie biblioteka Mcrypt umo liwia nam naprawdÚ skuteczne szyfrowa- nie danych bez choÊby szczÈtkowej znajomo ci 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 Gdyby my chcieli tworzyÊ obrazy graficzne na Èdanie lub po prostu uzy- skiwaÊ szczegóïowe informacje o obrazach ju istniejÈcych, powinni my siÚ zapoznaÊ z mo liwo ciami biblioteki GD. Biblioteka GD umo liwia nam pracÚ na plikach JPEG i GIF — mo emy je tworzyÊ z my lÈ o graficznej prezentacji rozmaitych danych (np. w formie wykresów) albo modyfikowaÊ (np. tworzÈc miniaturki istniejÈcych obrazów). MySQL Podstawowa wersja rodowiska PHP w ogóle „nie wie”, jak uzyskiwaÊ do- stÚp do baz danych. Poniewa jednak system MySQL i jÚzyk PHP sÈ jak Zan i Jayna z popularnej kreskówki, wiÚkszo Ê serwerów WWW przystosowa- nych do obsïugi PHP oferuje te domy lnie instalowane biblioteki systemu MySQL, zatem wiÚkszo Ê programistów korzysta z funkcji mysql_connect(), nie wiedzÈc, e jest ona czÚ ciÈ rozszerzenia. Zbiór rozszerzeñ PHP jest oczywi cie du o bogatszy i obejmuje takie biblioteki jak SOAP (zapewniajÈca dostÚp do usïug internetowych), PDF czy Verisign Payment Pro. Na pierwszy rzut oka mo e siÚ wydawaÊ, e najlepszym rozwiÈ- zaniem jest doïÈczanie do rodowiska PHP wszystkich rozszerzeñ, które tylko udaïo nam siÚ odnale Ê, jednak warto mieÊ na uwadze, e ka de z nich mo e wydïu yÊ czas inicjalizacji i stwarzaÊ dodatkowe luki w zabezpieczeniach. Co wiÚcej, mniej popularne rozszerzenia z reguïy nie sÈ na bie Èco aktualizowane ani rozwijane. 42 Rozdziaï 2
    19. Dodawanie rozszerzeñ jÚzyka PHP Skoro wiemy ju , co mo na zyskaÊ, instalujÈc rozszerzenia, przyjrzyjmy siÚ sa- mem procesowi ich instalowania. W pierwszej kolejno ci nale y sprawdziÊ, czy przypadkiem ju nie dysponujemy tym, czego szukamy. Sprawdzanie, czy interesujÈce nas rozszerzenia nie zostaïy ju zaïadowane Wiele serwerów WWW domy lnie instaluje najbardziej przydatne i najpopular- niejsze rozszerzenia, zatem przed podjÚciem prób odszukania i instalacji intere- sujÈcej nas biblioteki powinni my siÚ upewniÊ, czy nie zostaïa ju zainstalowana i zaïadowana. Najprostszym sposobem sprawdzenia ewentualnej obecno ci rozszerzeñ jest wywoïanie funkcji phpinfo() (opisanej w podrozdziale „Skrypt nr 8: Odkrywa- nie wszystkich ustawieñ PHP” we wcze niejszej czÚ ci tego rozdziaïu). ListÚ zwróconÈ przez tÚ funkcjÚ nale y dokïadnie przejrzeÊ w poszukiwaniu naszych bibliotek. Je li na przykïad rodowisko PHP obejmuje zainstalowane rozszerze- nie MySQL, dane wynikowe funkcji phpinfo() bÚdÈ zawieraïy wiersz podobny do poni szego: mysql MySQL Support => enabled ... Je li uznasz, e takie rozwiÈzanie nie jest dla Ciebie, je li wyda Ci siÚ zbyt wolne, mo esz skorzystaÊ z innych mo liwo ci. Ka de rozszerzenie dodaje do PHP nowe funkcje — na przykïad cURL uzupeïnia 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 pojÚcia o funkcji mcrypt_decrypt() i traktuje jÈ jako funkcjÚ niezdefiniowanÈ. Mo na to wykorzystaÊ, stosujÈc funkcjÚ function_exists() jÚzyka PHP Poni ej . przedstawiono przykïadowy skrypt wykrywajÈcy 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 Je li korzystamy z serwera WWW bÚdÈcego wïasno ciÈ innej firmy (tak robi wiÚkszo Ê programistów), musimy siÚ zdaÊ na ïaskÚ administratora tego ser- wera. Poniewa z natury rzeczy nie dysponujemy hasïem administratora, nie Konfigurowanie PHP 43
    20. mo emy instalowaÊ niezbÚdnych bibliotek samodzielnie. W takim przypadku musimy o to poprosiÊ administratora wynajmowanego serwera. KierujÈc odpo- wiednie zlecenie, powinni my siÚ upewniÊ, e administrator dysponuje precy- zyjnymi informacjami; w przeciwnym razie mo e siÚ okazaÊ, e zostaïa zainsta- lowana niewïa ciwa wersja lub wrÚcz niewïa ciwe rozszerzenie. Niektóre firmy zrealizujÈ naszÈ pro bÚ bez najmniejszych problemów. Inne bÚdÈ oczekiwaïy dodatkowych opïat za obciÈ anie swoich serwerów dodatko- wymi rozszerzeniami. Jeszcze inne odpowiedzÈ: „Nasza oferta nie obejmuje ob- sïugi dodatkowych rozszerzeñ. Ograniczamy siÚ tylko do standardowego PHP”. Je li z jakiego powodu nie mo esz zainstalowaÊ potrzebnych rozszerzeñ, mo esz albo spróbowaÊ poradziÊ sobie bez nich, albo zmieniÊ firmÚ obsïugujÈcÈ serwery. UWAGA Nawet je li korzystamy z wïasnego serwera, ale nie potrafimy prawidïowo zain- stalowaÊ niezbÚdnych rozszerzeñ, warto zwróciÊ siÚ z pro bÈ o instalacjÚ nowych bibliotek do pracowników wsparcia technicznego. W takim przypadku w razie nie- powodzenia procesu instalacji technicy bÚdÈ w stanie naprawiÊ usterkÚ (przy- najmniej teoretycznie). Instalacja rozszerzeñ za pomocÈ internetowego panelu sterowania Dzier awione serwery czÚsto oferujÈ specjalne panele sterowania, za po red- nictwem których mo emy realizowaÊ typowe zadania administracyjne (w tym zadanie ponownego uruchomienia usïugi Apache lub restartu caïego serwera) w oknie przeglÈdarki internetowej. Niektóre panele sterowania oferujÈ nawet mo liwo Ê automatycznego kom- pilowania serwera Apache i rodowiska PHP wskutek zaznaczenia pól wyboru lub wyboru z list rozwijanych opcji reprezentujÈcych dodawane rozszerzenia. Na przykïad WHM (popularny, choÊ do Ê trudny w obsïudze panel sterowania) udostÚpnia opcjÚ Update Apache, która powoduje ponownÈ instalacjÚ serwera Apache i rodowiska PHP wraz z wybranymi Èdaniami. Je li Twój serwer nie udostÚpnia preinstalowanego panelu sterowania, z reguïy za niewielkÈ opïatÈ mo na taki panel zainstalowaÊ ju po wdro eniu oprogramowania serwera. RÚczna instalacja rozszerzeñ Ponowna kompilacja PHP jest w systemach UNIX traktowana jako ponowna in- stalacja tego rodowiska wraz z niezbÚdnymi rozszerzeniami. Dla programistów, którzy nie majÈ do wiadczenia w roli administratorów systemów UNIX, ponowna kompilacja rodowiska PHP czÚsto jest powa nym wyzwaniem. Najlepszym rozwiÈzaniem jest przystÈpienie do eksperymentów z lokalnym serwerem Apache z dala od docelowego rodowiska pracy aplikacji interneto- wej. Poniewa zmiany wprowadzane w konfiguracji pracujÈcego serwera mogÈ 44 Rozdziaï 2
    21. doprowadziÊ do powa nych problemów, warto uprzednio sprawdziÊ, czy w razie kïopotów mo emy liczyÊ na pomoc technicznÈ i czy zdajemy sobie sprawÚ z tego, co mo e siÚ wydarzyÊ. Je li nie jeste my przygotowani do tego rodzaju zadañ, powinni my siÚ zwróciÊ o pomoc do kogo bardziej kompetentnego. Instalacja biblioteki w rodowisku PHP jest procesem dwuetapowym — w pierwszej kolejno ci musimy zainstalowaÊ same biblioteki rozszerzeñ; drugim krokiem jest takie skonfigurowanie rodowiska PHP, aby rozpoznawaïo te roz- szerzenia. Instalowanie bibliotek Szczegóïowe kroki skïadajÈce siÚ na proces instalacji rozszerzenia w du ej mie- rze zale È od dodawanej biblioteki. Mo na oczywi cie sformuïowaÊ ogólne za- sady rzÈdzÈce tym procesem, jednak przed przystÈpieniem do instalacji zawsze nale y siÚ zapoznaÊ z podrÚcznikami dostÚpnymi na stronie biblioteki oraz wszystkimi plikami README. Czytelnicy zainteresowani szczegóïowym wyja- nieniem pracy systemu Linux, w tym technik kompilowania oprogramowania, powinni siÚgnÈÊ po ksiÈ kÚ Briana Warda zatytuïowanÈ How Linux Works (No Starch Press, 2004)1. W poni szych punktach opisano ogólne kroki skïadajÈce siÚ na proces insta- lacji bibliotek: 1. Zalogowanie na serwerze jako administrator lub u ytkownik 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 sïowa PHP (np. mcrypt php) z reguïy pozwoli bïyskawicznie odnale Ê stronÚ domowÈ interesujÈcego nas rozszerzenia, gdzie bÚdÈ dostÚpne odpowiednie pliki ródïowe. Pliki ródïowe najczÚ ciej sÈ archiwizowane i kompresowane za pomocÈ narzÚdzi Gzip i tar (z my lÈ o oszczÚdzaniu przestrzeni), zatem pobrany plik najprawdopodobniej bÚdzie nosiï nazwÚ nazwaplikubiblioteki.tar.gz. 3. Wypakowanie zawarto ci pobranego archiwum. Archiwum tar jest w istocie zbiorem plików i katalogów. Caïe to archiwum jest nastÚpnie kompresowane za pomocÈ pakietu Gzip, stÈd rozszerzenie .gz jest dopisywane na samym koñcu. Oznacza to, e plik .tar.gz mo na 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 narzÚdzi, poniewa program tar w wersji GNU „wie”, jak korzystaÊ z narzÚdzia de- kompresujÈcego. Wypakowanie zawarto ci 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 dziaïa Linux, Helion, 2005 — przyp. tïum. Konfigurowanie PHP 45
    22. WiÚkszo Ê archiwów tworzy drzewo poni ej katalogu najwy szego poziomu, zatem wïa nie takiej struktury powinni my oczekiwaÊ. 4. Przej cie do katalogu biblioteki za pomocÈ polecenia cd nazwakatalogu. Je li nie pamiÚtamy lub w ogóle przeoczyli my nazwÚ z poprzedniego kroku, z reguïy mo emy przyjÈÊ, e nazwa tego katalogu bÚdzie odpowiadaïa nazwie samej biblioteki — np. cd cURL. (Warto pamiÚtaÊ, 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 skïadniki niezbÚdne do zakoñczenia instalacji na danym komputerze zostaïy rozpakowane. Z uwagi na ró norodno Ê dostÚpnych systemów UNIX instalacja pakietów w tych systemach wymaga pewnej wiedzy i do wiadczenia. Na szczÚ cie polecenie configure w wiÚkszo ci przypadków potrafi wykonaÊ caïÈ tÚ „brudnÈ robotÚ” za nas, automatycznie analizujÈc ustawienia serwera i stosujÈc warto ci umo liwiajÈce prawidïowy przebieg instalacji programu. Wpisz w wierszu poleceñ wyra enie ./configure. Niektóre rozszerzenia wymagajÈ do wïa ciwego dziaïania stosowania dodat- kowych flag za poleceniem configure. Na przykïad rozszerzenie Mcrypt wymaga od nas wydania polecenia ./configure --disable-nls --disable- posix-threads, poniewa tylko w ten sposób mo na zagwarantowaÊ peïnÈ zgodno Ê z serwerem Apache. Poniewa dodatkowe opcje zale È od samej biblioteki, warto siÚ zapoznaÊ z przewodnikami i plikami README, gdzie mo na znale Ê precyzyjnÈ dokumentacjÚ wszystkich niezbÚdnych flag kon- figuracyjnych. 6. Kompilacja i instalacja danego pakietu. W systemach UNIX standardowym narzÚdziem kompilujÈcym i instalujÈcym pakiety jest make. Najpierw musimy wydaÊ wïa nie polecenie make, aby skompilowaÊ nasz pakiet. Na ekranie zostanÈ wy wietlone wykonywane polecenia, które skïadajÈ siÚ na proces kompilacji. NastÚpnie powinni my u yÊ polecenia make check celem wykonania na tym pakiecie automatycznych testów (niektóre pakiety nie zawierajÈ testów, czym jednak nie powinni my siÚ przejmowaÊ). I wreszcie nale y wpisaÊ polecenie make install, aby ostatecznie zainstalowaÊ rozszerzenie. Tak e proces instalacji bÚdzie dokumentowany na ekranie. Po wykonaniu polecenia make install proces instalacji rozszerzenia bÚdzie zakoñczony. 7. Utworzenie skryptu phpinfo(). Ach, pewnie my laïe , e to ju koniec, prawda? Przykro mi, ale opisana powy ej 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 wcze niejszej czÚ ci tego rozdziaïu) mo emy uzyskaÊ kompletny wykaz ustawieñ serwera. Gdzie na poczÈtku pierwszej 46 Rozdziaï 2
    23. strony danych wygenerowanych przez tÚ funkcjÚ mo na znale Ê sekcjÚ za- tytuïowanÈ Configure Command i zawierajÈcÈ tajemniczÈ listÚ elementów podobnÈ do poni szej: './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' Gdyby my chcieli ponownie zainstalowaÊ rodowisko PHP w stanie, w któ- rym znajduje siÚ obecnie, dysponowaliby my gotowym poleceniem (a przy- najmniej prawie gotowym). W pierwszej kolejno ci nale y 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ñ — je li dodajemy rozszerzenie GD, nie chcemy przecie przy tej okazji utraciÊ in- nych, zainstalowanych wcze niej rozszerzeñ. Gotowe polecenie configure nale y skopiowaÊ do pliku tekstowego i dopisaÊ na jego koñcu odpowiednie wyra enia --with. Je li na przykïad dodajemy do serwera rozszerzenie Mcrypt, powinni my dopisaÊ wyra enie --with-mcrypt. Wïa ciwy parametr --with z reguïy mo na znale Ê w dokumentacji instalowanego rozszerzenia. UWAGA Je li zastÈpimy oryginalnÈ strukturÚ katalogów zawartÈ w pliku tar i umie cimy naszÈ bibliotekÚ w folderze innym ni domy lny, bÚdziemy musieli dodaÊ do flagi --with cie kÚ, aby rodowisko PHP mogïo tÚ bibliotekÚ odnale Ê. W powy szym przykïadzie taka sytuacja miaïa miejsce w przypadku biblioteki apxs (Apache Exten- sion Tool Synopsis), gdzie flaga --with-apxs=/usr/local/apache/bin/apxs okre laïa, e wspomniana biblioteka jest skïadowana w katalogu /usr/local/apache/bin/apxs. 8. Pobranie i rozpakowanie plików ródïowych nowej dystrybucji PHP oraz przej cie do katalogu, w którym umieszczono rozpakowane pliki. Kod ródïowy PHP mo na rozpakowaÊ dokïadnie tak, jak wcze niej rozpakowali my kod ródïowy biblioteki. Je li dysponujesz ju utworzonym wcze niej drzewem kodu PHP, mo esz je wykorzystaÊ, jednak w takim przypadku koniecznie u yj polecenia make clean. 9. Skopiowanie polecenia configure utworzonego wcze niej w pliku tekstowym, wklejenie go w wierszu poleceñ i naci niÚcie klawisza Enter, aby je wykonaÊ. W ten sposób ponownie skonfigurujemy rodowisko PHP z nowÈ bibliotekÈ i wszystkimi dotychczasowymi bibliotekami. Konfigurowanie PHP 47
    24. 10. Kompilacja kodu ródïowego PHP. Nale y wykonaÊ kolejno polecenia make i make install. Warto siÚ przygotowaÊ na dïugie oczekiwanie, a wymienione polecenia odpowiednio skompilujÈ i zainstalujÈ wszystkie komponenty PHP. UWAGA W razie dokonania jakichkolwiek zmian w plikach .ini (podobnych do tych poka- zanych we wcze niejszej czÚ ci tego rozdziaïu) wprowadzone modyfikacje mogÈ zostaÊ nadpisane ustawieniami domy lnymi w czasie ponownego kompilowania PHP. W takim przypadku warto do tych ustawieñ wróciÊ, aby mieÊ pewno Ê, e nasza konfiguracja nie zostaïa zmieniona. 11. Ponowne uruchomienie serwera Apache. Nale y wykonaÊ polecenie apachectl graceful. 12. Przetestowanie rodowiska PHP. W pierwszej kolejno ci warto uruchomiÊ skrypt Witaj wiecie!, aby sprawdziÊ, czy wïa nie zainstalowane rodowisko dziaïa wïa ciwie. NastÚpnie dobrze jest poeksperymentowaÊ z wywoïaniami rozmaitych funkcji definiowanych przez biblioteki, aby mieÊ pewno Ê, e tak e nowe biblioteki nie stwarzajÈ niespodziewanych problemów. Co mo e pój Ê nie po naszej my li? Liczba problemów, które mogÈ wystÈpiÊ w czasie kompilacji, jest tak dïuga, e omówienie ich wszystkich jest niemal niemo liwe. Chocia wiele bïÚdów jest do Ê skomplikowanych, a znaczna ich czÚ Ê jest ci le zwiÈzana z poszczególnymi bibliotekami (i tym samym wymaga bardzo specjalistycznych porad), trzy typo- we problemy wystÚpujÈ niemal zawsze. Pierwszym powa nym problemem, z którym mo emy siÚ zetknÈÊ, jest brak zainstalowanych pakietów wytwarzania oprogramowania w pobranej dystrybu- cji lub wersji. W takim przypadku bÚdziemy potrzebowali kompilatora jÚzyka C i rozmaitych wersji „deweloperskich” wielu innych bibliotek potrzebnych do skompilowania kodu. Po drugie, mo emy stanÈÊ przed konieczno ciÈ skonfigurowania rodowiska PHP z wykorzystaniem parametru --with definiujÈcego wprost cie kÚ do doïÈ- czanej biblioteki, np. --with-mcrypt=/usr/lib/mcrypt. Innym powszechnym ródïem problemów sÈ le skonfigurowane pakiety bi- bliotek rozszerzeñ. Jak ju wspomniano, bibliotekÚ Mcrypt nale y skonfiguro- waÊ z flagami --disable-nls --disable-posix-threads; w przeciwnym razie stoso- wanie tego pakietu mo e prowadziÊ nawet do awarii serwera Apache. Tak e inne biblioteki wymagajÈ do prawidïowego funkcjonowania w rodowisku PHP i na serwerze Apache pewnych dodatkowych zabiegów. Szczegóïowych infor- macji na ten temat nale y szukaÊ na stronach internetowych z najczÚ ciej zada- wanymi pytaniami, stronach pomocy systemowej oraz w plikach README. 48 Rozdziaï 2
    SlideShare Zeitgeist 2009

    + Wydawnictwo HelionWydawnictwo Helion Nominate

    custom

    641 views, 0 favs, 0 embeds more stats

    Obszerny zbiór przydatnych skryptów! Musisz go m more

    More info about this document

    © All Rights Reserved

    Go to text version

    • Total Views 641
      • 641 on SlideShare
      • 0 from embeds
    • Comments 0
    • Favorites 0
    • Downloads 3
    Most viewed embeds

    more

    All embeds

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?