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

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

PHP. Zaawansowane programowanie. Vademecum profesjonalisty

Krtkie wprowadzenie do wzorcw projektowych .............................................................. 57


Wzorzec Adaptor ........................................................................................................... 58
Wzorzec Template ......................................................................................................... 62
Polimorfizm ................................................................................................................... 63
Interfejsy i podpowiadanie typw.................................................................................. 65
Wzorzec Factory ............................................................................................................ 67
Wzorzec Singleton......................................................................................................... 68
Przecianie ......................................................................................................................... 70
SPL i iteratory................................................................................................................ 75
__call ().......................................................................................................................... 80
__autoload()................................................................................................................... 82
Dalsze lektury ...................................................................................................................... 83




" "%

&
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

Tworzenie demonw.......................................................................................................... 146


Zmiana katalogu roboczego......................................................................................... 147
Zmniejszanie uprawnie .............................................................................................. 147
Gwarantowanie wycznoci ....................................................................................... 148
czymy wszystko razem kontrolowanie usug............................................................ 148
Dalsze lektury .................................................................................................................... 157

,


-  !%

.
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




/0 1 ! !#!

&
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

D:\PDF\PHP. Zaawansowane programowanie. Vademecum profesjonalisty\__Spis treci.doc

PHP. Zaawansowane programowanie. Vademecum profesjonalisty



  

.


$  $1#  $


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

D:\PDF\PHP. Zaawansowane programowanie. Vademecum profesjonalisty\__Spis treci.doc

10

PHP. Zaawansowane programowanie. Vademecum profesjonalisty

Buforowanie w rodowisku rozproszonym ........................................................................ 377


Bufory scentralizowane ............................................................................................... 380
W peni zdecentralizowany bufor wykorzystujcy Spread .......................................... 382
Skalowanie baz danych...................................................................................................... 385
Tworzenie aplikacji korzystajcych z konfiguracji gwny-podlegy.......................... 388
Alternatywy replikacji ................................................................................................. 390
Alternatywy systemw zarzdzania relacyjnymi bazami danych ................................ 391
Dalsze lektury .................................................................................................................... 392

 ,
 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

" #$  %&


 
 - $1##$*  #1##$

' 
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

Przykady testw wydajnoci............................................................................................. 457


Dopasowanie znakw na pocztku cigu..................................................................... 458
Rozszerzenia makr....................................................................................................... 459
Interpolacja i czenie .................................................................................................. 464

"

'(
   %)*

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

D:\PDF\PHP. Zaawansowane programowanie. Vademecum profesjonalisty\__Spis treci.doc

11

12

PHP. Zaawansowane programowanie. Vademecum profesjonalisty

Pisanie wasnych procedur obsugi sesji ............................................................................ 551


Interfejs API obsugi strumieni .......................................................................................... 555
Dalsze lektury .................................................................................................................... 565


 -  !% (  !/ 

,
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.



Serwer PHP wykonuje kod poredni.

W procesie tym naley zwrci uwag na kilka istotnych elementw:


 w przypadku wielu skryptw (szczeglnie takich, w ktrych jest duo instrukcji
 ) wicej czasu zajmuje przeanalizowanie skryptu i jego przeksztacenie

na posta poredni ni samo wykonanie kodu;


 nawet jeli wyniki wykonania etapu 1. niewiele rni si pomidzy poszczeglnymi

wywoaniami skryptu, kade jego wywoanie powoduje wykonywanie opisanych


wyej dwch etapw;
 sekwencja dwch etapw wykonywana jest nie tylko wtedy, kiedy wykonywany

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

rdowego, produkowany przez firm Zend Industries i rozprowadzany za opat;


 ionCube Accelerator komercyjny bufor kompilatora bez dostpu do kodu

rdowego, ale darmowy; napisany przez Nicka Lindridgea i rozprowadzany


przez jego firm ionCube;
 APC darmowy bufor kompilatora typu open source, napisany przez Daniela

Cowgilla i mnie.

Rozdzia 9.  Strojenie wydajnoci zewntrznej

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:

 

Skonfigurowanie bufora wymaga dodania nastpujcego wiersza w pliku php.ini:



     

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

Bufory kompilatorw pozwalaj na uzyskanie najwikszych korzyci w przypadku kodu,


w ktrym wystpuje dua ilo instrukcji  . Kiedy pracowaem w firmie Community Connect (tam, gdzie powsta bufor APC), zdarzao si, e w skrypcie byo, uwzgldniajc wywoania rekurencyjne, 30, a nawet 40 wywoa tej instrukcji. Taka dua liczba
plikw doczanych wynikaa z modularnego ukadu zasadniczej czci kodu, w ktrej
funkcje o podobnym przeznaczeniu byy umieszczane w oddzielnych bibliotekach. W tamtym rodowisku zastosowanie bufora APC pozwolio na uzyskanie ponad stuprocentowego
wzrostu wydajnoci.


  
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  .

Rozdzia 9.  Strojenie wydajnoci zewntrznej

227

 Skadanie staych przeksztacanie kodu wykonujcego operacje na grupie staych

w taki sposb, aby obliczenia byy wykonywane raz w fazie kompilacji. Na przykad
operacj:
   

optymalizator przeksztaci wewntrznie na instrukcj w postaci:


    

bez koniecznoci modyfikacji kodu.


 Optymalizacja wewntrznej struktury kodu lokalne dziaania optymalizacyjne

wykonywane w celu poprawy wydajnoci kodu (na przykad przeksztacenie


instrukcji  na  w przypadku, kiedy zwracana warto wystpuje
w kontekcie void). Instrukcja  wykonuje inkrementacj po obliczeniu
wartoci wyraenia . I tak na przykad wykonanie instrukcji 
powoduje ustawienie zmiennej  na warto zmiennej  i pniejsz
inkrementacj zmiennej . Oznacza to konieczno zapamitania wartoci
zmiennej  do wykorzystania w wyraeniach. W odrnieniu od tej instrukcji
 powoduje inkrementacj przed obliczeniem wartoci wyraenia, a zatem
nie trzeba zapamitywa wartoci (dziki czemu instrukcja wykonuje si szybciej).
Jeeli instrukcja  jest wykorzystywana w wyraeniu, w ktrym warto
zmiennej  nie jest wykorzystywana (co okrela si jako kontekst void), mona
j bezpiecznie przeksztaci na instrukcj .
Optymalizatory mona rwnie wykorzysta do wielu innych zastosowa.
W jzyku PHP nie ma wewntrznego optymalizatora kodu, ale istniej dodatki speniajce
takie funkcje:
 optymalizator Zend bez dostpu do kodu rdowego, ale darmowy;
 wbudowany optymalizator akceleratora ionCube;
 optymalizator typu proof-of-concept w bibliotece PEAR.

Najwiksze korzyci z zastosowania optymalizatorw kodu uzyskuje si w przypadku,


kiedy kod jest kompilowany i optymalizowany raz, a potem uruchamiany wielokrotnie.
Tak wic w jzyku PHP korzyci z zastosowania optymalizatora bez bufora kompilatora
s minimalne. Optymalizator uyty w poczeniu z buforem kompilatora pozwala na uzyskanie niewielkiej, ale zauwaalnej poprawy w porwnaniu z uyciem samego bufora
kompilatora.

  
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.

Rozdzia 9.  Strojenie wydajnoci zewntrznej

229



Czasy transmisji sieciowej dla typowego dania

Zastosowanie takiej strategii wymaga spenienia kilku warunkw:


 Serwer proxy nie moe zuywa zbyt wielu zasobw. Dla jednego dania klienta

serwer proxy zuywa znacznie mniej zasobw ni aplikacja PHP.


 Serwer proxy oraz aplikacja PHP musz znajdowa si w tej samej sieci lokalnej.

Dziki temu poczenie pomidzy aplikacj, a serwerem wprowadza bardzo mae


opnienie.
Typow konfiguracj odwrotnego serwera proxy pokazano na rysunku 9.4. Warto zwrci
uwag, e zdalne klienty s podczone do wolnych cz (z duymi opnieniami), natomiast serwer proxy i serwer WWW znajduj si w tej samej, szybkiej sieci. Zwrmy
rwnie uwag na to, e serwer proxy podtrzymuje znacznie wicej pocze klienckich
ni pocze z serwerem WWW. Taka sytuacja jest spowodowana tym, e dziki szybkiemu czu pomidzy serwerem WWW a serwerem proxy serwer WWW moe obsugiwa dania na bieco i nie musi marnowa czasu w oczekiwaniu na zakoczenie transmisji sieciowej.

230

Cz II  Buforowanie




Typowa
konfiguracja
odwrotnego
serwera proxy

W przypadku serwera Apache mamy do wyboru kilka doskonaych odwrotnych serwerw


proxy, midzy innymi:
  standardowy modu dostarczany wraz z serwerem Apache;
 

modu produkowany przez firm zewntrzn, bardzo podobny

do moduu mod_proxy (w duej czci wykorzystano w nim kod rdowy


moduu mod_proxy), oferujcy dodatkowo funkcje specyficzne dla odwrotnych
serwerw proxy;
 
  modu rwnowaenia obcienia, produkowany przez firm

zewntrzn, speniajcy funkcj odwrotnego serwera proxy;


 Squid zewntrzny demon serwera proxy oferujcy wysoko wydajne funkcje

zwykego (dziaajcego w trybie forward) i odwrotnego serwera proxy.


We wszystkich wymienionych rozwizaniach egzemplarz serwera proxy moe dziaa na
dedykowanym komputerze lub te jako oddzielny egzemplarz serwera na tym samym
komputerze. Sprbujmy przeanalizowa sposb konfiguracji odwrotnego serwera proxy
dziaajcego na tym samym komputerze z wykorzystaniem serwera mod_proxy. Najatwiejszym sposobem wykonania takiej konfiguracji jest zainstalowanie dwch kopii
serwera Apache jednej z wbudowanym moduem mod_proxy (zainstalowanym w katalogu /opt/apache_proxy) oraz drugiej z serwerem PHP (zainstalowanym w katalogu /opt/
apache_php).

Rozdzia 9.  Strojenie wydajnoci zewntrznej

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

W przypadku pokazanej konfiguracji naley zwrci uwag na nastpujce elementy:


 Katalog  jest ustawiony na /dev/null, poniewa serwer nie posiada

wasnej zawartoci.
 W konfiguracji okrelono jawne dowizanie do zewntrznego adresu ethernetowego
serwera (
 
). Powizanie naley okreli jawnie, poniewa w przypadku

tej konfiguracji na jednym komputerze dziaaj dwa oddzielne egzemplarze serwera


PHP. Bez instrukcji  pierwszy serwer rozpoczynajcy dziaanie wizaby
wszystkie dostpne adresy, uniemoliwiajc dziaanie drugiego egzemplarza.
 Parametr  !  ustawiono na ". Serwery WWW obsugujce duy ruch,

w ktrych stosuje si model pre-fork (np. Apache), lub (w mniejszym stopniu)


takie, w ktrych stosuje si modele wielowtkowe (np. Zeus), zazwyczaj dziaaj
mniej wydajnie przy ustawieniu parametru  !  na .
 Parametr #
$  ma warto ", co uaktywnia modu mod_proxy.
 Instrukcja #
$# % &%% % powoduje, e modu mod_proxy

wewntrznie poredniczy w przekazywaniu da rozpoczynajcych si od znaku %


(czyli wszystkich da) do serwera powizanego z adresem IP hosta localhost
(tzn. z serwerem PHP).

232

Cz II  Buforowanie
 Jeli serwer PHP wyle do skryptu foo.php danie przekierowania zawierajce

nazw serwera, klient otrzyma to danie w nastpujcej postaci:


% 
'&

'   &
.&

W przypadku uytkownika zdalnego takie danie nie zadziaa, a zatem zmienna


#
$#  
 przepisuje przeadresowania   w taki sposb, aby
wskazyway na waciwego hosta.
 Zapis #
$'"(
)*+,+-. powoduje ustawienie rozmiaru bufora

wykorzystywanego przez odwrotny serwer proxy do zbierania informacji


przekazywanych przez serwer PHP na 131072 bajty. Aby zapobiec blokowaniu
serwera podczas komunikacji z przegldark, parametr ten naley ustawi
na warto rwn co najmniej najwikszemu rozmiarowi strony przesyanej
do uytkownika. Dziki temu mona przesa ca stron z serwera PHP do serwera
proxy, zanim jakiekolwiek dane zostan przesane z powrotem do przegldarki.
W takim przypadku, podczas gdy serwer proxy obsuguje przesyanie danych
do przegldarki klienckiej, serwer PHP moe kontynuowa dziaanie.
 Na zakoczenie naley wyczy wszystkie dania proxy wychodzce do serwera.

Ustawienie to zapobiega powstawaniu bdw typu open proxy.


Architektury procesw: pre-fork, z obsug zdarze oraz wielowtkowa
Serwery WWW mog dziaa w trzech rnych architekturach: w architekturze pre-fork, z obsug
zdarze i wielowtkowej.
W modelu pre-fork istnieje pula procesw, ktrych zadaniem jest obsuga nowych da. W przypadku pojawienia si nowego dania jego obsug powierza si jednemu z procesw potomnych.
Proces potomny zwykle obsuguje wicej ni jedno danie. Taki model zastosowano w wersji 1.3
serwera Apache.
W modelu z obsug zdarze pojedynczy proces obsuguje dania w jednym wtku, wykorzystujc
do szybkiej obsugi wielu da nieblokujcy (asynchroniczny) mechanizm wejcia-wyjcia. Taka architektura dziaa doskonale w przypadku obsugi plikw statycznych, ale niezbyt dobrze sprawdza
si dla da dynamicznych (poniewa jest tu potrzebny oddzielny proces lub wtek do dynamicznej czci kadego z da). Model z obsug zdarze zastosowano w niewielkim, szybkim serwerze WWW autorstwa Jefa Poskanzera thttpd.
W modelu wielowtkowym pojedynczy proces do obsugi da wykorzystuje pul wtkw. Model
ten jest bardzo podobny do modelu pre-fork, poza tym, e ze wzgldu na istnienie wielu wtkw
niektre zasoby s wspdzielone pomidzy wtkami. Taki model wykorzystano w serwerze WWW
Zeus. Pomimo tego, e samo PHP obsuguje synchronizacj wtkw, jest bardzo trudno stwierdzi lub te zagwarantowa, e biblioteki firm zewntrznych wykorzystywane w kodzie rozszerze
take j obsuguj. Oznacza to, e nawet w przypadku wielowtkowego serwera WWW czsto nie
mona zastosowa wielowtkowego kodu PHP, ale trzeba zastosowa rwnolege wykonywanie
procesw poprzez implementacje fastcgi lub cgi.
W serwerze Apache 2 zastosowano architektur umoliwiajc skonfigurowanie architektury procesw jako pre-fork, wielowtkowej lub hybrydowej, w zalenoci od potrzeb.

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:
%
   &
' 

Rozdzia 9.  Strojenie wydajnoci zewntrznej

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.

    


 
Wrd informatykw wci toczy si zaarta dyskusja, z ktrej wynika, e jeeli nie zastosuje si lokalnego buforowania, wykorzystanie konfiguracji odwrotnego serwera proxy
wie si ze zbyt duym nakadem w porwnaniu z uzyskanymi efektami. Podobny efekt
do zastosowania odwrotnego serwera proxy bez koniecznoci instalowania osobnego serwera mona uzyska, powierzajc zadanie buforowania danych systemowi operacyjnemu.
Z opisu konfiguracji odwrotnych serwerw proxy we wczeniejszej czci niniejszego
rozdziau wynika, e najwikszy udzia w czasie oczekiwania na przesanie danych ma
czas blokowania klienta pomidzy przesyanymi do niego pakietami.
Aplikacja musi wysya wiele pakietw, poniewa w systemie operacyjnym istnieje ograniczenie iloci informacji, jakie mona zbuforowa przed ich przesaniem przez gniazdo
TCP. Na szczcie to ustawienie mona atwo dostroi.
W systemie FreeBSD konfiguracj buforw TCP mona zmodyfikowa za pomoc nastpujcych polece:
 
<;


   5657
 
<;


 $   5=

W systemie Linux naley wprowadzi nastpujce polecenie:


 &>5657>9   
 ;"""

Po wykonaniu tych modyfikacji rozmiar bufora wychodzcych da TCP bdzie wynosi


128 kB, natomiast rozmiar bufora da przychodzcych 8 kB (poniewa do klienta
dochodzi niewielka ilo danych przychodzcych, natomiast odsyanych jest wiele danych). Przy takim zaoeniu maksymalny rozmiar wysyanej strony wynosi 128 kB. Warto t naley dostosowa do konkretnych realiw. Dodatkowo mona dostroi parametr
/
0 01
 w celu przydzielenia pamici dla wikszych buforw (po szczegowe informacje odsyam do dokumentacji systemw).
Po dostrojeniu limitw systemu operacyjnego naley odpowiednio skonfigurowa serwer
Apache, tak aby wykorzystywa zdefiniowane w systemie wiksze bufory. W tym celu
w pliku httpd.conf naley wprowadzi nastpujcy wiersz:
32..345657

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.

Na rysunku 9.5 zaprezentowano typow konfiguracj odwrotnego serwera proxy. Jeli


uytkownik przesya danie do strony www.example.foo, serwer DNS w rzeczywistoci
kieruje go do serwera proxy. Jeli dana strona istnieje w buforze proxy i nie jest przestarzaa, kopia strony z bufora jest przesyana do uytkownika bez kontaktu z serwerem
WWW. W innym przypadku poczenie jest kierowane do serwera WWW w sposb opisany we wczeniejszej czci niniejszego rozdziau przy okazji opisywania konfiguracji
odwrotnego serwera proxy.
W wielu produktach oferujcych funkcje odwrotnego serwera proxy istniej zintegrowane
bufory. Nale do nich Squid, mod_proxy i mod_accel. Wykorzystanie buforowania zintegrowanego z odwrotnym serwerem proxy jest atwym sposobem usprawnienia dziaania
konfiguracji serwera proxy. Zastosowanie lokalnego buforowania gwarantuje odcienie
serwerw PHP dziki maksymalnemu wykorzystaniu moliwoci buforowania.


 



 


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.

Rozdzia 9.  Strojenie wydajnoci zewntrznej

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


Parametr  46 w HTTP 1.0 ma kluczowe znaczenie w negocjacji moliwoci


buforowania pomidzy skryptem a przegldark. Wartoci tego parametru jest data ostatniej modyfikacji strony w formacie UTC (skrt od ang. Universal Time Coordinated,
poprzednio GMT). Kiedy bufor da weryfikacji aktualnoci strony, wysya dat okrelon parametrem  46 jako warto pola '464), dziki czemu serwer
wie, z jak wersj strony ma porwna przesan zawarto.
Pole 7 
 jest komponentem protokou HTTP 1.0 umoliwiajcym weryfikacj aktualnoci strony. Jego warto skada si z daty (w formacie GMT), po ktrej dana strona
traci wano.
Niektrzy uwzgldniaj take parametr #
8 &4 , ktry oznacza, e dokument
nie powinien by buforowany. Chocia nic nie stoi na przeszkodzie, aby ustawi ten parametr, jego znaczenie okrelono jawnie jedynie w specyfikacji HTTP 1.0, a zatem jego
przydatno wynika gwnie z tego, e jest standardem de facto zaimplementowanym
w wielu buforach obsugujcych HTTP 1.0.
W kocu lat dziewidziesitych, kiedy w wielu aplikacjach klienckich wykorzystywano protok HTTP 1.0, moliwoci negocjacji buforowania przez aplikacje byy
ograniczone. W wikszoci dynamicznych stron standardowo umieszczano nastpujcy
nagwek:
.
&

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

synchronizacji zegarw systemowych systemw klienta i serwera.

236

Cz II  Buforowanie
 Bufor w przegldarce klienta rni si od bufora u dostawcy usug internetowych.

W buforze przegldarki mona zapisywa indywidualne dane uytkownika, natomiast


w buforze serwera proxy, ktry jest wykorzystywany przez wielu uytkownikw,
nie mona tego robi.
Usprawnieniem wymienionych niedogodnoci zajto si w specyfikacji protokou
HTTP 1.1, gdzie w celu rozwizania istniejcych problemw dodano zestaw dyrektyw
5 45
. Moliwe wartoci parametru 5 45
 zdefiniowano w dokumencie
RFC 2616. Skadnia dyrektywy 5 45
 jest nastpujca:
) &<)
 >) &<)
 >>'>   &<  <
$
 &<  <
$
>J  >
K>$
>
K><  &>
K><
>
K><
 .">
K>"
<$ 
>
K> <$ 
>
K>" <B>>>
<  
K> <" B>>>
<  

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

wspdzielony. Oznacza to, e danie mona umieci wycznie w buforze


przegldarki dajcego, natomiast nie mona go umieci w innych buforach.
 

 odpowiedzi nie mona umieci w buforze na adnym z poziomw
buforowania. Dyrektywa 4
 oznacza, e przesyane informacje s wraliwe

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

serwer potwierdzi, e strona jest najnowsz kopi, zwraca do klienta odpowied


,936. W innym przypadku powinien przesa do niego pen tre strony.
     dyrektywa podobna do 4
  , z t rnic,

e obowizek weryfikacji treci dotyczy buforw wspdzielonych przez wielu


uytkownikw.
    czas wyraony w sekundach, przez ktry strona moe by buforowana

bez koniecznoci weryfikacji.

Rozdzia 9.  Strojenie wydajnoci zewntrznej

237

    maksymalny czas, przez jaki dokument zapisany we wspdzielonym

buforze powinien by uwaany za aktualny. Zgodnie ze specyfikacj HTTP 1.1


ustawienie dyrektyw  4 8 lub 4  8 przesania ustawienia wanoci strony
dokonane za pomoc parametru 7 
.
Ponisza funkcja powoduje wygenerowanie nagwka strony, ktrej aktualno musi by
zawsze sprawdzana przez wszystkie rodzaje buforw:
.
$ 
  && ?""
"@
A


"
"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#-(;J B
 >@
.? 
@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

Z kolei dla stron spersonalizowanych mona ustawi moliwo buforowania wycznie


w przegldarce:
.
  &J; ?
$ @
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
&?>) &<)
 '$
:" <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:

Rozdzia 9.  Strojenie wydajnoci zewntrznej

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,

e jest serwowana raz do okrelonego serwera proxy w okresie aktualnoci bufora.


 Nie wszystkie serwery proxy s zgodne z dokumentem RFC. W przypadku

wtpliwoci lepiej zachowa ostrono i nie stosowa buforowania.


  
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

przesyanych danych. W wielu firmach pasmo stanowi najwikszy skadnik kosztw


technologii.
 Zmniejszenie opnie w sieci ze wzgldu na to, e mniejsze dokumenty mona

podzieli na mniejsz liczb pakietw sieciowych.


Korzyci uzyskuje si kosztem czasu procesora potrzebnego do wykonania kompresji.
W wyniku przeprowadzonego przeze mnie testu skutecznoci kompresji (za pomoc narzdzia mod_gzip) uzyskaem nie tylko mniejsze o 30 % zuycia pasma, ale take oglny
zysk wydajnoci okoo 10% wikszy wspczynnik liczby stron na sekund w porwnaniu z konfiguracj bez kompresji. Nawet gdyby nie udao si uzyska oglnego wzrostu wydajnoci, uzyskany efekt oszczdnoci, w zwizku z mniejszym o 30% zuyciem
pasma, by imponujcy.
Kiedy przegldarka kliencka wysya danie, przesya nagwek okrelajcy jej typ oraz
obsugiwane przez ni funkcje. W nagwku przegldarka informuje o akceptowanych
metodach kompresji w nastpujcy sposb:
)

<H B'B4:. 


Istnieje wiele sposobw kompresji. W przypadku kompilacji PHP z obsug biblioteki


zlib (z opcj 4 14*1 w fazie kompilacji) najprostszym sposobem kompresji jest
wykorzystanie wbudowanego mechanizmu obsugi kompresji gzip. Waciwo t mona
uaktywni poprzez ustawienie parametru w pliku php.ini w nastpujcy sposb:
4 J

 " -

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.

Rozdzia 9.  Strojenie wydajnoci zewntrznej

241

Wicej informacji mona znale na witrynie WWW projektu Apache (http://www.


apache.org). Zwizy przykad integracji moduw mod_rewrite i mod_proxy przedstawiem w mojej prezentacji na konferencji Apachecon w 2002 r. (Scalable Internet Architectures skalowalne architektury internetowe). Slajdy z tej prezentacji s dostpne pod
adresem http://www.omniti.com/~george/talks/LV736.ppt.
Modu mod_accel mona znale pod adresem http://sysoev.ru/mod_accel. Niestety, wiksza cz dokumentacji jest po rosyjsku. Napisany w jzyku angielskim przewodnik
how-to autorstwa Phillipa Maka dotyczcy instalacji moduw mod_accel i mod_deflate
znajduje si pod adresem http://www.aaanime.net/pmak/apache/mod_accel.

"

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.

You might also like