Professional Documents
Culture Documents
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
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
PHP. Zaawansowane
programowanie.
Vademecum profesjonalisty
Autor: George Schlossnagle
Tumaczenie: Wodzimierz Gajda, Pawe Gonera,
Radosaw Meryk, Jacek Smycz
ISBN: 83-7361-589-X
Tytu oryginau: Advanced PHP Programming
Format: B5, stron: 624
PHP to obecnie jeden z najpopularniejszych jzykw programowania sucych do
tworzenia aplikacji internetowych. Od pocztku jego istnienia wykorzystywano go do
tworzenia dynamicznych witryn WWW. Dynamiczny rozwj sprawi, e moliwoci jego
zastosowania znacznie si poszerzyy. Obecnie uywa si PHP do tworzenia aplikacji,
ktre jeszcze niedawno wydaway si niemoliwe do napisania w tym jzyku.
Pocztkowo wykorzystywany przez grono entuzjastw, z czasem sta si stabiln
i dobrze udokumentowan platform programistyczn, liczc si na rynku.
Ksika PHP. Zaawansowane programowanie. Vademecum profesjonalisty to pozycja
dla tych, ktrzy chc zosta ekspertami w dziedzinie tworzenia aplikacji w PHP.
Opisuje najbardziej zaawansowane mechanizmy jzyka, pozwalajce na zastosowanie
go w zoonych aplikacjach. Przedstawia techniki programowania obiektowego,
testowania jednostek leksykalnych, zagadnienia bezpieczestwa, techniki buforowania
oraz sposoby tworzenia skalowalnych aplikacji internetowych. W ksice omwiono
rwnie dostrajanie wydajnoci oraz tworzenie rozszerze PHP. Wszystkie, nawet
najbardziej skomplikowane kwestie zostay opisane w przejrzysty sposb i zilustrowane
kompletnymi przykadami zastosowania w prawdziwych aplikacjach.
Styl kodowania
Programowanie obiektowe i wzorce projektowe
Obsuga bdw
Korzystanie z szablonw Smarty
Testowanie moduw
Zarzdzanie wersjami system CVS
Techniki buforowania
Dostp do baz danych
Autoryzacja uytkownikw
Tworzenie rodowiska rozproszonego
Wykorzystanie usug sieciowych
Wydajno aplikacji
Tworzenie rozszerze PHP
5RKUVTGEK
Wybr wygodnego stylu programowania ............................................................................ 26
Formatowanie kodu i ukad ........................................................................................... 26
Wcicia .......................................................................................................................... 26
Dugo wiersza............................................................................................................. 28
Zastosowanie odstpw ................................................................................................. 29
Zalecenia na temat SQL................................................................................................. 29
Instrukcje sterujce ........................................................................................................ 30
Nazewnictwo symboli.......................................................................................................... 35
Zmienne faktycznie globalne oraz stae......................................................................... 36
Zmienne dugowieczne .................................................................................................. 38
Zmienne tymczasowe .................................................................................................... 38
Nazwy wieloczonowe ................................................................................................... 39
Nazwy funkcji................................................................................................................ 39
Nazwy klas .................................................................................................................... 40
Nazwy metod................................................................................................................. 40
Spjno nazw ............................................................................................................... 40
Dopasowanie nazw zmiennych do nazw schematu........................................................ 40
Unikanie mylcego kodu ..................................................................................................... 41
Unikanie korzystania z otwartych znacznikw .............................................................. 42
Unikanie korzystania z funkcji echo do tworzenia kodu HTML ................................... 42
Rozsdne korzystanie z nawiasw ................................................................................. 43
Dokumentacja ...................................................................................................................... 43
Dokumentacja wewntrz kodu....................................................................................... 44
Dokumentacja API......................................................................................................... 45
Dalsze lektury ...................................................................................................................... 49
Wstp do programowania obiektowego ............................................................................... 52
Dziedziczenie................................................................................................................. 53
Hermetyzacja ................................................................................................................. 54
Atrybuty i metody statyczne (klasowe).......................................................................... 55
Metody specjalne ........................................................................................................... 56
" "%
&
Obsuga bdw ................................................................................................................... 87
Wywietlanie bdw..................................................................................................... 88
Rejestrowanie bdw.................................................................................................... 89
Ignorowanie bdw ...................................................................................................... 90
Reagowanie na bdy ..................................................................................................... 90
Obsuga bdw zewntrznych............................................................................................. 92
Wyjtki ................................................................................................................................ 94
Wykorzystanie hierarchii wyjtkw .............................................................................. 97
Przykad zastosowania wyjtkw .................................................................................. 99
Wyjtki kaskadowe...................................................................................................... 104
Obsuga bdu dziaania konstruktora.......................................................................... 107
Instalowanie wysokopoziomowej procedury obsugi wyjtkw.................................. 108
Kontrola poprawnoci danych ..................................................................................... 110
Kiedy korzysta z wyjtkw? ............................................................................................ 114
Dalsze lektury .................................................................................................................... 114
'
Smarty................................................................................................................................ 116
Instalowanie Smarty .................................................................................................... 116
Pierwszy szablon Smarty ............................................................................................. 118
Pod mask skompilowanych szablonw...................................................................... 118
Struktury sterujce Smarty........................................................................................... 119
Funkcje Smarty i wicej............................................................................................... 122
Buforowanie w Smarty ................................................................................................ 124
Zaawansowane funkcje Smarty ................................................................................... 126
Tworzenie wasnego systemu szablonw........................................................................... 127
Dalsze lektury .................................................................................................................... 128
Wprowadzenie do interfejsu wiersza polece PHP (CLI).................................................. 133
Obsuga wejcia-wyjcia.................................................................................................... 133
Analizowanie argumentw wiersza polece ...................................................................... 136
Tworzenie procesw potomnych i zarzdzanie nimi.......................................................... 138
Zamykanie wspdzielonych zasobw......................................................................... 139
Wspdzielenie zmiennych .......................................................................................... 139
Porzdkowanie po procesach potomnych .................................................................... 139
Sygnay ........................................................................................................................ 141
Spis treci
,
- !%
.
Wprowadzenie do testowania moduw............................................................................. 160
Tworzenie testw dla automatycznego testowania moduw ...................................... 161
Pierwszy test moduu................................................................................................... 161
Dodawanie wielu testw .............................................................................................. 162
Tworzenie wewntrznych i zewntrznych testw moduw .............................................. 163
Testy wewntrz moduu............................................................................................... 164
Testy na zewntrz moduu ........................................................................................... 165
Jednoczesne uruchamianie wielu testw...................................................................... 166
Dodatkowe funkcje w PHPUnit ......................................................................................... 168
Tworzenie opisowych komunikatw bdw............................................................... 168
Dodawanie wikszej liczby warunkw testowych ....................................................... 169
Zastosowanie metod setUp() oraz tearDown()............................................................. 171
Dodawanie nasuchw ................................................................................................. 171
Wykorzystanie interfejsu graficznego.......................................................................... 173
Projektowanie sterowane testami ....................................................................................... 173
Kalkulator oceny Flescha............................................................................................. 174
Testowanie klasy Word ............................................................................................... 175
Raport bdw.............................................................................................................. 182
Testowanie moduw w rodowisku WWW...................................................................... 184
Dalsze lektury .................................................................................................................... 186
&
Kontrola wersji................................................................................................................... 188
Podstawy CVS............................................................................................................. 189
Modyfikacja plikw..................................................................................................... 192
Badanie rnic midzy plikami.................................................................................... 193
Mechanizmy usprawniajce prac wielu programistw na tym samym projekcie....... 195
Znaczniki symboliczne ................................................................................................ 197
Gazie ......................................................................................................................... 198
Zarzdzanie rodowiskiem produkcyjnym oraz programistycznym ............................ 199
Zarzdzanie pakietami ....................................................................................................... 203
Tworzenie pakietw i przenoszenie kodu .................................................................... 204
Tworzenie pakietw plikw binarnych........................................................................ 207
Tworzenie pakietu Apache .......................................................................................... 208
Tworzenie pakietu PHP ............................................................................................... 209
Dalsze lektury .................................................................................................................... 209
&
Projektowanie zapewniajce moliwoci rozszerzania i atwo modyfikacji ................... 212
Umieszczenie logiki w funkcjach ................................................................................ 212
Tworzenie prostych klas i funkcji................................................................................ 214
Przestrzenie nazw ........................................................................................................ 214
Zmniejszanie sprze................................................................................................. 216
Kodowanie defensywne ..................................................................................................... 217
Wprowadzenie standardowych konwencji................................................................... 218
Uycie technik oczyszczania danych ........................................................................... 218
Dalsze lektury .................................................................................................................... 220
.
Techniki dostrajania na poziomie jzyka ........................................................................... 223
Bufory kompilatora...................................................................................................... 223
Optymalizatory ............................................................................................................ 226
Akceleratory HTTP ..................................................................................................... 227
Odwrotne serwery proxy.............................................................................................. 228
Dostrajanie systemu operacyjnego............................................................................... 233
Bufory proxy................................................................................................................ 234
Aplikacje PHP przystosowane do wykorzystania buforowania ......................................... 234
Kompresja.......................................................................................................................... 239
Dalsze lektury .................................................................................................................... 240
Dokumenty RFC.......................................................................................................... 240
Bufory kompilatora...................................................................................................... 240
Bufory proxy................................................................................................................ 240
Kompresja.................................................................................................................... 241
2
34 ! %#5
'
Waciwoci buforowania .................................................................................................. 243
Identyfikacja komponentw danych, ktre nadaj si do buforowania.............................. 245
Wybr waciwej strategii: klasy wasne czy biblioteczne?............................................... 245
Buforowanie wynikw....................................................................................................... 246
Buforowanie w pamici ..................................................................................................... 248
Bufor w postaci pojedynczego pliku............................................................................ 248
Zarzdzanie rozmiarem bufora .................................................................................... 249
Wspbieny dostp i spjno buforw...................................................................... 250
Buforowanie z wykorzystaniem plikw DBM................................................................... 256
Wspbieny dostp i spjno buforw...................................................................... 257
Weryfikacja bufora i zarzdzanie ................................................................................ 257
Buforowanie we wspdzielonej pamici........................................................................... 262
Buforowanie z wykorzystaniem plikw cookie ................................................................. 263
Zarzdzanie rozmiarem bufora .................................................................................... 267
Wspbieny dostp i spjno buforw...................................................................... 268
Integracja buforowania w kodzie aplikacji......................................................................... 268
Buforowanie stron gwnych ....................................................................................... 270
Wykorzystanie moduu mod_rewrite serwera Apache
w celu wykonania inteligentnego buforowania......................................................... 276
Buforowanie czci stron............................................................................................. 280
Implementacja bufora zapyta ..................................................................................... 282
Dalsze lektury .................................................................................................................... 284
"# 6
&
Wstp z przykadem cigi Fibonacciego....................................................................... 285
Buforowanie danych do wielokrotnego uytku wewntrz da ....................................... 291
Buforowanie wielokrotnie wykorzystywanych danych pomidzy daniami.................... 293
Wielokrotne wykorzystywanie oblicze w PHP ................................................................ 297
Wyraenia PCRE ......................................................................................................... 297
Liczniki rozmiarw tablic ............................................................................................ 297
Dalsze lektury .................................................................................................................... 298
Spis treci
!!
%#"!#5
2
Dziaanie baz danych i zapyta.......................................................................................... 302
Analiza zapyta przy uyciu EXPLAIN ...................................................................... 305
Wyznaczanie zapyta wymagajcych profilowania..................................................... 306
Wzorce dostpu do bazy danych........................................................................................ 308
Zapytania ad hoc.......................................................................................................... 309
Metoda aktywnego rekordu ......................................................................................... 309
Metoda odwzorowania................................................................................................. 312
Metoda zintegrowanego odwzorowania ...................................................................... 317
Dostrajanie dostpu do bazy danych .................................................................................. 318
Ograniczanie zbioru wynikw ..................................................................................... 318
Opniona inicjalizacja................................................................................................ 320
Dalsze lektury .................................................................................................................... 323
#$7%" # 6 $
Proste schematy uwierzytelniania ...................................................................................... 326
Proste uwierzytelnianie HTTP..................................................................................... 327
Przesyanie danych identyfikacyjnych w zapytaniu..................................................... 327
Pliki cookie .................................................................................................................. 328
Rejestrowanie uytkownikw ............................................................................................ 329
Ochrona hase .............................................................................................................. 329
Zabezpieczenie hase przed atakami socjotechnicznymi.............................................. 332
Utrzymanie uwierzytelniania: sprawdzenie, czy w dalszym cigu komunikujemy si
z t sam osob ............................................................................................................... 333
Sprawdzenie, czy warto $_SERVER ['REMOTE_IP'] pozostaje taka sama............. 333
Sprawdzenie, czy warto $_SERVER ['USER_AGENT'] pozostaje taka sama......... 334
Wykorzystanie niezaszyfrowanych plikw cookie ...................................................... 334
Zalecane rozwizania................................................................................................... 334
Przykadowa implementacja uwierzytelniania............................................................. 336
Pojedyncze logowanie........................................................................................................ 341
Implementacja techniki pojedynczego logowania ....................................................... 343
Dalsze lektury .................................................................................................................... 348
'
" $
'.
Przechowywanie danych sesyjnych po stronie klienta....................................................... 350
Implementacja sesji przy uyciu plikw cookie........................................................... 351
Nieco lepsza puapka na myszy ................................................................................... 353
Przechowywanie danych sesyjnych po stronie serwera ..................................................... 354
ledzenie identyfikatora sesji....................................................................................... 356
Krtkie wprowadzenie do sesji w PHP........................................................................ 358
Niestandardowe funkcje obsugi sesji.......................................................................... 360
Usuwanie niepotrzebnych danych ............................................................................... 365
Przechowywanie stanu sesji po stronie serwera oraz po stronie klienta....................... 366
- 1
,.
Czym jest klaster? .............................................................................................................. 369
Projektowanie klastrw podstawy................................................................................. 372
Planowanie niepowodze ............................................................................................ 373
Zgodna wsppraca...................................................................................................... 373
Dystrybucja zawartoci w klastrze............................................................................... 375
Skalowanie poziome .................................................................................................... 376
Klastry wyspecjalizowane ........................................................................................... 377
10
,
8*%# ! !
.
XML-RPC.......................................................................................................................... 394
Tworzenie serwera: implementacja interfejsu MetaWeblog ........................................ 396
Automatyczne wykrywanie usug XML-RPC ............................................................. 400
SOAP ................................................................................................................................. 402
WSDL.......................................................................................................................... 404
Zamiana system.load w usug SOAP ......................................................................... 406
Usugi WWW Amazon i typy zoone......................................................................... 409
Generowanie kodu proxy............................................................................................. 411
Porwnanie SOAP i XML-RPC......................................................................................... 411
Dalsze lektury .................................................................................................................... 412
SOAP........................................................................................................................... 412
XML-RPC ................................................................................................................... 412
Dzienniki WWW ......................................................................................................... 413
Dostpne publicznie usugi WWW.............................................................................. 413
'
Pasywna identyfikacja wskich garde............................................................................... 418
Generatory obcienia........................................................................................................ 420
ab ................................................................................................................................. 420
httperf .......................................................................................................................... 421
Daiquiri........................................................................................................................ 424
Dalsze lektury .................................................................................................................... 424
&
4
'
Co jest potrzebne w programie profilujcym PHP? ........................................................... 426
Programy profilujce.......................................................................................................... 426
Instalacja i zastosowanie APD ........................................................................................... 427
Przykad ledzenia ............................................................................................................. 429
Profilowanie wikszej aplikacji ......................................................................................... 431
Identyfikacja oglnego braku efektywnoci....................................................................... 436
Usuwanie zbytecznej funkcjonalnoci ............................................................................... 438
Dalsze lektury .................................................................................................................... 443
.
# $1#
* "%4#$
''
Podstawy testowania wydajnoci ....................................................................................... 446
Tworzenie szablonu testw wydajnoci ............................................................................. 447
Zestaw testw wydajnoci PEAR ................................................................................ 448
Tworzenie funkcji testujcych ..................................................................................... 450
Dodawanie randomizacji danych do wszystkich iteracji.............................................. 451
Usuwanie kosztw funkcji testujcych ........................................................................ 452
Dodawanie wasnych informacji czasowych ............................................................... 453
Tworzenie testw bezporednich ................................................................................. 457
Spis treci
11
"
'(
%)*
2
9 !/ )
',.
Jak dziaa maszyna Zend: kody i tablice operacji .............................................................. 470
Zmienne ............................................................................................................................. 475
Funkcje .............................................................................................................................. 479
Klasy .................................................................................................................................. 480
Mechanizmy obsugi obiektw .................................................................................... 482
Tworzenie obiektw .................................................................................................... 483
Inne wane struktury.................................................................................................... 483
Cykl yciowy dania PHP................................................................................................ 485
Warstwa SAPI ............................................................................................................. 486
Jdro PHP .................................................................................................................... 488
Interfejs rozszerze PHP.............................................................................................. 489
Interfejs Zend Extension.............................................................................................. 490
Jak pasuj do siebie wszystkie czci?......................................................................... 492
Dalsze lektury .................................................................................................................... 492
)*#1+(
'.
Podstawy rozszerzania ....................................................................................................... 496
Tworzenie zrbu rozszerzenia...................................................................................... 496
Budowa i wczanie rozszerzenia ................................................................................ 499
Wykorzystanie funkcji................................................................................................. 500
Zarzdzanie typami i pamici .................................................................................... 502
Analiza cigw ............................................................................................................ 505
Manipulacja typami ..................................................................................................... 506
Testowanie typw, konwersje i mechanizmy dostpu ................................................. 511
Korzystanie z zasobw ................................................................................................ 514
Zwracanie bdw........................................................................................................ 519
Wykorzystanie punktw zaczepienia moduw ........................................................... 519
Przykad: osona klienta Spread ......................................................................................... 527
MINIT.......................................................................................................................... 529
MSHUTDOWN........................................................................................................... 529
Funkcje moduu ........................................................................................................... 529
Wykorzystanie moduu Spread .................................................................................... 535
Dalsze lektury .................................................................................................................... 536
)*#1+((
Implementacja klas ............................................................................................................ 537
Tworzenie nowej klasy ................................................................................................ 538
Definiowanie waciwoci klasy .................................................................................. 539
Dziedziczenie............................................................................................................... 541
Definiowanie metod klasy ........................................................................................... 542
Definiowanie konstruktorw klas ................................................................................ 544
Zgaszanie wyjtkw ................................................................................................... 545
Wykorzystanie obiektw zdefiniowanych przez uytkownika
oraz prywatnych zmiennych ..................................................................................... 546
Wykorzystanie metod factory ...................................................................................... 549
Tworzenie i implementacja interfejsw ....................................................................... 550
11
12
- !%
( !/
,
Interfejsy SAPI .................................................................................................................. 567
CGI SAPI..................................................................................................................... 568
Interfejs Embed SAPI .................................................................................................. 577
Filtry wejciowe interfejsu SAPI ................................................................................. 578
Modyfikacja i introspekcja mechanizmu maszyny Zend ................................................... 583
Ostrzeenia jako wyjtki.............................................................................................. 584
Program przetwarzajcy kod operacyjny ..................................................................... 586
APD ............................................................................................................................. 589
APC ............................................................................................................................. 590
Wykorzystanie wywoa rozszerzenia Zend................................................................ 590
Praca domowa.................................................................................................................... 593
+
&!&
.
Rozdzia 9.
W kadym przypadku dostrajania nie mona utraci obrazu caoci systemu. O ile celem
czstkowym bywa przyspieszenie dziaania okrelonej funkcji lub strony, gwnym celem
zawsze jest przyspieszenie dziaania aplikacji jako caoci. Czasami wykonanie zmian
w jednym elemencie aplikacji przyczynia si do poprawy jej oglnej wydajnoci.
Najwiksze znaczenie dla uzyskania wysokiej wydajnoci ma uwanie wykonany i solidny projekt oraz zastosowanie waciwych technik programistycznych. Nic tego nie zastpi.
Istniej jednak techniki dostrajania na zewntrz kodu PHP, ktre pozwalaj na popraw
wydajnoci aplikacji. Zastosowanie technik na poziomie serwera lub jzyka nie zneutralizuje nieudolnego lub nieefektywnego kodowania, ale zapewni, e aplikacja bdzie dziaaa
najlepiej, jak to moliwe.
W niniejszym rozdziale zamieszczono przegld kilku technik i produktw, ktre pozwalaj na popraw wydajnoci aplikacji. Poniewa opisane techniki dotycz wewntrznych
mechanizmw PHP albo te s to produkty zewntrzne, w niniejszym rozdziale nie ma
zbyt wiele kodu. Nie powinno to jednak zniechci czytelnika do lektury czasami najwiksze korzyci uzyskuje si dziki odpowiedniej kombinacji stosowanych technik.
Techniki dostrajania na poziomie jzyka to modyfikacje poprawiajce ogln wydajno
aplikacji, ktre mona wykona w konfiguracji PHP. Jzyk PHP jest wyposaony w wygodny interfejs programowy aplikacji (opisany szczegowo w rozdziale 21. oraz w rozdziale 23.) pozwalajcy na pisanie rozszerze majcych bezporedni wpyw na dziaanie mechanizmw jzyka i sposb wykonywania kodu. Zastosowanie tego interfejsu
umoliwia przyspieszenie procesu kompilacji i wykonywania skryptw PHP.
Gdyby mona byo wybra tylko jedn modyfikacj konfiguracji serwera, ktra miaaby
przyczyni si do poprawienia wydajnoci aplikacji PHP, zainstalowanie bufora kompilatora byoby najwaciwszym wyborem. Zainstalowanie tego mechanizmu przynosi
224
Cz II Buforowanie
olbrzymie korzyci. Dodatkowo, w odrnieniu od innych technik, ktrych efekty stosowania sabn w miar zwikszania si rozmiarw aplikacji, w przypadku bufora kompilatora dla bardziej rozbudowanych i zoonych aplikacji efekty okazuj si lepsze.
Zatem, czym jest bufor kompilatora i jak to si dzieje, e jego zastosowanie umoliwia
uzyskanie tak znacznego wzrostu wydajnoci? Aby odpowiedzie na te pytania, sprbujmy przyjrze si sposobowi wykonywania skryptw PHP przez maszyn Zend. Kiedy
przegldarka uruchamia skrypt PHP, wykonuje proces skadajcy si z dwch etapw:
Serwer PHP odczytuje plik, analizuje zapisany w nim kod i generuje kod poredni
przeznaczony do wykonywania na wirtualnej maszynie Zend. Kod poredni to termin
stosowany w informatyce, opisujcy wewntrzn reprezentacj kodu rdowego
skryptu po jego skompilowaniu.
jest gwny skrypt, ale take za kadym razem, kiedy skrypt jest wywoywany
za pomoc polece
, lub
.
Jak atwo wywnioskowa z powyszego opisu, umieszczenie w buforze kodu poredniego uzyskanego w wyniku wykonania etapu 1. i wykorzystanie go do kadego wywoania skryptu moe przynie due korzyci. Wanie na tym polega dziaanie bufora
kompilatora.
Na rysunku 9.1 zilustrowano proces wykonywania skryptu bez wykorzystania bufora kompilatora, natomiast na rysunku 9.2 z wykorzystaniem bufora. Warto zwrci uwag,
e tylko pierwsze uruchomienie skryptu lub odwoanie si do niego w instrukcji
powoduje konieczno tworzenia kodu poredniego i jego umieszczania w buforze. W kadym kolejnym przypadku etap kompilacji skryptu jest pomijany cakowicie.
Dla jzyka PHP istniej trzy najbardziej popularne bufory kompilatorw:
Zend Accelerator komercyjny bufor kompilatora bez dostpu do kodu
Cowgilla i mnie.
225
Wykonywanie
skryptu w PHP
W rozdziale 23., w ktrym opisano rozszerzenia PHP i mechanizm maszyny Zend, szczegowo omwiono take dziaanie bufora APC.
Bufor kompilatora APC jest dostpny poprzez bibliotek rozszerze PECL (skrt od ang.
PEAR Extension Code Library). Bibliotek t instaluje si za pomoc nastpujcego
polecenia:
Oprcz tego nie trzeba wykonywa adnych czynnoci konfiguracyjnych. Przy nastpnym
uruchomieniu serwera PHP bufor APC bdzie aktywny (bdzie buforowa skrypty we
wspdzielonej pamici).
Jak pamitamy, bufor kompilatora umoliwia pominicie fazy analizy kodu podczas wykonywania skryptu, a zatem najlepsze efekty jego stosowania mona uzyska dla skryptw zawierajcych duo kodu. Dla sprawdzenia rnicy porwnaem przykadow stron
wykorzystujc szablony, rozprowadzan z systemem Smarty. W przypadku standardowej
konfiguracji PHP udao mi si uzyska 26 da na sekund. Po zaadowaniu bufora APC
uzyskaem 42 dania na sekund 61 % poprawy wydajnoci to znaczcy zysk, zwaszcza, e efekt ten uzyskaem bez modyfikacji kodu.
226
Cz II Buforowanie
Wykonywanie kodu
z zastosowaniem
bufora kompilatora
Dziaanie optymalizatorw kodu polega na przeksztaceniu skompilowanego poredniego kodu skryptu i przeprowadzenie dla niego optymalizacji. W wikszoci jzykw programowania istniej optymalizatory wykonujce nastpujce dziaania:
Eliminacja martwego kodu usuwanie instrukcji, do ktrych nie ma dostpu,
na przykad .
227
w taki sposb, aby obliczenia byy wykonywane raz w fazie kompilacji. Na przykad
operacj:
Wydajno aplikacji jest zagadnieniem zoonym. Skada si na ni wiele czynnikw, midzy innymi:
wydajno bazy danych;
wydajno procesora dla aplikacji, w ktrej s wykonywane intensywne
obliczenia;
228
Cz II Buforowanie
wydajno dysku z uwagi na wykonywanie wielu operacji wejcia-wyjcia
(we-wy);
wydajno sieci dla aplikacji, w ktrych s przesyane due iloci danych
sieciowych.
W kilku nastpnych rozdziaach zostan opisane sposoby dostrajania aplikacji majce na
celu zminimalizowanie efektw tych wskich garde. Zanim jednak przejdziemy do
omawiania tych tematw, zajmijmy si innym wskim gardem, ktrego si czsto nie
dostrzega, a mianowicie opnieniami sieci. Kiedy uytkownik maszyny klienckiej da
informacji z witryny, pakiety danych musz by fizycznie przesane w sieci internet od
klienta do serwera i z powrotem. Co wicej w systemie operacyjnym s ograniczenia
iloci danych, jakie mona jednorazowo przesya przez gniazdo TCP. W przypadku przekroczenia tego limitu aplikacja blokuje transfer danych lub po prostu czeka do chwili potwierdzenia otrzymania danych przez system zdalny. Tak wic oprcz czasu powiconego na przetwarzanie dania serwer WWW, ktry je obsuguje, musi jeszcze oczekiwa
przez czas opnienia spowodowany wolnym poczeniem sieciowym.
Na rysunku 9.3 zilustrowano wykonywane w sieci dziaania zwizane z obsug pojedynczego dania wraz z przykadowym czasem ich wykonywania. Podczas przesyania
pakietw pomidzy serwerem a klientem w sieci aplikacja PHP jest zupenie bezczynna.
Zwrmy uwag, e w sytuacji pokazanej na rysunku 9.3 serwer PHP jest bezczynny
przez 200 ms i oczekuje na zakoczenie transmisji w sieci pomimo tego, e jest gotowy
do obsugi dania. W wielu aplikacjach czas opnie sieciowych jest wikszy od czasu
wykonywania skryptw.
Cho wydaje si, e bezczynno serwera nie jest wskim gardem, okazuje si, e rwnie
moe nim by. Problem polega na tym, e nawet bezczynny serwer WWW zuywa zasoby: pami, trwae poczenia z baz danych oraz miejsce w tablicy procesw. Jeli uda
si wyeliminowa opnienia w sieci, mona zmniejszy ilo czasu, w ktrym procesy
serwera PHP wykonuj nieistotne dziaania, i w ten sposb poprawi wydajno.
Blokowanie pocze sieciowych
Okrelenie, e aplikacja musi zablokowa poczenie sieciowe, nie jest do koca precyzyjne. Gniazda sieciowe mona tworzy w taki sposb, e zamiast blokowania sterowanie wraca do aplikacji.
Metoda ta jest stosowana w wielu wysoko wydajnych serwerach WWW, takich, jak thttpd i Tux.
Oprcz nich nie s mi znane interfejsy API serwera PHP (SAPI aplikacje z wbudowanym serwerem PHP), ktre umoliwiaj jednemu serwerowi PHP jednoczesn obsug wielu da. Tak wic
pomimo tego, e poczenie sieciowe nie blokuje aplikacji, nawet szybkie serwery wymagaj dedykowanego procesu PHP przez cay czas trwania obsugi dania klienta.
Niestety, wyeliminowanie opnie sieciowych w internecie ley poza zakresem naszych
moliwoci (a szkoda). Mona jednak zainstalowa dodatkowy serwer pomidzy uytkownikiem a aplikacj PHP, ktry bdzie odbiera dania od klientw, przekazywa kompletne dania do aplikacji PHP, oczekiwa na odpowied, a nastpnie przesya j do
uytkownika zdalnego. Taki wtrcony serwer nazywa si odwrotnym serwerem proxy
(ang. reverse proxy), a czasami akceleratorem HTTP.
229
Czasy transmisji sieciowej dla typowego dania
230
Cz II Buforowanie
Typowa
konfiguracja
odwrotnego
serwera proxy
231
W tym celu wykorzystamy znan sztuczk umoliwiajc wykorzystanie tej samej konfiguracji serwera Apache na wielu komputerach: w pliku konfiguracyjnym serwera Apache
zdefiniujemy hosta o nazwie
. Nastpnie odwzorujemy go na publiczny (zewntrzny) interfejs ethernetowy w pliku /etc/hosts. Podobnie zdefiniujemy hosta localhost
w pliku konfiguracyjnym serwera, ktry bdzie odwzorowywany na adres ptli zwrotnej 127.0.0.1.
Umieszczenie caej konfiguracji serwera Apache w niniejszym rozdziale zajoby zbyt
duo miejsca. Zamiast tego w celu pokazania najwaniejszych ustawie zaprezentujemy
zaledwie niewielki fragment pliku httpd.conf.
Konfiguracja odwrotnego serwera proxy z wykorzystaniem moduu mod_proxy wymaga
wprowadzenia nastpujcych ustawie:
!"
#
$
%
&'
(
)
*
+,$-..
,("
/
#0
-
/
/ &
'&
/
/ #$ &
'&
/
1-2..345657
8!
'9
-!:,;
!."
8!
9
wasnej zawartoci.
W konfiguracji okrelono jawne dowizanie do zewntrznego adresu ethernetowego
serwera (
). Powizanie naley okreli jawnie, poniewa w przypadku
232
Cz II Buforowanie
Jeli serwer PHP wyle do skryptu foo.php danie przekierowania zawierajce
'&
.&
W odrnieniu od nakadw pracy konfiguracyjnej w obrbie serwera Apache proxy, konfiguracja Apache PHP jest bardzo podobna do standardowej. Jedyn zmian jest dodanie
w pliku httpd.conf nastpujcego wiersza:
%
&
'
233
Zapis ten powoduje wyczne dowizanie egzemplarza serwera Apache PHP do adresu
ptli zwrotnej. Po wprowadzeniu tego ustawienia dostp do serwera WWW wymaga komunikacji za porednictwem serwera proxy.
Pomiar efektw wykonanych modyfikacji jest bardzo trudny. Poniewa zmniejszaj one
ilo potrzebnych operacji gwnie w przypadku obsugi klientw poprzez cza wprowadzajce due opnienia, jest bardzo trudno zmierzy ich efekty w sieciach lokalnych
i bardzo szybkich. W rzeczywistej konfiguracji zauwayem, e zastosowanie konfiguracji
odwrotnego serwera proxy pozwala na zmniejszenie liczby potomnych procesw serwera
Apache wymaganych do obsugi witryny ze 100 do 20.
234
Cz II Buforowanie
Dodatkowo mona wyeliminowa opnienie sieci podczas zamykania poczenia poprzez zainstalowanie w serwerze Apache nakadki lingerd. Po zakoczeniu poczenia sieciowego wysyajcy wysya odbiorcy pakiet 2'3, oznaczajcy zakoczenie poczenia.
Wysyajcy przed zamkniciem gniazda musi zaczeka na otrzymanie od odbierajcego
potwierdzenia otrzymania pakietu 2'3. W ten sposb uzyskuje pewno, e wszystkie dane
zostay pomylnie przesane. Po przesaniu pakietu 2'3 serwer Apache musi jedynie poczeka na otrzymanie pakietu 2'34!5 i zamkn poczenie. Proces lingerd poprawia
wydajno tej operacji dziki przekazaniu gniazda do zewntrznego demona (lingerd),
ktry oczekuje na otrzymanie pakietu 2'34!5 po to, aby zamkn gniazdo.
W przypadku obcionych serwerw WWW zastosowanie nakadki lingerd umoliwia
uzyskanie znaczcego zysku wydajnoci, w szczeglnoci w poczeniu ze zwikszeniem
rozmiarw buforw. Kompilacja nakadki lingerd jest bardzo prosta. Jest ona wykorzystywana w wielu znanych witrynach WWW, midzy innymi Sourceforge.com, Slashdot.org
oraz LiveJournal.com.
Jeszcze lepsze efekty od zastosowania szybkich pocze do serwera zawartoci daje taka
konfiguracja, w ktrej w ogle nie trzeba przesya da. Takie moliwoci uwzgldniono
w protokole HTTP.
Buforowanie HTTP jest moliwe na wielu poziomach:
wbudowane buforowanie w odwrotnych serwerach proxy;
bufory proxy zainstalowane u dostawcw internetu;
bufory wbudowane w przegldarkach WWW.
Aby mona byo wykorzysta mechanizmy buforowania, aplikacje PHP musz by do
tego odpowiednio przystosowane. W takich aplikacjach naley uwzgldni strategie
buforowania przegldarek i serwerw proxy, a take odpowiednio przygotowa dane.
235
W kodzie aplikacji powinny znajdowa si odpowiednie instrukcje wysyajce do przegldarek dyrektywy sterowania buforami.
Istniej cztery parametry nagwka HTTP wykorzystywane do obsugi buforowania
w aplikacjach:
46
7
#
8
&4
5
45
5&& ?@
A
"
"B"
?C!:(DE'' C@CF(GC
&?>%
<(.'
"
">@
&?>H
'
"
">@
&?>/B"'<&>@
I
Fragment ten oznacza, e dane nie powinny by umieszczane w buforze i zawsze naley
je odwiea.
Po dokadniejszej analizie moliwoci gwarantowanych przez wymienione parametry nagwkowe mona zauway istotne niedogodnoci:
Ustawienie czasu wanoci strony jako bezwzgldnego znacznika czasu wymaga
236
Cz II Buforowanie
Bufor w przegldarce klienta rni si od bufora u dostawcy usug internetowych.
Dyrektywa 5
45
definiuje moliwoci buforowania danego dokumentu. Zgodnie z dokumentem RFC 2616, dyrektyw 5
45
powinny przestrzega wszystkie
bufory oraz serwery proxy, a nagwki do przegldarki wysyajcej danie musz przesya wszystkie serwery proxy.
Do okrelenia moliwoci buforowania dania mona wykorzysta nastpujce dyrektywy:
odpowied moe by umieszczona w dowolnym buforze.
odpowied moe by umieszczona w takim buforze, ktry nie jest
i nie mona ich zapisywa na trwaych nonikach. Dla obiektw, ktre mona
buforowa, mona wprowadzi dyrektywy okrelajce czas, przez jaki obiekty
mog by przechowywane w buforze.
wszystkie bufory musz weryfikowa dania strony. W czasie
weryfikacji przegldarka wysya w daniu nagwek '464). Jeli
237
"
"B"
?C!:(DE'' C:""
"@CF(GC
.?3H#LH#MC1N(-!1N1H!31O)HCPB"
"
"@A
&?>EGG/556O
(.>@
I
A
&?>)&<)
'"
<$
>@
&?>%
<(.'
"
">@
I
I
Funkcja pobiera jako argument czas ostatniej modyfikacji strony, a nastpnie porwnuje
go z czasem okrelonym w parametrze '464) przesanym przez przegldark
klienta. Jeli czasy s identyczne, kopia znajdujca si w buforze jest aktualna, a zatem
do klienta zwracany jest kod ,9, ktry oznacza, e mona wykorzysta kopi z bufora.
W innym przypadku ustawiany jest parametr
46 wraz z dyrektyw 5
4
5
, nakazujc odwieenie strony w buforze.
Aby wykorzysta t funkcj, trzeba zna czas ostatniej modyfikacji strony. W przypadku
stron statycznych (na przykad ilustracji lub prostych, niedynamicznych stron HTML)
jest nim po prostu czas ostatniej modyfikacji pliku. W przypadku stron generowanych
dynamicznie (z wykorzystaniem PHP lub podobnej techniki), czas ostatniej modyfikacji
to moment, w ktrym zmieniono ktrykolwiek z elementw wykorzystywanych do wygenerowania strony.
Rozwamy aplikacj rejestrujc zdarzenia serwera WWW, ktra wywietla aktualne dane
na swojej gwnej stronie:
J&;!2(3Q%/?@
J&<9
?>3H%H)G"
?
"
"@
N#-(;JB
>@
.?
@A
?
@
<9.
&;?@
$
&& ?
@
I
Dla tej strony czasem ostatniej modyfikacji jest znacznik czasu ostatniego zapisu.
Jeli wiemy, e strona bdzie aktualna przez jaki czas i nie jest dla nas wane, e czasami
moe by przestarzaa, moemy wyczy ustawienie 4
i jawnie ustawi
warto parametru 7
. Naley pamita, e w takim przypadku dane bd w pewnym sensie nieaktualne: poinformowanie bufora proxy, e serwowana tre bdzie aktualna przez jaki czas, uniemoliwia aktualizacj tej treci dla wybranego klienta w wybranym
przedziale czasu. W wielu przypadkach nie stanowi to adnego problemu.
238
Cz II Buforowanie
Rozwamy na przykad witryn WWW z serwisem informacyjnym, tak jak witryna CNN.
Nawet w przypadku takich stron, ktre zawieraj najwiesze wiadomoci, brak aktualizacji strony z przez jedn minut nie stanowi wielkiego problemu. Aby uzyska taki efekt,
mona ustawi parametry nagwkw na kilka sposobw.
Aby strona bya buforowana przez wspdzielone serwery proxy przez okres jednej minuty, mona wywoa nastpujc funkcj:
.
&$
?
$@
A
;
"?@
"
"B"
?C!:(DE'' C:;@CF(GC
"B"
?C!:(DE'' C:;R
$@CF(GC
// Zgodno wstecz z klientami HTTP/1.0
&?>%
(.'
"
">@
&?>H
'
">@
//Obsuga HTTP/1.1
&?>)&<)
'J:"
<B
$>@
I
"
"B"
?C!:(DE'' C:;@CF(GC
"B"
?C!:(DE'' C:;R
$@CF(GC
// Zgodno wstecz z klientami HTTP/1.0
&?>%
(.'
"
">@
&?>H
'
">@
// Obsuga HTTP/1.1
&?>)&<)
'$
:"
<B
$C: <"
B>@
I
Wreszcie, w celu zablokowania buforowania strony mona wprowadzi tak oto funkcj:
.
&?
$@
A
// Zgodno wstecz z klientami HTTP/1.0
&?>H
'>@
&?>/B"'<&>@
// Obsuga HTTP/1.1
&?>)&<)
'<&:<
:"
<B: <"
B:"
<$
>@
I
Mechanizm obsugi sesji w PHP ustawia pokazane powyej nagwki blokujce buforowanie w chwili wywoania funkcji :
. Jeli wydaje si nam, e lepiej znamy aplikacj obsugujc sesj od autorw rozszerzenia, moemy odtworzy nagwki po
wywoaniu funkcji :
.
Poniej podano kilka uwag, o ktrych naley pamita podczas wykorzystywania mechanizmw zewntrznego buforowania:
239
Za pomoc mechanizmw tego typu nie mona buforowa stron danych przy
uyciu metody #");.
Zastosowanie buforowania nie oznacza, e strona jest serwowana tylko raz, a jedynie,
W specyfikacji HTTP 1.0 wprowadzono pojcie kodowania zawartoci, umoliwiajce
wysyanie przez klienta informacji do serwera o moliwoci obsugi przekazywanych
stron w postaci zaszyfrowanej. W wyniku kompresji przesyane dokumenty maj mniejsze
rozmiary. Dziki temu uzyskuje si dwa efekty:
Zmniejszenie zapotrzebowania na pasmo ze wzgldu na mniejsz objto
Ustawienie tej opcji powoduje automatyczne ustalenie moliwoci przegldarki wysyajcej danie natychmiast po sprawdzeniu nagwka i wysyanie dokumentw odpowiednio
skompresowanych.
Wad kompresji w PHP jest moliwo jej stosowania tylko dla stron generowanych
przez PHP. Jeeli serwer obsuguje wycznie strony PHP, nie ma problemu. W innym
przypadku do kompresji mona wykorzysta zewntrzny modu serwera Apache (np. mod_
deflate lub mod_gzip).
240
Cz II Buforowanie
W niniejszym rozdziale zaprezentowano kilka nowych technik. Niektre z nich s zbyt obszerne, aby mona byo je opisa dostatecznie szczegowo. Poniej wskazano opracowania, w ktrych mona znale dodatkowe informacje.
!
Informacji zawsze najlepiej szuka u ich rda. Protokoy stosowane w internecie s
zdefiniowane w dokumentach RFC (skrt od ang. Request for Comment zapytanie
o opini) wydawanych przez zesp roboczy IETF (skrt od ang. Internet Engineering
Task Force). W dokumencie RFC 2616 opisano dodatkowe parametry nagwka protokou HTTP 1.1. Jest to miarodajne rdo skadni i semantyki dla rnorodnych dyrektyw
nagwka. Dokumenty RFC mona pobra z wielu miejsc w internecie. Moim ulubionym
miejscem jest witryna zespou IETF: www.ietf.org/rfc.html.
Wicej informacji na temat dziaania buforw kompilatora mona znale w rozdziaach 21. i 24.
Nick Lindridge, autor akceleratora ionCube, napisa doskonay artyku dotyczcy dziaania stworzonego przez siebie narzdzia. Dokument jest dostpny pod adresem www.php-accelerator.co.uk/PHPA_Article.pdf.
Kod rdowy bufora APC mona znale w witrynie repozytorium PEAR bibliotek PHP.
Po kod binarny akceleratora ionCube odsyam pod adres www.ioncube.com.
Akcelerator Zend znajduje si pod adresem www.zend.com.
Serwer Squid jest dostpny pod adresem www.squid-cache.org. W witrynie znajduje si
take wiele doskonaych zasobw dotyczcych konfiguracji i zastosowa serwera. Interesujcy artyku dotyczcy zastosowania serwera Squid jako akceleratora HTTP mona przeczyta w witrynie ViSolve pod adresem http://squid.visolve.com/white_papers/
reverseproxy.htm. Dodatkowe materiay powicone poprawie wydajnoci serwera Squid
jako odwrotnego serwera proxy mona znale pod adresem http://squid.sourceforge.net/
rproxy.
Po modu mod_backhand odsyam pod adres http://www.backhand.org/mod_backhand/.
W niniejszym rozdziale przedstawiono zaledwie podstawowy opis zastosowania moduu
mod_proxy. Doskonae efekty obsugi da mona uzyska poprzez integracj moduu
mod_proxy z moduem mod_rewrite.
241
"
Po modu mod_deflate dla serwera Apache w wersji 1.3.x odsyam pod adres http://
sysoev.ru/mod_deflate. Modu ten nie ma nic wsplnego z moduem mod_deflate dla
serwera Apache 2.0. Podobnie jak w przypadku moduu mod_accel, dokumentacja tego
projektu jest niemal w caoci po rosyjsku.
Modu mod_gzip opracowaa firma Remote Communications, ale obecnie ma on now
lokalizacj na witrynie Sourceforge, pod adresem http://sourceforge.net/projects/mod-gzip.