You are on page 1of 28

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

PHP4.

Kompendium programisty
Autor: Blake Schwendiman
Tumaczenie: Pawe Gonera, Grzegorz Kowalski
ISBN: 83-7197-521-X
Tytu oryginau: PHP 4 Developer's Guide
Format: B5, stron: 840

Korzystajc z tej ksiki, moesz tworzy w PHP4 aplikacje WWW korzystajce z baz
danych. Dowiesz si, jak korzysta z nowych rozszerze sesji, szybszego interpretera
oraz rozszerzonej obsugi jzykw Java i XML powodujcych, e jzyk ten wietnie
nadaje si do tworzenia aplikacji WWW. Niniejsza ksika zawiera wiele praktycznych
przykadw objaniajcych sposoby tworzenia witryn za pomoc szablonw. Podrcznik
ten jest przydatny dla kadego zawodowego programisty, gdy opisuje wszystko od
instalacji i konfiguracji, do wykorzystywania istniejcych fragmentw oprogramowania.
Znajdziesz tu wszelkie informacje potrzebne do:
Poznania nowych funkcji PHP4
Przetwarzania formularzy i kontrolowania poprawnoci danych
Oddzielania HTML-a od kodu PHP4
Uruchamiania i ponownego wykorzystywania kodu
Korzystania z szablonw i baz danych
Generowania statycznych stron HTML na podstawie dynamicznych danych

"
"
"
"
"
"

adna inna ksika nie zawiera tak obszernego opisu programowania w PHP,
uwzgldniajcego najnowsze funkcje, jak ten nieoceniony przewodnik.

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl

O Autorze.......................................................................................................................................................... 9
Wstp .................................................................................................................................................................11
Rozdzia 1.

Kompilacja i instalowanie PHP ..............................................................................................................15


Wstp.................................................................................................................................15
Pobieranie PHP .................................................................................................................15
Instalowanie wersji binarnej..............................................................................................16
Binarna instalacja dla Windows..................................................................................16
Inne instalacje binarne ................................................................................................19
Kompilowanie PHP...........................................................................................................20
Kompilowanie PHP w systemach uniksowych...........................................................20
Kompilowanie PHP w rodowisku Windows.............................................................25
Podsumowanie wiadomoci na temat kompilacji PHP...............................................27
Konfigurowanie PHP ........................................................................................................27
Korzystanie z pliku php.ini .........................................................................................28
Inne metody zmiany konfiguracji PHP.......................................................................29
Podsumowanie ..................................................................................................................30

Rozdzia 2.

Jzyk................................................................................................................................................................. 31
Wstp.................................................................................................................................31
Oglne informacje na temat skadni..................................................................................31
Typy ..................................................................................................................................32
Liczby cakowite i zmiennoprzecinkowe...............................................................33
Cigi............................................................................................................................33
Tablice.........................................................................................................................35
Zmienne i stae ..................................................................................................................36
Zmienne predefiniowane ............................................................................................37
Zasig zmiennych .......................................................................................................40
Stae.............................................................................................................................41
Operatory i kolejno ich wystpowania ..........................................................................41
Instrukcje sterujce............................................................................................................42
if, else, elseif ...............................................................................................................43
while............................................................................................................................43

PHP4. Kompendium programisty


do .. while....................................................................................................................43
for ..............................................................................................................................44
foreach.........................................................................................................................45
switch ..........................................................................................................................45
break i continue...........................................................................................................47
include i require ..........................................................................................................49
Funkcje ..............................................................................................................................50
Klasy i programowanie obiektowe .............................................................................51
Porwnywanie wzorcw ...................................................................................................53
Podsumowanie ..................................................................................................................53

Rozdzia 3.

Formularze i cookie ..................................................................................................................................... 55


Wstp.................................................................................................................................55
Obsuga formularzy w PHP...............................................................................................57
Skalarne i wielowartociowe elementy formularza ....................................................57
Alternatywne metody odczytywania wartoci z formularza.......................................58
Wykorzystanie formularzy do przesyania plikw .....................................................62
Wykorzystanie danych................................................................................................62
Kontrola poprawnoci danych formularza ........................................................................63
Kontrola danych za pomoc wyrae regularnych .....................................................63
Kontrolowanie poprawnoci za pomoc sprawdzania typw .....................................66
Klasa Validator ...........................................................................................................66
Cookie ...............................................................................................................................68
Specyfika programowania dla WWW...............................................................................70
Obsuga nieprawidowych danych..............................................................................70
Obsuga i formatowanie wywietlanych danych ........................................................73
Podsumowanie ..................................................................................................................78

Rozdzia 4.

Operacje wykonywane na plikach.......................................................................................................79


Wstp.................................................................................................................................79
Odczytywanie i zapisywanie plikw.................................................................................79
Wykorzystanie gniazd .......................................................................................................81
Wykorzystanie potokw....................................................................................................82
Klasa File...........................................................................................................................83
Podsumowanie ..................................................................................................................85

Rozdzia 5.

Wysyanie plikw za pomoc formularza..........................................................................................87


Wstp.................................................................................................................................87
Wysyanie pojedynczego pliku .........................................................................................87
Problemy zwizane z przesyaniem plikw ......................................................................90
Przesyanie wielu plikw ..................................................................................................91
Bezpieczestwo.................................................................................................................92
Podsumowanie ..................................................................................................................93

Rozdzia 6.

Wsppraca PHP z bazami danych......................................................................................................95


Wstp.................................................................................................................................95
Wprowadzenie...................................................................................................................95
Funkcje baz danych...........................................................................................................96
MySQL..............................................................................................................................97
Rozpoczynamy prac z MySQL .................................................................................97
Wykorzystanie MySQL ..............................................................................................97
ODBC..............................................................................................................................101
Podstawy ODBC.......................................................................................................101
Korzystanie z ODBC ................................................................................................104

Spis treci

5
PHPLIB ...........................................................................................................................106
Przechowywanie danych pochodzcych z formularzy....................................................107
Wykorzystanie moliwoci bazy danych ........................................................................110
Podsumowanie ................................................................................................................112

Rozdzia 7.

Sesje i stan aplikacji................................................................................................................................... 113


Wstp...............................................................................................................................113
Podstawy dziaania sesji..................................................................................................113
Mechanizm zarzdzania sesjami wbudowany w PHP ......................................................114
Uruchomienie sesji w PHP .......................................................................................115
Przesyanie identyfikatora sesji bez wykorzystania cookie ......................................116
Zapisywanie zmiennych sesji w bazie danych..........................................................120
Inne funkcje i opcje dotyczce sesji..........................................................................125
Wykorzystanie PHPLIB do obsugi sesji ........................................................................127
Tworzenie wasnego mechanizmu obsugi sesji .............................................................130
Inynieria programowania a sesje ...................................................................................130
Podsumowanie ................................................................................................................133

Rozdzia 8.

Uwierzytelnianie ........................................................................................................................................ 135


Wstp...............................................................................................................................135
Podstawowy system uwierzytelniania w serwerze Apache ............................................135
Aktualizacja pliku .htaccess z wykorzystaniem PHP......................................................138
Podstawowe uwierzytelnianie za pomoc PHP ..............................................................142
Kompletny system uwierzytelniania oparty na PHP.......................................................143
Podsumowanie ................................................................................................................149

Rozdzia 9.

Niezaleno aplikacji od przegldarki ............................................................................................. 151


Wstp...............................................................................................................................151
Wprowadzenie.................................................................................................................151
Wewntrzne funkcje PHP ...............................................................................................152
BrowserHawk..................................................................................................................156
Wykorzystanie informacji na temat przegldarki ...........................................................161
Podsumowanie ................................................................................................................164

Rozdzia 10.

Uruchamianie aplikacji WWW...........................................................................................................165


Wstp...............................................................................................................................165
Inynieria programowania a uruchamianie aplikacji WWW..........................................166
Projekt aplikacji ........................................................................................................166
Definiowanie standardw programowania ...............................................................167
Przegld oprogramowania ........................................................................................167
Testowanie ................................................................................................................168
Uruchamianie ............................................................................................................168
Programowanie defensywne ...........................................................................................169
Dostosowanie mechanizmu obsugi bdw do potrzeb aplikacji ..................................175
Zaawansowana obsuga bdw ......................................................................................179
Podsumowanie ................................................................................................................186
Bibliografia......................................................................................................................186

Rozdzia 11.

Wielokrotne wykorzystanie kodu......................................................................................................187


Wstp...............................................................................................................................187
Ponowne wykorzystanie kodu a inynieria programowania...........................................187
Ponowne wykorzystanie istniejcego kodu.....................................................................188
PHP ...........................................................................................................................188
C/C++........................................................................................................................190

PHP4. Kompendium programisty


Java ...........................................................................................................................197
COM .........................................................................................................................201
Inne metody ..............................................................................................................204
Podsumowanie ................................................................................................................205
Bibliografia......................................................................................................................205

Rozdzia 12.

Oddzielanie kodu HTML od PHP.................................................................................................... 207


Wstp...............................................................................................................................207
Wprowadzenie.................................................................................................................207
Oddzielanie i integracja moduw kodu z wykorzystaniem wewntrznych funkcji PHP ......209
Przesanki..................................................................................................................209
Implementacja...........................................................................................................210
Czego naley unika? ...............................................................................................214
Oddzielanie i integrowanie kodw HTML i PHP
z wykorzystaniem funkcji PHP podsumowanie ............................................214
Wykorzystanie systemu szablonw ................................................................................215
FastTemplate.............................................................................................................215
Zaawansowane techniki wykorzystania klasy FastTemplate ...................................222
Podsumowanie ................................................................................................................225
Bibliografia......................................................................................................................225

Rozdzia 13.

Ten wspaniay PHP!................................................................................................................................ 227


Wstp...............................................................................................................................227
Wysyanie do przegldarki plikw innych ni HTML....................................................227
Skrypty wspomagajce prac administratora sieci..........................................................233
WDDX ............................................................................................................................239
Monitorowanie sieci........................................................................................................244
Podsumowanie ................................................................................................................246

Rozdzia 14. Witryny tworzone na podstawie szablonw .................................................................................247


Podstawy wykorzystania szablonw...............................................................................247
Zapoyczanie...................................................................................................................258
Personalizacja witryny ....................................................................................................261
Obsuga wielu jzykw w witrynie.................................................................................263
Podsumowanie ................................................................................................................266

Rozdzia 15.

Tworzenie witryny opartej na bazie danych................................................................................. 267


Wstp...............................................................................................................................267
Projekt bazy danych ........................................................................................................267
Zarzdzanie danymi aplikacji..........................................................................................271
Wywietlanie danych ......................................................................................................280
Podsumowanie ................................................................................................................286

Rozdzia 16.

Generowanie statycznych stron HTML na podstawie dynamicznych danych............. 287


Wstp...............................................................................................................................287
Koncepcja........................................................................................................................288
Generowanie stron statycznych.......................................................................................288
Wykorzystanie buforowania .....................................................................................288
Wykorzystanie klasy FastTemplate ..........................................................................290
Techniki buforowania .....................................................................................................293
Podsumowanie ................................................................................................................295

Spis treci

Rozdzia 17.

7
Witryny handlu elektronicznego ....................................................................................................... 297
Wstp...............................................................................................................................297
Bezpieczestwo...............................................................................................................297
Zastosowanie SSL.....................................................................................................298
Certyfikaty ................................................................................................................298
Bezpieczestwo bazy danych ...................................................................................299
Przetwarzanie patnoci...................................................................................................300
Dostarczanie produktw..................................................................................................309
Podsumowanie ................................................................................................................310

Dodatek A
Dodatek B

Opis funkcji PHP w porzdku alfabetycznym ............................................................................. 311


Predefiniowane zmienne i stae PHP ................................................................................................ 775
Zmienne...........................................................................................................................775
Zmienne Apache .......................................................................................................775
Zmienne rodowiska .................................................................................................778
Zmienne PHP ............................................................................................................778
Stae.................................................................................................................................780

Dodatek C

Opcje kompilacji PHP..............................................................................................................................783


Bazy danych ....................................................................................................................783
Handel elektroniczny.......................................................................................................787
Grafika.............................................................................................................................787
Rne...............................................................................................................................788
Sie ..................................................................................................................................794
Dziaanie PHP .................................................................................................................795
Serwer..............................................................................................................................796
Tekst i jzyk ....................................................................................................................797
XML ................................................................................................................................797

Dodatek D

Opcje konfiguracji PHP ......................................................................................................................... 799


Oglne dyrektywy konfiguracji ......................................................................................799
Dyrektywy konfiguracji poczty.......................................................................................803
Dyrektywy konfiguracji trybu bezpiecznego ..................................................................804
Dyrektywy konfiguracji debuggera.................................................................................804
Dyrektywy adowania rozszerze ...................................................................................804
Dyrektywy konfiguracji MySQL ....................................................................................805
Dyrektywy konfiguracji mSQL.......................................................................................806
Dyrektywy konfiguracji PostgreSQL..............................................................................806
Dyrektywy konfiguracji Sybase ......................................................................................806
Dyrektywy konfiguracji Sybase-CT................................................................................807
Dyrektywy konfiguracji Informix ...................................................................................808
Dyrektywy konfiguracji BC Math...................................................................................809
Dyrektywy konfiguracji moliwoci przegldarek .........................................................810
Dyrektywy konfiguracji zunifikowanego ODBC ...........................................................810

Dodatek E

Zasoby Sieci.................................................................................................................................................. 811


Skorowidz......................................................................................................................................................813

Uruchamianie aplikacji WWW jest, tak jak w przypadku innych typw aplikacji, procesem
krytycznym. Problemem moe by zdalne uruchamianie programu, szczeglnie jeli nie masz
odpowiednich uprawnie do administrowania serwerem WWW. W tym rozdziale zaprezentowane
s porady i narzdzia, ktre mog usprawni proces uruchamiania aplikacji. Ponadto w niektrych
podrozdziaach przedstawione s zasady inynierii programowania, poniewa mona unikn
wielu problemw przy uruchamianiu aplikacji, jeeli jej projekt jest odpowiednio przygotowany.
Z powodu ogromnego zainteresowania aplikacjami WWW powstao wiele narzdzi (midzy
innymi PHP) do tworzenia takich aplikacji. Niektre spord tych narzdzi zostay stworzone
na podstawie narzdzi ju istniejcych, na przykad ASP i JSP, natomiast inne zostay stworzone
specjalnie dla potrzeb projektowania interaktywnych aplikacji WWW. Wikszo tych narzdzi
nie spenia podstawowych zasad inynierii programowania. By moe wynika to z faktu, e projektowanie aplikacji WWW to zupenie nowa dziedzina informatyki, a pierwszymi projektantami
nowej technologii nie byli dowiadczeni programici. Niezalenie od tych przyczyn, do nowego
rodowiska programowania naley zaadaptowa wszystkie istniejce zasady inynierii programowania. W poniszym podrozdziale zostay przypomniane zasady inynierii programowania. Przestrzeganie tych zasad pozwala unikn wielu bdw w projektowaniu, dziki czemu uruchamianie
aplikacji przebiega sprawniej i szybciej.

166

PHP4. Kompendium programisty

Jak napisaem w rozdziale 3., Formularze i cookie, mona unikn sprawdzania poprawnoci
niektrych danych w przypadku zastosowania lepszego mechanizmu wprowadzania danych.
Analogicznie, napisanie lepszego (bardziej defensywnego) kodu znacznie skraca czas uruchamiania aplikacji.
Projekt aplikacji WWW musi by dokadnie przemylany, podobnie jak projekt kadej innej aplikacji. Tworzenie sprawnej, efektywnej aplikacji wymaga opracowania waciwego projektu, zachowania zgodnoci ze standardami tworzenia oprogramowania, sprawdzania oprogramowania,
testowania moduw oraz ostatecznego uruchomienia aplikacji. Poszczeglne czynnoci s omwione poniej, w kolejnych sekcjach. Zakadam, e posiadasz ogln wiedz na temat inynierii
programowania.

Projekt aplikacji
Przed rozpoczciem pisania kodu naley okreli wstpne zaoenia aplikacji. W przypadku
realizacji duych projektw takie planowanie moe zaj tygodnie lub miesice. Z kolei wstpne
zaoenia niewielkich projektw mog zosta zapisane na skrawku papieru w cigu kilku minut.
Zawsze naley przeanalizowa wymagania aplikacji, a take opracowa wszelkie alternatywne
sposoby realizacji zada aplikacji przed rozpoczciem pisania kodu. Badania firm TRW i IBM
wskazuj, e wprowadzenie zmian do aplikacji w pocztkowym okresie programowania jest
10 do 200 razy tasze ni wprowadzanie tych samych zmian na kocu caego procesu tworzenia
aplikacji (McConnell, 1993).
W zalenoci od rodzaju projektu, okrelenie wymaganych funkcji aplikacji moe by bardzo pracochonne. Wstpny podzia aplikacji na moduy moe uproci ten proces. W aplikacji WWW moduami takimi mog by: wsppraca z baz danych, autoryzacja uytkownika, obsuga stanu itd.
Po okreleniu zada poszczeglnych moduw naley w razie potrzeby podzieli je na
mniejsze fragmenty i zapisa przeznaczenie kadego fragmentu. W maych aplikacjach dobr
strategi jest podzia moduw na pliki kodu bd klasy obiektowe.
Po zdefiniowaniu zada aplikacji naley opracowa architektur systemu. Trzeba okreli rodzaj
stosowanego systemu zarzdzania relacyjn baz danych (SZRBD) i przeanalizowa wiele innych
elementw struktury, np. organizacj plikw kodu, sposb realizacji ewentualnych zmian itp. Trzeba
take rozway, czy niektre moduy naley zakupi, czy te lepiej napisa je samodzielnie. Mimo
e PHP moe dziaa na wielu serwerach WWW i platformach systemowych, kada z takich
kombinacji posiada indywidualne cechy. Naley powici troch czasu na okrelenie, ktra
platforma sprztowa i serwer WWW bdzie najlepiej odpowiada potrzebom tworzonej aplikacji.
Wstpny budet projektu rzadko jest dobrym powodem wyboru okrelonej platformy. Wybr bazy
danych jest rwnie istotny, jeeli aplikacja ma by dynamiczna. Ponadto naley rozway, czy
serwer WWW i baza danych bd pracoway na tym samym komputerze, czy osobno. W zalenoci od wielkoci i charakteru aplikacji moe by to krytyczne zagadnienie.

Rozdzia 10. / Uruchamianie aplikacji WWW

167

Po przeanalizowaniu tych wszystkich zagadnie naley okreli organizacj kodu. Zdefiniuj konwencj nazywania plikw i katalogw, co uproci identyfikacj kodu. Wymyl alternatywny
plan na wypadek, gdy istnieje due prawdopodobiestwo zmian. Jeeli przewidujesz wystpowanie zmian, napisz aplikacj, ktra bdzie lokalizowaa zmiany w kilku moduach, a reszt
buforowaa. Jest to szczeglnie istotne wtedy, gdy przy tworzeniu aplikacji korzystasz
z narzdzi pochodzcych z innych rde lub oprogramowania w wersji beta. Tworzenie zastpnikw takiego kodu jest atwe do zaimplementowania i w duszym okresie czasu zapewnia atwiejsze utrzymanie aplikacji.
Na koniec naley zadecydowa, ktre moduy aplikacji zostan stworzone przy pomocy gotowych narzdzi pochodzcych od zewntrznych dostawcw. Dylemat tworzy czy kupi
jest do problematyczny. W zalenoci od harmonogramu projektu, moesz nie mie wystarczajco duo czasu, aby mc dostatecznie przetestowa dostpne narzdzia. Jednak moesz
rwnie nie mie wystarczajco duo czasu na stworzenie ich od podstaw. Aby zmniejszy
wpyw tej decyzji na projekt, mona stworzy wasne funkcje porednie, ukrywajce implementacj gotowych narzdzi.
Waciwe zaprojektowanie aplikacji wymaga czasu. W dobrych systemach faza projektowania
zajmowaa 20 do 30 procent czasu ich tworzenia (McConnell, 1993). Jest to czas przeznaczony na
projektowanie wysokiego poziomu, a przecie projektowanie szczegw implementacji rwnie
zabiera sporo czasu.

Definiowanie standardw programowania


Zdefiniowanie standardw programowania uatwia zarzdzanie aplikacjami o dowolnej wielkoci.
Nawet mae aplikacje programowane przez jednego programist mog korzysta ze standardw
programowania. Taki standard obejmuje sposoby nazywania, komentowania oraz konwencje
ukadu. Niektre z nich, na przykad ukad kodu, s mniej istotne, poniewa nowoczesne edytory
potrafi przeformatowa kod, jednak inne, na przykad konwencje nazw plikw i katalogw, mog
mie ogromne znaczenie w procesie konserwacji kodu1.

Przegld oprogramowania
Przegld oprogramowania umoliwia zrealizowanie kilku celw naraz. Na przykad, przegld
oprogramowania umoliwia porwnanie kodu ze standardami kodowania. Pocztkujcy programici mog korzysta z wiedzy bardziej dowiadczonych kolegw. Przegldy oprogramowania
umoliwiaj take zapewnienie odpowiedniej jakoci oprogramowania. Analizy przegldw oprogramowania stosowanych przy tworzeniu rzeczywistych aplikacji wykazay, e przegldy umoliwiaj wykrywanie bdw ze skutecznoci 55 60%. Ten wynik naley zestawi z jedynie
25-procentow skutecznoci testowania moduw, 35-procentow testowania funkcji oraz
1

Z powodu swobodnego traktowania typw w PHP szczeglnie istotne jest odpowiednie nazywanie
zmiennych. Dobrym pomysem moe by stosowanie tzw. notacji wgierskiej, w ktrej nazwa zmiennej
zaczyna si od liter okrelajcych jej typ, np.:  to zmienna przechowujca liczby cakowite, 

zawiera cig znakw, a    to zmienna logiczna przyp. tum.

168

PHP4. Kompendium programisty

45-procentow skutecznoci testowania integracyjnego. Ponadto przegldy takie zwikszaj


w duych projektach ogln wydajno zespou. W niektrych przypadkach ograniczaj one moliwo wystpienia awarii do 80 90%, a take zapewniaj 10 25% wzrost wydajnoci aplikacji
(McConnell, 1993). Przegld powinien by przeprowadzany zarwno podczas testowania, jak
i podczas implementacji. Przegld projektu umoliwia wykrycie jego wad w momencie, gdy ich
usuwanie jest najprostsze i najtasze.
Przegld moe by realizowany na kilka sposobw. Niektre z nich s formaln inspekcj kodu
inne przegldem oglnym lub czytaniem kodu. W przypadku formalnej inspekcji kodu kilku
czonkw zespou spotyka si w celu odszukania bdw. Prowadzcy spotkanie powinien
dba o postpy w pracy i pilnowa, aby jedynym tematem bya identyfikacja bdw. Formalna
inspekcja kodu nie powinna dotyczy zasadnoci stosowanych rozwiza. W przypadku przegldu
oglnego grupa programistw prowadzi nieformaln dyskusj na temat kodu, zadajc pytania.
Gwnym celem spotkania jest identyfikacja bdw, a nie ustalenie sposobw ich usunicia.
Czytanie kodu powicone jest jedynie udoskonalaniu istniejcego kodu programu. Zwykle cz
kodu jest przekazywana dwm lub wicej osobom, ktre, pracujc niezalenie, identyfikuj bdy.
Wynik ich pracy jest przekazywany autorowi kodu.
Wybr metody przegldu kodu zaley od rozmiaru i sposobu organizacji projektu. Jeli pracujesz
sam lub w maym zespole, przegld metod czytania kodu moesz zleci osobie trzeciej. Niezalenie od rodzaju wybranej metody, przeprowadzenie przegldu kodu jest najbardziej efektywn
metod identyfikacji problemw w projekcie bd implementacji.

Testowanie
Podobnie jak w przypadku innych projektw, testowanie aplikacji WWW powinno obejmowa
rne poziomy aplikacji: testowanie funkcji, testowanie moduw oraz testowanie integracyjne.
Testowanie kadego moduu powinno by odpowiednio zaplanowane. Testy stanowi zbir okrelonych oczekiwa i wymaga.
Testowanie niewielkich projektw moe polega na sprawdzeniu funkcjonowania aplikacji
w kilku przypadkach jej wykorzystania. W przypadku tworzenia wikszych projektw czsto
zatrudniani s specjalici, ktrzy zajmuj si jedynie testowaniem, jednak kady z programistw
powinien by odpowiedzialny za dostarczenie testerom tylu danych, aby ich praca bya efektywna.
Kady twrca kodu powinien rwnie by odpowiedzialny za testowanie swoich moduw na poziomie funkcji lub strony.

Uruchamianie
Uruchamianie jest ostatnim etapem w procesie tworzenia aplikacji, poniewa w momencie,
gdy nastpuje uruchamianie, powinny by ukoczone procesy projektowania, programowania
i cz testowania. Uruchamianie moe by przeprowadzane w kadej fazie testowania jako
cz tego procesu. Wszystkie zmiany wprowadzone do kodu w trakcie procesu uruchamiania
powinny zosta ponownie przetestowane na wszystkich poziomach testowania, poniewa
zmiany te mog by przyczyn powstania nowych bdw.

Rozdzia 10. / Uruchamianie aplikacji WWW

169

Uruchamianie powinno by gruntownym procesem zmierzajcym do zidentyfikowania rde


ewentualnych problemw. Kady programista biorcy udzia w testowaniu powinien zna rdo
problemu w momencie, gdy stwierdza si, e problem zosta usunity. Znalezienie rda problemu
powinno owocowa stworzeniem kompletnego rozwizania, a nie prb obejcia problemu. W niektrych przypadkach tymczasowe rozwizania mog by wystarczajce, ale musz zosta odpowiednio udokumentowane. W trakcie rozwizywania problemw naley uwzgldnia priorytety.
Nie sposb w tej ksice, powiconej gwnie PHP, przedstawi wszelkich zasad inynierii
programowania. Programista winien pamita, e zasady inynierii programowania obowizuj
we wszystkich aplikacjach, czyli rwnie w aplikacjach WWW, a ich przestrzeganie uatwia
uruchamianie i pniejsze administrowanie aplikacj. W nastpnej czci rozdziau przedstawione s techniki i narzdzia specyficzne dla aplikacji PHP.

Zanim zaczniesz uruchamia program, powiniene podj czynnoci prowadzce do ograniczenia iloci bdw w kodzie. Taki sposb programowania jest nazywany programowaniem
defensywnym. Polega ono na odpowiednim komentowaniu bdw, a take wewntrznym
sprawdzaniu stanu procedur w trakcie programowania. Kady programista moe komentowa
bdy na swj sposb, jednak komentarze te powinny by zgodne z oglnym standardem. Programici powinni opisywa przeznaczenie funkcji, klasy lub doczanego pliku oraz zawsze
komentowa niejasne fragmenty kodu.
Do sprawdzania stanu funkcji PHP, tak jak wiele jzykw wysokiego poziomu, stosuje funkcj
. Funkcja  oblicza warto przekazanego parametru i podejmuje okrelone akcje
w przypadku, gdy jego warto wynosi  . W PHP do funkcji  mona przekaza
zarwno cig, jak i warto Boolean. Jeeli przekazany zosta cig, jest on wykonywany jako
blok kodu PHP. Opcje asercji w pliku php.ini (
  , 
 , 
 ,

   i 
   ) lub opcje przekazane jako parametr wywoania funkcji
  definiuj akcj, jak podejmuje funkcja . W tabeli 10.1 wyszczeglnione
s rne opcje asercji.
Tabela 10.1. Opcje asercji i ich opis

Opcja

Domylnie

Opis

   

Wcza wykonywanie funkcji 

   

Wywietla ostrzeenie PHP przy kadej nieudanej asercji

    

Koczy wykonanie w przypadku nieudanej asercji

  
 

Wycza raportowanie bdw w czasie obliczenia wyraenia


asercji

   




Nazwa funkcji uytkownika wykonywanej w przypadku nieudanej


asercji

170

PHP4. Kompendium programisty

Funkcja  jest zaprojektowana jedynie do wykorzystywania w czasie tworzenia programu


i nie powinna by uywana w czasie zwykej pracy aplikacji. Aplikacja powinna dziaa identycznie z wywoaniami funkcji , jak i bez nich. Skrypt z wydruku 10.1 przedstawia przykad wykorzystania funkcji  do kontrolowania poprawnoci parametrw wejciowych.
Wydruk 10.1. Wykorzystanie funkcji assert() do kontrolowania poprawnoci parametrw wejciowych


 !!  "!
#
" $%
&&!  ''( (    ' ')*)
  + "!+%
  "!", -  
#
  + 
-  ", -  +%
" .$", -  %
/

" &
 "!%
/
0

Umieszczona w powyszym skrypcie funkcja   spodziewa si jako parametru


tablicy wartoci numerycznych (liczb lub cigw zawierajcych liczby) i zwraca redni z wartoci
w tablicy. Wyraenie  jest wykorzystywane do kontrolowania poprawnoci parametru
przekazanego do funkcji, a pniej do sprawdzania, czy tablica zawiera wartoci numeryczne.
Do  mona przekaza cig, ktry jest wykonywany jako kod PHP, wic jeeli wykorzystywane s zmienne, naley zapewni, e PHP nie podstawi zbyt wczenie wartoci zmiennej
w miejsce jej nazwy. Aby tego unikn, naley uywa cigw w apostrofach. Testowy skrypt dla
funkcji z wydruku 10.1 jest zamieszczony na wydruku 10.2.
Wydruk 10.2. Wykorzystanie funkcji ArrayAverage()

 
1 23&
32%
0
 -0
 10
  0     &  0
& 10
 10

"4 
 $!!  56575859%
  2!!  56575859$"4 
  02%
"4 
 $!!  352939257528259%
  2!!  35:2939:2575:28:259$"4 
  02%
"4 
 $!!  5652 25859%
  2!!  565:2 :25859$"4 
  02%
"4 
 $!!  56%
  2!!  56$"4 
  02%
0
& 10
& -0

Rozdzia 10. / Uruchamianie aplikacji WWW

171

Testowy skrypt wywouje funkcj   cztery razy. Najpierw dwukrotnie przekazywane s waciwe wartoci, a nastpnie dwukrotnie skrypt przekazuje wartoci nieprawidowe.
Wynik dziaania skryptu jest przedstawiony na rysunku 10.1. Poniewa PHP wewntrznie wymusza typy zmiennych, wywoanie     jest realizowane
bez adnych ostrzee (poza generowanymi przez asercje).

Rysunek 10.1. Testowanie funkcji ArrayAverage()


Podejmowane przez funkcj  dziaania zale od ustawie asercji. W poprzednim przykadzie wykorzystane zostay domylne ustawienia asercji. Asercje maj t zalet, e gdy 

   jest ustawione na  , przestaj dziaa. Aby zmieni t opcj, naley albo wywoa
funkcj  !!"#$%$&'" , albo odpowiednio ustawi dyrektyw konfiguracji. Wykorzystujc opcj konfiguracji, mona instalowa aplikacj w rodowisku z wyczonymi asercjami, a pracowa w takim, w ktrym asercje s aktywne.
Istnieje jeszcze jedna funkcja pomagajca w programowaniu defensywnym,  .
Funkcja ta jako argumentu wymaga liczby cakowitej okrelajcej poziom raportowania bdw.
Argument ten jest traktowany jako maska bitowa, wic mona poda zestaw kilku ustawie.
PHP posiada zestaw staych uywanych razem z t funkcj. S one wyszczeglnione poniej.

Warto

Nazwa

,,44;4

,<!4==>

,)!4?,

,=;@,

16

,@;4,,44;4

32

,@;4,<!4==>

64

,@;A)B,,44;4

128

,@;A)B,<!4==>

256

,C?,4,44;4

512

,C?,4<!4==>

1024

,C?,4=;@,

172

PHP4. Kompendium programisty

Istnieje rwnie dodatkowa staa, "((, ktra uaktywnia wszystkie informacje o bdach. W trakcie tworzenia aplikacji poziom raportowania bdw naley ustawi na "((, co spowoduje
wywietlanie wszystkich informacji o bdach w kodzie. Ustawienie to jest rwnie przydatne
w trakcie doczania do aplikacji zewntrznej biblioteki. Przykadowy kod zamieszczony na wydruku 10.3 generuje ostrzeenia w przypadku ustawienia maksymalnego poziomu raportowania
bdw. Przy standardowych ustawieniach skrypt nie wywietla adnego komunikatu.
Wydruk 10.3. Przykad wykorzystania funkcji error_reporting()
 -0
 10
  0)' -   DE1F&  0
& 10
 10

"!$2  2$021252
 2$02A1 25
2 2$024 G
252
 2$02C?2%
&&? 11' -   DE1F
  2!H  I$23"!H  I32 02%
   ,!BB%
  2!H  I$23"!H  I32 02%
0
& 10
& -0

Wyniki dziaania powyszego skryptu s przedstawione na rysunku 10.2. Jak mona zauway,
ustawienie bardziej restrykcyjnego poziomu raportowania bdw moe zaowocowa wykryciem
bdw w kodzie, ktre mog by rdem wielu problemw w procesie tworzenia aplikacji.
W tym przypadku problem moe wydawa si bahy, ale jeeli zdefiniujemy sta o nazwie
 reprezentujc stan dziaania aplikacji, problem nabierze znaczenia. Na wydruku 10.4
przedstawiony jest skrypt z tak wanie sta. Wyniki jego dziaania s widoczne na rysunku 10.3.
Wydruk 10.4. Drugi przykad wykorzystania funkcji error_reporting() oraz staej state

&&? 1' D  
1    57%
&&)' D1
J( D  
0
 -0
 10
  0)' -   DE1F&  0
& 10
 10

"!$2  2$021252
 2$02A1 25
2 2$024 G
252
 2$02C?2%
&&K-L' -  
  2!H  I$23"!H  I32 02%
   ,!BB%
  2!H  I$23"!H  I32 02%
0
& 10
& -0

Rozdzia 10. / Uruchamianie aplikacji WWW

173

Rysunek 10.2. Wynik dziaania skryptu error_reporting()

Rysunek 10.3. Wynik dziaania drugiego skryptu error_reporting()


W obu przykadach, gdy poziom raportowania bdw by ustawiony na poziom standardowy,
nie byy generowane adne ostrzeenia i program dziaa niemal bezbdnie. Jednak po dodaniu
staej (w drugim przykadzie) wietnie dziaajcy program nagle przesta dziaa. Problem taki moe
by bardzo trudny do zidentyfikowania, jeeli staa byaby zdefiniowana w doczanym pliku.
Jak wida, warto ustawia poziom raportowania bdw na maksimum. Wszystkie wywietlane
ostrzeenia powinny zosta zlikwidowane, aby unikn wystpowania bdw w przyszoci.
W zalenoci od specyfiki Twojego rodowiska pracy, moesz ustawi poziom raportowania bdw na maksymalny w trakcie tworzenia aplikacji i na minimalny na serwerze produkcyjnym.
Takie ustawienie powoduje, e w przegldarkach uytkownikw nie pojawiaj si ostrzeenia
i komunikaty bdw. Uwaam jednak, e najlepiej ustawi na serwerze produkcyjnym poziom
raportowania na maksimum, kierujc strumie bdw do pliku dziennika. Mona to zrealizowa,
ustawiajc zmienne konfiguracji )  ,  i   na, odpowiednio: *++,
* i ). Powoduje to, e PHP nie wywietla bdw w przegldarce, ale zapisuje je do pliku
). Dla serwera Apache plikiem ) jest dziennik bdw. Jeeli chcesz, moesz skorzysta z innej lokalizacji dziennika.
Gdy zostanie wykonany skrypt z wydruku 10.3 po skonfigurowaniu PGP w sposb przedstawiony powyej, na ekranie nie pojawi si ostrzeenia, a w pliku dziennika bdw Apache znajd
si nastpujce pozycje:
HMNK N66O97O66I)*)< OC1  1  O7 O:  :8N
1 
1 : ::   63 -  P
HMNK N66O98O7I)*)< OC  
1  1    N
- 1+  + 
O:  :8N1 
1 : ::   3 -  6

174

PHP4. Kompendium programisty


HMNK N66O98O89I)*)< OC  
1  1    N
- 1+  + 
O:  :8N1 
1 : ::   3 -  6
HMNK N66O98O8QI)*)< OC1  1  O7 O:  :8N
1 
1 : ::   63 -  P
HMNK N66O98O9I)*)< OC1  1  O7 O:  :8N
1 
1 : ::   63 -  P
HMNK N66O98O97I)*)< OC  
1  1    N
- 1+  + 
O:  :8N1 
1 : ::   3 -  6

Nastpn czynnoci realizowan w ramach programowania defensywnego moe by napisanie wasnego mechanizmu rejestrujcego. W dowolnych miejscach aplikacji mona sprawdza
stan niektrych funkcji lub raportowa bdy wewntrzne i kontynuowa prac. PHP udostpnia funkcj  , przy pomocy ktrej mona dodawa wasne zapisy do pliku ladu
aplikacji. Prototyp funkcji   wyglda nastpujco:
    -
  5   H5   H5   II

Pierwszy parametr, , , zawiera zapisywane dane. Drugi z parametrw okrela miejsce,
w ktrym zostanie zapisany komunikat. Lista prawidowych wartoci parametru  znajduje
si w tabeli 10.2.
Tabela 10.2. Wartoci parametru typ

Warto

Opis

Parametr -
  jest wysyany do systemowego mechanizmu rejestrowania PHP
przy uyciu mechanizmu rejestrowania zapewnianego przez system operacyjny lub pliku
w zalenoci od ustawienia zmiennej konfiguracji 

Komunikat jest wysyany poczt elektroniczn na adres podany w parametrze  .


Jedynie ten typ zapisu wykorzystuje parametr  . Do obsugi tego typu
komunikatu wykorzystywana jest ta sama funkcja wewntrzna, co w funkcji - 

Komunikat jest wysyany poprzez poczenie PHP uywane do uruchamiania zdalnego.


Opcja ta jest dostpna jedynie w przypadku, gdy jest wczone uruchamianie zdalne.
W tym przypadku parametr   okrela nazw komputera lub adres IP oraz, opcjonalnie,
numer portu uywanego do odbierania informacji uruchamiania

Komunikat jest doczany do koca pliku o nazwie  

W czasie pisania ksiki typ 2 nie by dostpny. Kod rdowy zawiera komentarz informujcy,
e zdalne uruchamianie nie jest jeszcze dostpne. Inne typy komunikatw dziaaj w sposb
opisany w tabeli. Skrypt zamieszczony na wydruku 10.5 stanowi przykad wykorzystania funkcji
 .
Wydruk 10.5. Wykorzystanie funkcji error_log()
 -0
 10
  04     DE1F&  0
& 10
 10

&&R   DE1
11'   - 

Rozdzia 10. / Uruchamianie aplikacji WWW

175

 2ASTUVWKO ( D D(1X25%


&&<D  DE1
' ( N- 
 2ASTUVWKO ( D D(1X2552 Y  3 25
2Z-O  Y- 3-::2%
&&R   DE1
 
L1
 
 2ASTUVWKO ( D D(1X25752& -& 32%
0
< ( D DE13
& 10
& -0

Pierwsze wywoanie funkcji   zapisuje komunikat bdu w systemowym dzienniku
bdw. W powyszym przykadzie bd ten wysyany jest do dziennika bdw Apache. Drugie
wywoanie skutkuje wysaniem poczty elektronicznej do odbiorcy okrelonego w parametrze  .
Informacje zawarte w dodatkowych nagwkach s utworzone na podstawie tych samych zasad,
co w przypadku funkcji , . Ostatnie wywoanie powoduje zapisanie komunikatu bdu do
pliku, w tym przypadku /tmp/error.log.
Wykorzystanie tego mechanizmu nie jest w dosownym znaczeniu uruchamianiem, ale jego
zastosowanie moe znacznie skrci i uatwi waciwe uruchamianie, umoliwiajc wyeliminowanie niektrych bdw i przeocze ju w fazie programowania. Jak wczeniej wspomniaem,
ograniczenie liczby bdw w kodzie powinno by priorytetem dla kadego programisty.

Tak jak niemal kady element PHP, mechanizm obsugi bdw mona dostosowa do wasnych
potrzeb, aby spenia wymagania aplikacji. Funkcja   umoliwia skonstruowanie prostego
mechanizmu rejestrowania wasnych bdw wystpujcych w aplikacji, ale nie umoliwia obsugi
bdw generowanych przez PHP. Nie pozwala rwnie na przechwytywanie komunikatw generowanych przez funkcje . Na szczcie w PHP takie przypadki mona obsugiwa w inny
sposb.
Funkcja -)  pozwala zarejestrowa funkcj w PHP, ktra bdzie wywoywana
za kadym razem, gdy zostanie wygenerowany komunikat bdu. Funkcja -) 
wymaga podania jednego argumentu nazwy funkcji obsugi bdw. Prototyp takiej funkcji
wyglda nastpujco:

 ,@U    1
5     1
5  '
5 
  5  

Sposb rejestrowania i wykorzystania funkcji obsugi bdw jest przedstawiony w przykadowym


skrypcie na wydruku 10.6.

176

PHP4. Kompendium programisty

Wydruk 10.6. Wykorzystanie funkcji set_error_handler()




 -,*1 ",=5",? 5"Z  5"B  5"@ G 
#
 ",=
#
 ,,44;4O
", $2,,44;42%&&    ( [
  %
 ,<!4==>O
", $2,<!4==>2%
  %
 ,)!4?,O
", $2,)!4?,2%&&    ( [
  %
 ,=;@,O
", $2,=;@,2%
  %
 ,@;4,,44;4O
", $2,@;4,,44;42%&&    ( [
  %
 ,@;4,<!4==>O
", $2,@;4,<!4==>2%&&    ( [
  %
 ,@;A)B,,44;4O
", $2,@;A)B,,44;42%&&    ( [
  %
 ,@;A)B,<!4==>O
", $2,@;A)B,<!4==>2%&&    ( [
  %
 ,C?,4,44;4O
", $2,C?,4,44;42%
  %
 ,C?,4<!4==>O
", $2,C?,4<!4==>2%
  %
 ,C?,4=;@,O
", $2,C?,4=;@,2%
  %
1 
 O
", $2C=\=;<=,44;4]),2%
  %
/
  2    1 $:2:20 0 102%
  2 0", & 0O 0",? & 0 02%
  2 
"Z    "B   02%
  2& 10& 0&   02%
/
  1 2-,*1 2%
   ,!BB%
0
 -0
 10
  0<D D
 DE1F&  0
& 10
 10


Rozdzia 10. / Uruchamianie aplikacji WWW

177

    2   DE1F25,C?,4,44;4%


"!$2  2$021252
 2$02A1 25
2 2$024 G
252
 2$02C?2%
  2!H  I$23"!H  I32 02%
0
& 10
& -0

W powyszym skrypcie zostaa zdefiniowana funkcja obsugi bdw ,".) , ktra
wywietla komunikaty bdw w obramowanej tabeli zawierajcej jedn komrk, co pomaga
w odrnieniu komunikatu bdu od reszty kodu HTML. Po zainstalowaniu funkcji obsugi skrypt
powoduje dwa bdy. Pierwszy jest generowany przy uyciu funkcji PHP  .
Drugi bd (ostrzeenie) jest identyczny z bdem przedstawionym na wydruku 10.3. Na rysunku
10.4 przedstawiony jest wynik dziaania skryptu.

Rysunek 10.4. Dziaanie funkcji set_error_handler()


Przy stosowaniu funkcji -)  naley pamita o tym, e PHP nie przekazuje
do funkcji obsugi bdw typu ""##*#, "/#!", "%*#""##*#, "%*#"0#1&12, "%*3/&("
"##*# oraz "%*3/&("0#1&12. Obsuga tego typu bdw przez uytkownika nie jest bezpieczna.
Z tego powodu w kodzie funkcji obsugi bdw z wydruku 10.6 pojawiy si komentarze nie
powinien wystpi.

Uwaga na temat funkcji set_error_handler()


Funkcja -)  jest dostpna w PHP od wersji 4.0.1. Dodatkowo, funkcja uyta
w tym przykadzie posiada pi parametrw, w tym nazw skryptu, numer linii i dane
kontekstu. Parametry te s dostpne dopiero w wersji 4.0.2. Wczeniejsze wersje miay tylko
dwa parametry: typ komunikatu i komunikat.
W skrypcie z wydruku 10.6 nie s wykorzystane dane na temat kontekstu. Bd one opisane
w nastpnej czci rozdziau. Dane te zawieraj nazwy i wartoci zmiennych istniejcych w skrypcie w momencie wystpienia bdu.
Rwnie funkcja  umoliwia zdefiniowanie wywoywanej funkcji. Aby to zrealizowa,
naley zastosowa funkcj  . Funkcja obsugujca nieudane asercje jest zdefiniowana w nastpujcy sposb:

 !  @ "=') 


5"=B  5"! 

178

PHP4. Kompendium programisty

Uwaga na temat funkcji assert_options()


W PHP do wersji 4.0.2 wcznie w funkcji   by obecny drobny bd. Wystpowa on w przypadku wywoania funkcji w postaci  !!"#$%((4%5
w celu odczytania ustawionej funkcji obsugi. Mimo e w dokumentacji napisano, e wywoanie takie zwrci jedynie nazw biecej funkcji obsugi, to dodatkowo, oprcz zwracania nazwy, usuwane byo biece ustawienie funkcji obsugi. Dlatego jeeli chcesz uy
funkcji  z funkcj obsugi, upewnij si, e nie jest wywoywana pniej funkcja
  w celu sprawdzenia nazwy zarejestrowanej funkcji. Bd ten zosta zauwaony i poprawiony w PHP od wersji 4.0.2.
Skrypt zamieszczony na wydruku 10.7 przedstawia przykad zdefiniowania i uycia funkcji
wywoywanej przez .
Wydruk 10.7. Wykorzystanie funkcji wywoywanej przez ASSERT_CALLBACK

   ,!BB%

 A!@ "Z  =- 5"B  =
-5"!  
#
  2    1 $:2:20 0 102%
  2 0  & 0
1 O 0"!  & 0 02%
  2 
"Z  =-   "B  =
- 02%
  2& 10& 0&   02%
/
&&R    
  D

   !??,4@!BBU!@\52A!@ 2%
&&<D('  L  'D ' J ^
   !??,4<!4==>5%
0
 -0
 10
  0<D D
  &  0
& 10
 10
=
1 3

  2$$62%
0
& 10
& -0

Kod z powyszego wydruku jest podobny do tego z wydruku 10.6. Wywoanie asercji powoduje
wywietlenie jednokomrkowej tabeli. Jeeli nie zostanie zastosowana opcja !!"#$0#1&12,
oprcz informacji zdefiniowanych przez uytkownika wywietlony zostanie standardowy komunikat PHP. Na rysunku 10.5 przedstawiony jest wynik dziaania skryptu z wydruku 10.7.
Mechanizm obsugi bdw w PHP jest bardzo elastyczny. Uatwia to uruchamianie i pniejsze utrzymywanie aplikacji. W nastpnej czci rozdziau poczymy przedstawione dotychczas techniki, co w efekcie uatwi uruchamianie programw w caym cyklu produkcyjnym.

Rozdzia 10. / Uruchamianie aplikacji WWW

179

Rysunek 10.5. Efekt zastosowania funkcji zdefiniowanej dla assert()

Po omwieniu technik obsugi bdw moemy rozpocz tworzenie oglnego narzdzia do


obsugi bdw. Motywacj do napisania tego fragmentu bya nieobecno w PHP narzdzi, ktre
automatycznie czyyby rne typy danych o bdach. Oprcz tego, PHP 3 posiada moliwo
zdalnego uruchamiania, ktra nie zostaa przeniesiona do PHP 4. Mechanizm ten umoliwia
przesyanie danych za pomoc protokou TCP/IP do innego komputera. Opcja ta prawdopodobnie
niedugo si pojawi, ale na razie musz nam wystarczy podstawowe techniki obsugi bdw
przedstawione w tym rozdziale.
Przykad przedstawiony w tej czci jest niezwykle dugi, dlatego zostanie omwiony we fragmentach. Modu ten, okrelony mianem MyDebug, znajduje si w jednym pliku, MyDebug.php.
Jest on utworzony w taki sposb, e moe by bez przeszkd doczony do dowolnego skryptu
PHP. Po doczeniu pliku wykonywany jest kod zawarty na wydruku 10.8.
Wydruk 10.8. Doczanie moduu MyDebug
 2A]K,UC>@;=Z>2%
 "AK
 _A]K,UC>K?)B!]ZB,
#
&&T J   -J' [1 
L1
5
&&  -
 -
J   D('' 1 
3
 @ Z  ? "AK
Z  $$Z 
#
 2AK
 
1D E '[ 
"AK
Z  25%
"AK
 _$`A]K,UC>K?)B!]ZB,%
/
/
 "AK
 _A]K,UC>K?)B!]ZB,
#
"Z  *1 $  "AK
Z  522%
/
 "AK
 _A]K,UC>K?)B!])
#
"? *1 $  2
1O&&"AK
)25"AK
) %
/

180

PHP4. Kompendium programisty


&& '   
 -
  D
  
 '(1
( 3
  1 2A,*1 2%
   !??,4@!BBU!@\52A!  *1 2%
   !??,4<!4==>5%
   
1
 2AK
?
12%

Pierwsza linia skryptu z wydruku 10.8 powoduje przetworzenie cigu konfiguracji MyDebug,
ktry jest przechowywany w zmiennej rodowiska serwera. Na przykad, plik konfiguracyjny
Apache moe zawiera kod podobny do nastpujcego:
? ,A]K,UC>@;=Z>ZB,$& -&-1
3%
A!B$-1
Y  3 %)$-  3-O98%

Ta opcja konfiguracji jest specyficzna dla moduu MyDebug i nie jest dostpna jako standardowa
cz Apache czy PHP. Jak wida, mona ustawia zmienne rodowiska poprzez pliki konfiguracyjne serwera WWW. Zmienne te s dostpne w kodzie PHP. Zmienna 367"482%*1&2 definiuje
miejsca, w ktrych MyDebug bdzie zapisywa bdy. W tym przypadku modu bdzie zapisywa
bdy do pliku (/tmp/mydebug.log), wysya na adres e-mailowy (mydebug@intechra.net) oraz
do gniazda UDP (myserver.com:5400). Zwykle wybiera si jedn z metod zapisu bdw, ale
modu MyDebug umoliwia stosowanie wielu miejsc zapisu bdw naraz. Funkcja /%+
analizuje cig konfiguracji i ustawia odpowiednie zmienne globalne.
Po przeanalizowaniu cigu konfiguracyjnego sprawdzane s wszystkie pliki uywane do zapisywania danych o bdach. Jeeli modu MyDebug nie moe zapisa danych do pliku, zapisywanie do niego jest wyczane. Nastpnie otwierane s wszystkie potrzebne pliki i gniazda. Gniazdo
jest otwierane z wykorzystaniem UDP, co nie wymaga istnienia procesu nasuchu. Wasno ta
jest uyteczna szczeglnie wtedy, gdy zapisywanie jest aktywne na serwerze produkcyjnym,
ale nie zawsze dostpny jest proces nasuchu.
Nastpnie modu MyDebug rejestruje funkcje obsugi bdw i asercji. Ostatni operacj jest
zarejestrowanie funkcji wywoywanej po zakoczeniu dziaania programu, co umoliwia eleganckie zakoczenie dziaania moduu. Wydruk 10.9 przedstawia kod funkcji koczcej dziaanie
programu.
Wydruk 10.9. Kod funkcji koczcej dziaanie programu

 AK
?
1
#
 "Z  *1 5"? *1 5"AK
 %
 "AK
 _A]K,UC>K?)B!]ZB,
#
  "Z  *1 %
/
 "AK
 _A]K,UC>K?)B!])
#
  "? *1 %
/
/

Rozdzia 10. / Uruchamianie aplikacji WWW

181

Funkcja ta zamyka wymagane pliki oraz gniazdo sieciowe. Funkcj koczc moe zarejestrowa dowolny skrypt. PHP pozwala na rejestrowanie wielu funkcji koczcych, ktre s
wykonywane w czasie koczenia pracy skryptu. Cho ten fakt nie jest odnotowany w dokumentacji, funkcje koczce s wywoywane w tej samej kolejnoci, w jakiej zostay zarejestrowane.
Poniewa kolejno ta nie zostaa udokumentowana, Twoje skrypty nie powinny polega na
kolejnoci wykonywania funkcji koczcych. Jeeli zaley Ci na wykonywaniu ich w odpowiednim porzdku, musisz sam sprawdzi kolejno ich wywoywania. Mona przekaza dodatkowe
argumenty do funkcji  -)+  . PHP przekae je do funkcji kocowej.
Naley rwnie pamita, e w funkcji kocowej nie mona wysya adnych danych do przegldarki. Po skonfigurowaniu modu MyDebug obsuguje bdy za pomoc funkcji z wydruku 10.10.
Wydruk 10.10. Funkcje obsugi bdw
&&Z
 D
 
  ' '  1 

 A,*1 ",=5",? 5"Z  5"B  5"@ G 
#
AK
",? 5"Z  5"B  5A]K,UC>,44@!BBU!@\5
",=5"@ G %
/
&&Z
 D
 1
    

 A!  *1 "Z  =- 5"B  =
-5"!  
#
AK
2 "!  
125"Z  =- 5
"B  =
-5A]K,UC>!??,4@!BBU!@\%
/

Obie funkcje przekazuj parametry do gwnej funkcji obsugi bdw, ktra moe rwnie
zosta wywoana bezporednio z poziomu skryptu. Gwna funkcja obsugi bdw to przedstawiona na wydruku 10.11 funkcja 37.
Wydruk 10.11. Funkcja MyDebug()
&&Z
AK
  DF(
( D


 AK
"A  5"Z  5"B  5
"@ $A]K,UC>=,4=!B5", $5
",@ G $
#
 "AK
 %
 "K  $A]K,UC>K?)B!]ZB,%
"K  $A]K,UC>K?)B!])%
"K  ..
#
 "K  _"AK
 
#
" $Z-  "@ 5"K  %
"A  $Z- A"@ 5"A  5", 5"K  %
 "@ $$A]K,UC>,44@!BBU!@\
#
"@ G $Z- @ G ",@ G 5"K  %
/

182

PHP4. Kompendium programisty


 
#
"@ G $22%
/
AK
;

" 5"A  5"Z  5"B  5"@ G 5"K  %
/
/
/

Funkcja 37 formatuje rne parametry w zalenoci od typu medium zapisu (plik, e-mail
lub TCP/IP). Nastpnie wywouje funkcj 37*(wydruk 10.12), ktra wysya dane do
prawidowego miejsca. Funkcje formatujce z wydruku 10.11 zostan omwione w dalszej czci
rozdziau.
Wydruk 10.12. Funkcja MyDebugOutput()

 AK
;

" 5"A  5"Z  5"B  5
"@ G 5"K  
#
 "Z  *1 5"? *1 5"AK
,- %
 "K  
#
 A]K,UC>K?)B!]ZB,O
"A$2" O+"A  + ( D"Z    "B  32%
 "@ G X$22
#
"A3$2K  
O:#"@ G /:2%
/
 
#
"A3$2:2%
/
 
"Z  *1 5"A%
  %
 A]K,UC>K?)B!],A!BO
"A$2" O+"A  + ( D"Z    "B  32%
 "@ G X$22
#
"A3$2K  
O:#"@ G /:2%
/
 
#
"A3$2:2%
/
- "AK
,- 524 AK
25"A52Z-O-1
Y 3-::2%
  %
 A]K,UC>K?)B!])O
"A$2" a"A  a"Z  a"B  a"@ G bb2%
 
"? *1 5"A%
  %
/
/

Rozdzia 10. / Uruchamianie aplikacji WWW

183

Funkcja 37* wysya dane do waciwych miejsc. Jest ona zaskakujco prosta, jeeli uwzgldnimy efektywno kadej z tych opcji. Kada funkcja formatujca uyta w module
MyDebug posiada mechanizm zamiany wewntrznego numeru bdu na posta tekstow, zrozumia dla uytkownika. Na przykad funkcja ,$, przedstawiona na wydruku 10.13,
formatuje kod typu bdu.
Wydruk 10.13. Funkcja FormatType()
&cZ
 -
  -
 
1   5
1'  E1' L c&

 Z-  "@ 5"K  
#
 "K  
#
 A]K,UC>K?)B!]ZB,O
 A]K,UC>K?)B!],A!BO
 "@ 
#
 A]K,UC>=,4=!BO

2=,4=!B2%
  %
 A]K,UC>,44@!BBU!@\O

2,44;4@!BBU!@\2%
  %
 A]K,UC>!??,4@!BBU!@\O

2!??,4@!BBU!@\2%
  %
/
  %
 A]K,UC>K?)B!])O

"@ %
  %
/
/

Jeeli dane s wysyane poprzez TCP/IP, formatowanie nie jest przeprowadzane. Sam numer typu
jest wysyany do zdalnego komputera. W innym wypadku numer typu jest zamieniany na czytelny
cig. Inne funkcje konwertujce uyte w MyDebug dziaaj podobnie. Jedynie funkcja formatujca
kontekst bdu, ,%9(), jest wyranie odmienna. Funkcja ta jest wywoywana jedynie
wtedy, gdy bd zostanie obsuony przez funkcj zarejestrowan za pomoc -) .
Dane kontekstu udostpniane przez PHP zawieraj wszystkie zmienne bdce w zasigu w momencie wystpienia bdu. Dane te s przesyane w postaci tablicy asocjacyjnej z nazwami zmiennych i ich wartociami. Analiza tych danych wymaga wykorzystania funkcji rekurencyjnej, poniewa w kontekcie mog znajdowa si tablice. Funkcja zamieszczona na wydruku 10.14
analizuje dane kontekstu, przeksztacajc je w posta czyteln dla czowieka.
Wydruk 10.14. Analiza danych kontekstu
&cZ
 -
  -
 
1   5
1'  E1' L 3Z
 '


E 
 (Z- @ G 4c&

 Z- @ G ",@ G 5"K  
#

184

PHP4. Kompendium programisty


&&;1 '  L   
&& '-
( - ( 

"?  $22%
"K  -$2:2%
Z- @ G 4",@ G 5"?  5"K  -%

"?  %
/

 Z- @ G 4",@ G 5_"?  5"K  -
#
  ",@ G "d=- $0"dd

#
  "dd
$$

#
"?  3$2"d=- $2%
Z- @ G 4"dd
5"?  5252%
"?  3$2"K  -2%
/
 
#
"?  3$2"d=- $#"dd
/#"K  -/2%
/
/
/

Funkcja ,%9 ustawia kilka parametrw i wywouje funkcj rekurencyjn ,:


%9#. Funkcja rekurencyjna przeglda tablice zmiennych kontekstu i zapisuje kad par
nazwa-warto do wynikowego cigu. Jeeli zostanie napotkana tablica, wywoywana jest rekurencyjnie funkcja ,%9#.
W zalenoci od miejsca wystpienia bdu, kontekst lokalny moe zawiera sporo danych. Jeeli
bd wystpi w gwnej czci skryptu, w zasigu znajd si wszystkie zmienne globalne, w tym
zmienne rodowiska i zmienne 2"$ i /*!$. Wszystkie te zmienne znajd si w danych kontekstu.
Jeeli bd wystpi w funkcji, kontekst bdzie zawiera jedynie zmienne lokalne funkcji.
Do skryptu testujcego (zobacz wydruk 10.15) doczylimy modu MyDebug oraz ustawilimy
zmienn konfiguracji na zapisywanie do pliku tekstowego. Po jego uruchomieniu na kocu pliku
ladu znalaz si cig bdu. Poniszy tekst nie jest caym plikiem, jedynie wynikiem wystpienia
ostatniego bdu w skrypcie:
,44;4@!BBU!@\O+ DE1
)*)O,C?,4,44;4N  
-+
 ( DO:  :8N1 
1 : ::  -1
3 -  M3K  
O
$
$6
!$$ 5$
-- 56$

-57$  5

Wydruk 10.15. Skrypt testowy



 
1  23&-1
32%
0
 -0
 10
  0  -1
D
AK
&  0

Rozdzia 10. / Uruchamianie aplikacji WWW

185

& 10
 10
=
1 3 0 0


 
-"5" 
#
"!$2 252
-- 252

-252  2%
    2  
-25,C?,4,44;4%
/
  2$$62%
    2UD(1  25,C?,4,44;4%
"!$2  2$021252
 2$02A1 25
2 2$024 G
252
 2$02C?2%
  2 0 0!H  I$23"!H  I32 02%

-56%
0
& 10
& -0

Jedynym zadaniem powyszego skryptu testowego jest generowanie bdw. Wynik dziaania
funkcji , nie jest nigdzie uywany. Jest ona umieszczona w tym skrypcie po to, aby zilustrowa, w jaki sposb wywoanie funkcji wpywa na dane kontekstu przekazywane przez PHP.
Linie z opisem bdu zamieszczone bezporednio przed wydrukiem 10.15 zostay wygenerowane
przy wywoaniu funkcji ,.
Elastyczno tego moduu dobrze obrazuje aplikacja Windows, ktra realizuje proces nasuchu
portu TCP/IP i wywietla przychodzce dane. Jest to prosta aplikacja Delphi, ktra odczytuje
pakiety UDP przychodzce do portu 5400. Po odczytaniu danych aplikacja formatuje linie i wywietla je. Na rysunku 10.6 przedstawiona zostaa ta aplikacja po odebraniu kilku komunikatw
wygenerowanych przez PHP.

Rysunek 10.6. Aplikacja nasuchu dla MyDebug


Jednym z powodw popularnoci jzyka PHP jest jego niezwyka rozszerzalno. Modu MyDebug
jest napisany cakowicie w PHP i poniewa nie jest kompletny, moe by rozbudowywany na
wiele sposobw (rda moduu MyDebug s dostpne wraz ze wszystkimi przykadami kodu
z tej ksiki). Na przykad, wykorzystanie poczty elektronicznej do raportowania bdw jest
nieefektywne, ale mona wykorzysta poczt elektroniczn do raportowania wycznie krytycznych bdw i ostrzee, co pozwoli na wykorzystanie tej opcji w rodowisku produkcyjnym. Niezmiernie istotny jest fakt, e wszystkie te opcje s zrealizowane cakowicie w PHP. Nie wszystkie
narzdzia programowania dla WWW s tak elastyczne.

186

PHP4. Kompendium programisty

W tym rozdziale przedstawione zostay techniki programowania defensywnego, ktrych zastosowanie uatwia pniejsze uruchamianie aplikacji. PHP nie zosta jeszcze wyposaony w program
do uruchamiania skryptw podobny do tych, ktre s dostpne w wielu nowoczesnych jzykach
programowania. Jednak odrobina pomysowoci i wykorzystanie rozszerzalnoci PHP pozwala
stworzy wietne narzdzia suce do uruchamiania aplikacji. W rozdziale opisany zosta jeden
z moduw, ktry zapewnia elastyczn obsug bdw i moe by dowolnie modyfikowany i rozbudowywany.

Steve McConnell, Code Complete, Microsoft Press, Seattle 1993.

You might also like