You are on page 1of 31

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

mod_perl. Podrcznik
programisty
Autorzy: Geoffrey Young, Paul Lindner, Randy Kobes
Tumaczenie: Przemysaw Kowalczyk
ISBN: 83-7197-799-9
Tytu oryginau: mod_perl Developer's Cookbook
Format: B5, stron: 564
Przykady na ftp: 105 kB

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

By moe Perl jest najlepszym jzykiem sucym do pisania skryptw CGI, ale skrypty
CGI nie s najlepszym sposobem tworzenia aplikacji internetowych. Potrzeba wikszej
wydajnoci, lepszej integracji z serwerem WWW i peniejszego wykorzystania jego
moliwoci doprowadzia do stworzenia moduu mod_perl. Pozwala on na pisanie
moduw serwera Apache w Perlu i na peny dostp do funkcji API Apache'a z poziomu
Perla.
mod_perl jest bardzo rozbudowany, dziki czemu daje programicie ogromne
moliwoci. Ksika mod_perl. Kompendium programisty bdzie nieocenion pomoc
w poznawaniu jego potencjau. Nauczysz si z niej podstaw mod_perla, a gdy ju je
opanujesz, poznasz tajniki pisania duych i skomplikowanych aplikacji.
W ksice opisano midzy innymi:
Instalacj i konfiguracj mod_perla
Komunikacj mod_perla z Apache
Dziaania na adresach URL
Obsug plikw w rodowisku mod_perla
Tworzenie wasnych aplikacji w oparciu o mod_perla
Osigania maksymalnej wydajnoci aplikacji uywajcych mod_perla
Dodatkowe moduy wsppracujce z mod_perlem
Po przeczytaniu tej ksiki uzyskasz now perspektyw na programowanie aplikacji
sieciowych w Perlu. Programici Slashdot.org, Internet Movie Database i Wired wybrali
mod_perl jako platform do tworzenia aplikacji. Moe i Ty powiniene pj w ich
lady?

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

Spis treci
Podzikowania.................................................................................................................................................9
O Autorach .....................................................................................................................................................12
Przedmowa...................................................................................................................................................... 13
Wprowadzenie............................................................................................................................................... 15

Cz I
Rozdzia 1.

Instalacja i konfiguracja................................................................................. 19
Instalacja moduu mod_perl .....................................................................................................................21
Wprowadzenie...................................................................................................................21
1.1. Dystrybucja binarna dla Uniksa .................................................................................22
1.2. Instalacja w systemie Windows .................................................................................25
1.3. Instalacja w systemie Mac OS X................................................................................27
1.4. Kompilacja w systemie Unix .....................................................................................27
1.5. Kompilacja w systemie Windows ..............................................................................31
1.6. Kompilacja w systemie Mac OS X ............................................................................35
1.7. Kompilacja moduu mod_perl jako biblioteki dzielonej............................................37
1.8. Testowanie instalacji ..................................................................................................38
1.9. Zmiana katalogw instalacji serwera Apache............................................................39
1.10. Dodawanie moduu mod_perl do dziaajcego serwera Apache .............................40
1.11. Ponowne uycie opcji kompilacji ............................................................................40
1.12. Odtwarzanie instalacji moduu mod_perl ................................................................41
1.13. Instalacja moduu mod_perl na wielu komputerach ................................................42
1.14. Sprawdzanie istniejcego serwera............................................................................45
1.15. Instalacja moduw serwera Apache z archiwum CPAN ........................................46
1.16. ledzenie rozwoju moduu mod_perl.......................................................................47
1.17. Wicej ni dostp przez CVS...................................................................................48
1.18. Kompilacja moduu mod_perl przy uyciu innej wersji Perla.................................50

4
Rozdzia 2.

mod_perl. Kompendium programisty

Konfigurowanie moduu mod_perl .......................................................................................................53


Wprowadzenie...................................................................................................................53
2.1. Przenoszenie skryptw CGI .......................................................................................53
2.2. Modu Apache::Registry ............................................................................................55
2.3. Skrypt startup.pl .........................................................................................................58
2.4. Dzielenie przestrzeni nazw w rodowisku Apache::Registry ....................................61
2.5. Wczesne adowanie skryptw w rodowisku Apache::Registry................................62
2.6. Ustawianie zmiennych rodowiskowych CGI ...........................................................63
2.7. Ustawianie innych zmiennych rodowiskowych .......................................................64
2.8. Ustawianie opcji interpretera Perla ............................................................................65
2.9. Bloki BEGIN i END w skrypcie startup.pl ................................................................66
2.10. Zarzdzanie wasnymi bibliotekami.........................................................................67
2.11. Trwae poczenia z baz danych.............................................................................69
2.12. Wczeniejsze nawizywanie pocze .....................................................................70
2.13. Nietrwae poczenia do bazy danych w rodowisku Apache::DBI ........................72
2.14. Ustawianie zmiennych specyficznych dla moduu mod_perl ..................................73
2.15. Ustawianie bardziej skomplikowanych zmiennych .................................................74
2.16. Dynamiczna konfiguracja serwera Apache..............................................................75
2.17. Zachowywanie kolejnoci w sekcjach <Perl> .........................................................77
2.18. Uywanie opcji w wierszu polece..........................................................................78
2.19. Uruchamianie podwjnego serwera .........................................................................79
2.20. Uywanie moduu mod_proxy do przekazywania da
do serwera Apache z moduem mod_perl ................................................................80
2.21. Uywanie moduu mod_proxy_add_forward...........................................................80

Cz II
Rozdzia 3.

Interfejs API moduu mod_perl..................................................................83


Obiekt dania ..............................................................................................................................................87
Wprowadzenie...................................................................................................................87
3.1. Obiekt dania............................................................................................................87
3.2. Komunikat dania HTTP..........................................................................................89
3.3. danie klienta ...........................................................................................................91
3.4. Dostp do nagwkw dania...................................................................................92
3.5. Dostp do pl formularzy HTML ..............................................................................95
3.6. Dane wysane metod POST......................................................................................97
3.7. Obsuga cookies .........................................................................................................98
3.8. Obsuga plikw wysyanych na serwer....................................................................100
3.9. Ustawianie nagwkw odpowiedzi serwera ...........................................................103
3.10. Sterowanie pamici podrczn .............................................................................105
3.11. Wysyanie nagwkw odpowiedzi serwera ..........................................................106
3.12. Ustawianie statusu odpowiedzi ..............................................................................108
3.13. Ustawianie nagwkw w przypadku bdu...........................................................111
3.14. Nagwki o wielu wartociach ...............................................................................113
3.15. dania wewntrzne...............................................................................................115
3.16. Ustawianie nagwkw dania wewntrznego.....................................................117
3.17. Rozpoznawanie da wewntrznych....................................................................118
3.18. Metoda HTTP dania ...........................................................................................118
3.19. Dostp do obiektu dania z podprogramu XS......................................................120

Spis treci

Rozdzia 4.

5
Komunikacja z serwerem Apache....................................................................................................... 127
Wprowadzenie.................................................................................................................127
4.1. Obiekt Apache::Server .............................................................................................127
4.2. Symulowanie dyrektyw IfModule i IfDefine ...........................................................130
4.3. Dostp do dyrektyw ServerRoot i DocumentRoot...................................................132
4.4. Zapis do dziennika bdw.......................................................................................134
4.5. Dostp do dyrektywy ErrorLog................................................................................136
4.6. Warto LogLevel ....................................................................................................138
4.7. Obiekt Apache::Connection .....................................................................................140
4.8. Zdalne adresy IP i nazwy serwerw.........................................................................141
4.9. Wykrywanie zerwania poczenia............................................................................143
4.10. Zamykanie procesu potomnego serwera Apache...................................................145

Rozdzia 5.

Przetwarzanie adresw URI................................................................................................................. 149


Wprowadzenie.................................................................................................................149
5.1. dany adres URI.....................................................................................................150
5.2. Okrelanie dyrektywy <Location> dla adresu URI .................................................152
5.3. Zmiana danego adresu URI ..................................................................................155
5.4. Konstruowanie nowego adresu URI ........................................................................157
5.5. Kodowanie znakw specjalnych w adresie URI ......................................................159
5.6. Wymuszenie typu MIME za pomoc adresu URI ...................................................161
5.7. Pobieranie zawartoci dania wewntrznego .........................................................162
5.8. Uycie klasy Apache::Util poza rodowiskiem moduu mod_perl..........................166

Rozdzia 6.

Obsuga plikw .......................................................................................................................................... 169


Wprowadzenie.................................................................................................................169
6.1. Tworzenie uchwytw plikw ...................................................................................170
6.2. Tworzenie plikw tymczasowych............................................................................172
6.3. Wysyanie caego pliku ............................................................................................173
6.4. Wczytywanie zawartoci plikw do zmiennych ......................................................176
6.5. Pobieranie informacji o danym pliku ...................................................................176
6.6. Nagwki warunkowe ..............................................................................................180
6.7. dania fragmentw plikw.....................................................................................183
6.8. Nagwki zwizane z datami....................................................................................187
6.9. Oprnianie buforw wyjciowych .........................................................................188
6.10. Przekierowanie uchwytw plikw wyjciowych ...................................................190

Rozdzia 7.

Tworzenie programw obsugi..............................................................................................................193


Wprowadzenie.................................................................................................................193
7.1. Tworzenie programu obsugi ...................................................................................194
7.2. Konfiguracja programw obsugi.............................................................................197
7.3. Dodawanie niewielkich programw obsugi............................................................199
7.4. Przygotowanie moduu do publikacji.......................................................................201
7.5. Tworzenie archiwum programu TAR ......................................................................202
7.6. Tworzenie binarnej dystrybucji PPM.......................................................................204
7.7. Testowanie moduu ..................................................................................................207
7.8. Wasne dyrektywy konfiguracyjne...........................................................................214
7.9. Rozszerzanie prototypw wasnych dyrektyw.........................................................223
7.10. czenie wasnych dyrektyw .................................................................................225
7.11. Zastpowanie dyrektyw rdzeniowych....................................................................231
7.12. Dodawanie znacznikw serwera ............................................................................236
7.13. Publikowanie moduu w archiwum CPAN ............................................................237

6
Rozdzia 8.

mod_perl. Kompendium programisty

Wsppraca z programami obsugi ..................................................................................................... 239


Wprowadzenie.................................................................................................................239
8.1. Wykrywanie zmian programw obsugi ..................................................................239
8.2. Dzielenie danych wewntrz procesu potomnego .....................................................241
8.3. Tworzenie dzielonego bufora...................................................................................244
8.4. Zachowywanie stanu ................................................................................................247
8.5. Wewntrzne przekierowania ....................................................................................251
8.6. Tworzenie wasnych stron o bdach .......................................................................254
8.7. Przywracanie domylnych stron o bdach ..............................................................257
8.8. acuchy programw obsugi..................................................................................259
8.9. acuchy programw obsugi w jzyku C...............................................................261
8.10. Dostp do zmiennych rodowiskowych.................................................................264
8.11. Dzielenie danych midzy fazami ...........................................................................265
8.12. Okrelanie aktualnej fazy dania..........................................................................268
8.13. Dane konfiguracyjne moduu Perla........................................................................269
8.14. Dane konfiguracyjne moduu jzyka C..................................................................270

Rozdzia 9.

Dostrajanie serwera Apache i moduu mod_perl ......................................................................... 275


Wprowadzenie.................................................................................................................275
9.1. Zbieranie podstawowych informacji o serwerze......................................................277
9.2. Tworzenie raportu zuycia pamici .........................................................................281
9.3. Zuycie pamici przez procesy serwera Apache......................................................283
9.4. Bardziej szczegowe informacje o zuyciu pamici przez procesy serwera..........284
9.5. Zuycie pamici przez moduy Perla .......................................................................286
9.6. Redukcja narzutu przy imporcie moduw ..............................................................288
9.7. Zmniejszanie cakowitego zuycia pamici.............................................................289
9.8. Zwikszanie obszaru pamici dzielonej...................................................................291
9.9. Regulacja liczby procesw potomnych....................................................................293
9.10. Ograniczanie wzrostu zuycia pamici przez procesy...........................................294
9.11. Zamykanie niekontrolowanych procesw..............................................................296
9.12. Profilowanie programw obsugi ...........................................................................298
9.13. Znajdowanie wskich garde wydajnoci...............................................................299
9.14. Dostrajanie wydajnoci serwera.............................................................................301
9.15. Serwer Apache jako serwer proxy .........................................................................305
9.16. Uywanie programu uruchomieniowego Perla z moduem mod_perl...................308
9.17. Wyszukiwanie bdw w skryptach Apache::Registry..........................................310
9.18. Redukcja narzutu uruchomieniowego....................................................................311
9.19. Wyszukiwanie bdw przy naruszeniach segmentacji .........................................313

Rozdzia 10.

Programowanie obiektowe przy uyciu moduu mod_perl......................................................315


Wprowadzenie.................................................................................................................315
10.1. Tworzenie klas i obiektw .....................................................................................316
10.2. Dziedziczenie metod ..............................................................................................318
10.3. Tworzenie obiektowych programw obsugi.........................................................321
10.4. Uywanie obiektowych programw obsugi..........................................................323
10.5. Dziedziczenie po klasie Apache.............................................................................326
10.6. Dziedziczenie po klasie Apache przy uyciu moduw XS...................................328
10.7. Dziedziczenie po klasie Apache::Registry.............................................................330
10.8. Dziedziczenie po klasie Apache::Request..............................................................333

Spis treci

Cz III Oprogramowywanie cyklu yciowego serwera Apache...............339


Rozdzia 11.

PerlInitHandler .......................................................................................................................................... 345


Wprowadzenie.................................................................................................................345
11.1. Przetwarzanie kadego dania..............................................................................346
11.2. Przetwarzanie kadego dania w danej dyrektywie zbiorczej .............................347
11.3. Mierzenie czasu dania.........................................................................................348
11.4. Przerywanie cyklu obsugi dania ........................................................................350

Rozdzia 12.

PerlTransHandler .......................................................................................................................................353
Wprowadzenie.................................................................................................................353
12.1. dania pliku favicon.ico.......................................................................................354
12.2. Rozpoznawanie serwerw wirtualnych w daniach.............................................355
12.3. Identyfikatory sesji w adresach URL .....................................................................358
12.4. Wspdzielenie dyrektywy DocumentRoot ...........................................................360
12.5. Sterowanie wbudowanym serwerem proxy ...........................................................362
12.6. Redukcja wywoa funkcji stat()............................................................................364

Rozdzia 13.

PerlAccessHandler, PerlAuthenHandler i PerlAuthzHandler.................................................371


Wprowadzenie.................................................................................................................371
13.1. Prosta kontrola dostpu ..........................................................................................372
13.2. Ograniczanie dostpu chciwym klientom...........................................................375
13.3. Identyfikacja podstawowa......................................................................................376
13.4. Ustawianie danych uytkownika............................................................................379
13.5. Warunkowa identyfikacja ......................................................................................381
13.6. Autoryzacja uytkownika.......................................................................................383
13.7. Tworzenie wasnego mechanizmu autoryzacji ......................................................386
13.8. Identyfikacja przy uyciu funkcji skrtu................................................................392

Rozdzia 14. PerlTypeHandler i PerlFixupHandler ............................................................................................. 401


Wprowadzenie.................................................................................................................401
14.1. Przywracanie domylnego programu obsugi generowania zawartoci.................402
14.2. Wybr programu obsugi na podstawie rozszerzenia nazwy pliku........................404
14.3. Zmiana typu MIME i programu obsugi ................................................................409
14.4. Zmiana domylnych typw MIME ........................................................................413
14.5. Wasny mechanizm buforujcy..............................................................................414

Rozdzia 15.

PerlHandler.................................................................................................................................................. 421
Wprowadzenie.................................................................................................................421
15.1. Podstawowy PerlHandler .......................................................................................422
15.2. Zarzdzanie wieloma programami obsugi typu PerlHandler................................425
15.3. Wysyanie poczty ...................................................................................................427
15.4. Filtrowanie generowanej zawartoci......................................................................431
15.5. Zapobieganie atakom skryptowym ........................................................................435
15.6. Modu Text::Template............................................................................................439
15.7. Modu HTML::Template........................................................................................443
15.8. Modu Apache::ASP ..............................................................................................445
15.9. Pakiet Template Toolkit .........................................................................................450
15.10. Modu HTML::Embperl.......................................................................................454
15.11. Modu HTML::Mason..........................................................................................458
15.12. Generowanie dokumentw XML.........................................................................461

mod_perl. Kompendium programisty


15.13. Generowanie oglnych dokumentw XML.........................................................464
15.14. Dokumenty XML i arkusze XSLT.......................................................................467
15.15. Pakiet AxKit.........................................................................................................470
15.16. Tworzenie serwera SOAP ....................................................................................472

Rozdzia 16.

PerlLogHandler i PerlCleanupHandler............................................................................................ 481


Wprowadzenie.................................................................................................................481
16.1. Dziennik w bazie danych .......................................................................................482
16.2. Dziennik w zwykym pliku ....................................................................................485
16.3. Zmiana wiersza dania .........................................................................................488
16.4. Zapisywanie niestandardowych informacji............................................................489
16.5. Rejestrowanie warunkowe .....................................................................................490
16.6. Przechwytywanie bdw.......................................................................................491

Rozdzia 17.

PerlChildInitHandler, PerlChildExitHandler, PerlRestartHandler


i PerlDispatchHandler.............................................................................................................................499
Wprowadzenie.................................................................................................................499
17.1. Konfiguracja kodu poza obsug dania...............................................................501
17.2. Uruchamianie kodu podczas restartu serwera........................................................503
17.3. Jednokrotne adowanie konfiguracji ......................................................................504
17.4. Przeadowywanie skryptw Registry w procesie nadrzdnym ..............................506
17.5. Identyfikacja procesw potomnych .......................................................................507
17.6. Wczesne czenie ze rdem danych ....................................................................509
17.7. ledzenie uycia moduw Perla............................................................................511
17.8. Zastpowanie programw obsugi .........................................................................512

Dodatki.......................................................................................................................................517
Dodatek A

Dostpne punkty zaczepienia i opcje kompilacji moduu mod_perl.....................................519


Punkty zaczepienia moduu mod_perl ............................................................................519
Opcje kompilacji moduu mod_perl................................................................................523

Dodatek B

Dostpne stae ..............................................................................................................................................531


Wartoci zwracane przez programy obsugi ...................................................................531
Stae okrelone przez protok HTTP .............................................................................531
Stae uywane przez programy obsugi dyrektyw...........................................................533
Stae sterujce zapisem w dzienniku...............................................................................536
Stae serwera ...................................................................................................................536

Dodatek C

Zasoby zwizane z moduem mod_perl............................................................................................ 537


Zasoby sieciowe ..............................................................................................................537
Ksiki.............................................................................................................................540

Skorowidz..................................................................................................................................................... 543

Obsuga plikw
Wprowadzenie
Podczas obsugi kadego dania serwera Apache nasza aplikacji musi czyta i przetwarza
zawarto plikw na dysku. W Perlu mona to zrealizowa wieloma sposobami. Aplikacje WWW
jednak, a w szczeglnoci aplikacje moduu mod_perl, maj specjalne wymagania, ktre najlepiej wypenia nowy interfejs obsugi plikw. Zadania w tym rozdziale przedstawiaj typowe
problemy i rozwizania spotykane przy posugiwaniu si plikami.
Apache zawiera interfejs API obsugi plikw zoptymalizowany pod ktem dziaania serwera
WWW. Modu mod_perl udostpnia elegancki, obiektowy interfejs do tych funkcji w klasie

. Korzystajc z tej klasy, nasza aplikacja zyska na jakoci.
G Dziaa szybciej. Klasa 
 uywa skompilowanego kodu jzyka C,

aby wykona wikszo zada.


G Jest bardziej stabilna. Pliki tymczasowe i zasoby tworzone dla dania s

automatycznie czyszczone.
G Peniej wykorzystuje moliwoci protokou HTTP. Klasa  (a w konsekwencji
take 
) obsuguje zaawansowane moliwoci protokou HTTP/1.1,

takie jak dania fragmentw (byte range) plikw czy nowe nagwki.
Ten rozdzia zawiera take recepty na typowe sytuacje.
G Konwersja dat modyfikacji plikw (i dowolnych innych) na odpowiednie nagwki HTTP.
G Oprnienie bufora danych wyjciowych i wysanie ich do klienta przed

zakoczeniem przetwarzania.
G Przekierowanie wyjcia istniejcego uchwytu pliku (jak  czy ).

170

Cz II G Interfejs API moduu mod_perl

Omwienie klasy 


 stanowi koniec naszego wprowadzenia do klas rdzeniowych
moduu mod_perl. Kolejne rozdziay poka, jak posugiwa si nimi w konkretnych aplikacjach.

6.1. Tworzenie uchwytw plikw


Chcemy utworzy nowy uchwyt pliku do czytania lub pisania.

Rozwizanie
Uyjemy metod  i  klasy 
, ktra stanowi obiektowy interfejs do
uchwytw plikw (filehandle).
Wydruk 6.1. Przykadowy program obsugi
 

 
 



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

-. $-.& "


  $& 
'/*0++ ,,,
$-.    
$-. & $& 
'++"#*1 #*23 +"#* # "#+ 2
'* ## +++45 + 0,
 
6

Komentarz
Jest wiele sposobw obsugi wejcia-wyjcia plikowego w Perlu. Najczciej uywa si moduw FileHandle.pm i 
 oraz funkcji  i . Klasa 
 stanowi
jeszcze jedno rozwizanie, dostarczajc obiektowy interfejs do uchwytw plikw, podobny do
moduw FileHandle.pm i 
. Stylistycznie klasa 
 dobrze wkomponowuje
si w modu mod_perl, poniewa wiksz cz jego interfejsu API stanowi wywoania metod

Rozdzia 6. G Obsuga plikw

171

rnych klas, wic obiektowy dostp do plikw rozjania kod. Dodatkowo klasa 

 posiada zalet w postaci wikszej wydajnoci, nie musimy si wic przejmowa spowolnieniem operacji na plikach, jak w przypadku moduu 
.
Konstruktor  zwraca nowy uchwyt pliku. Jeeli parametrem jest nazwa pliku, jak w naszym przykadzie (wydruk 6.1), wywouje metod 
 i zwraca otwarty
uchwyt pliku. Domylnie pliki s otwierane w trybie tylko do odczytu (znacznik  ),
ale moemy uy tych samych parametrw w metodzie 
 co w perlowej
funkcji . Chodzi tu oczywicie o starsz wersj tej funkcji, nie t z trzema parametrami,
wprowadzon w wersji 5.6 Perla.
"#$& % 

-. 
'"##  # ,
$& -.  7..7,$-.8 87 59 57
  :;<=;<;<<<

Jedn z zalet uywania konstruktora  w stosunku do metody  jest zwracanie wartoci !" w przypadku bdu, co pozwala stosowa prosty mechanizm obsugi sytuacji wyjtkowych.
Ponisza tabela przedstawia list metod klasy 
.
Tabela 6.1. Metody klasy Apache::File

Metoda

Opis



Tworzy nowy uchwyt pliku, opcjonalnie otwierajc wskazany plik.

 

Otwiera wskazany plik.

 

Zamyka uchwyt pliku.

"&

Tworzy plik tymczasowy i zwraca jego nazw i uchwyt w kontekcie listowym


albo tylko uchwyt w kontekcie skalarnym.

Chocia klasa 


 umoliwia wygodn obsug uchwytw plikw, jak rwnie dodatkowe korzyci, ktre opisujemy w kolejnych zadaniach, posiada niestety pewne ograniczenia. Midzy innymi nie implementuje wszystkich metod, ktrych moglibymy wymaga od
uchwytu pliku. To utrudnienie wychodzi na jaw w zadaniu 6.6, kiedy klasa 
##$  wymaga wywoania metody %"&. Oczywicie uchwyt pliku, utworzony przez klas 

, jest normalnym, perlowym uchwytem pliku, wic zawsze moemy na nim wywoa perlow funkcj & w sposb nieobiektowy.
Innym utrudnieniem jest nakad czasu w trakcie wykonywania spowodowany przez interfejs
obiektowy. Jeeli zdecydujemy si pozosta przy perlowej funkcji , moemy skorzysta
z automatycznego tworzenia anonimowych referencji (autovivification), wprowadzonego
w wersji 5.6 Perla, co pozwala opuci wywoanie metody '(
$'. Jeeli jednak uywamy starszej wersji Perla i chcemy uy funkcji , modu mod_perl udostpnia metod
$', bymy nie musieli docza moduu '(
do naszego programu obsugi.
"#$& % -.5 #"
 $& 2># , ">

172

Cz II G Interfejs API moduu mod_perl

6.2. Tworzenie plikw tymczasowych


Chcemy utworzy plik tymczasowy, ktry istnieje tylko podczas przetwarzania dania.

Rozwizanie
Uyjemy metody )'"
 z klasy 
.
Wydruk 6.2. Modu Rules.pm
*5 * *

<
 

 
?



  !
"#$% &
"#$& "2$& % 

-."&
"#$ &%?

-. & "%.$& "


"#$5%$ &-. 5
$5-. 5$ &-.& 2@A2B2CCA2>" 3&3 #D>
$ &-. 
'"#*E **  +)*,
*$& 2A2A
$-.   5 -$& "
$-.    7 9 &7
'F#G"#*,
$-. & $& 
'?*$& "3 # +* H+ ()  ,
 
6
B

Rozdzia 6. G Obsuga plikw

173

Komentarz
Czasem potrzebujemy pliku tymczasowego, na przykad kiedy tworzymy duy dokument i nie
chcemy przechowywa go w pamici przed wysaniem do klienta. W takiej sytuacji (i w podobnych) metoda )'"
 stanowi wygodny sposb tworzenia plikw tymczasowych, ktre
s usuwane po zakoczeniu przetwarzania dania.
Metoda )'"
 moe zosta wywoana na dwa sposoby: w kontekcie listowym zwraca
nazw nowego pliku i otwarty uchwyt, a w kontekcie skalarnym tylko uchwyt. W obu
przypadkach plik otwierany jest przy uyciu znacznikw  *+, +-,, czyli w trybie do odczytu i zapisu.
Pliki tymczasowe utworzone w ten sposb rni od plikw tworzonych przez metod 

)'"
 pod dwoma wzgldami: mamy dostp do nazwy pliku, a sam plik nie jest
usuwany, kiedy jego uchwyt wychodzi z zasigu widocznoci. S to wymarzone cechy dla programistw moduu mod_perl, pozwalajce atwo uy tego samego pliku tymczasowego
w rnych fazach przetwarzania dania. Moemy na przykad skorzysta z metody ),
opisanej w zadaniu 8.11, do przekazania nazwy lub uchwytu do pliku tymczasowego w acuchu
programw obsugi.
'I"43"# +4*#"+ 5 > JE 3>,
$-. ;K?LM;%.$& "

Warto te zauway, e wywoanie funkcji & nie jest niezbdne w naszym przykadzie
(wydruk 6.2), gdy modu . ,/) nie korzysta bezporednio z uchwytu pliku utworzonego za pomoc metody )'"
. W oglnym przypadku jednak jeeli chcemy pisa do wygenerowanego pliku tymczasowego (albo jakiegokolwiek innego), a pniej wypisa jego zawarto przy uyciu tego samego uchwytu pliku, musimy uy perlowej funkcji &, aby
ustawi wskanik pliku z powrotem na jego pocztku, jak w poniszym przykadzie (wydruk 6.3).
Wydruk 6.3. Uycie funkcji seek()
"#$& % 

-."&
 $& 7KJ"L ",7
'?+"#*E **  +)*,
*$& 2A2A
'F##G"#* * ,
$-. & $& 

6.3. Wysyanie caego pliku


Chcemy wysa cay plik do klienta.

174

Cz II G Interfejs API moduu mod_perl

Rozwizanie
Uyjemy metody !"!.
Wydruk 6.4. Przykadowy skrypt
"#$& % 

-. 7   , "7


&"#$ 5 %$-."7 5 7!
'F##G"#+401*,,,
$-. & $& 2$ 5 
6
!
',,, G#,
$-. & $& 
6

Komentarz
Wszystkie dotychczasowe przykady w tym rozdziale uyway metody %/!"!, aby
przesa plik bezporednio do klienta. Zazwyczaj mona si spotka z uyciem funkcji
/ ) do wypisania zawartoci pliku, jak na przykad:
  N$& .

Poniewa jednak wysyanie pliku do klienta jest czsto potrzebne w aplikacjach WWW, metoda !"! pozwala na wykonanie tej czynnoci atwo i efektywnie. Jej parametrem jest
otwarty uchwyt pliku; uywa ona interfejsu API jzyka C serwera Apache, aby wysa zawarto pliku do przegldarki klienta moliwie wydajnie. Zwraca dugo w bajtach przesanych danych na wypadek, gdybymy chcieli zna rnic midzy liczb wszystkich wysanych bajtw a pochodzcych z pliku. Drugim opcjonalnym parametrem moe by liczba
bajtw do wysania, uywa si go rzadko, ale w pewnych warunkach jest uyteczny, co mona
zobaczy w zadaniu 6.7.
Rozwamy na przykad sytuacj, w ktrej chcielibymy uruchomi usug, umoliwiajc
(zaufanemu) klientowi zadanie zawartoci pliku konfiguracyjnego serwera. Moglibymy
zrealizowa to za pomoc nastpujcego programu obsugi (wydruk 6.5).
Wydruk 6.5. Modu ViewConf.pm
*5 * *

= &
 

 :;<=;<;<<<
 



  !
"#$% &

Rozdzia 6. G Obsuga plikw

175

'? "# +4()  5 *,


"#$&%$-.& "
' "#42( 3,
 -&$-.& & !
$-. 5 >?*$&  3,>
 
6
'"# #*,
"#$& % 

-. $&
 $& !
$-. 5 >" (   +#1*$&
$D>
 :;<=;<;<<<
6
$-.    7O9 7
'? "# +"*##G"#5 ,
"#$+%-
"#$ %$-. & $& 
$-. NN>;>
---------------------------------------------------< +"*
$+
F#G 3J
$ 
---------------------------------------------------;
 
6
B

Aby uruchomi modu ,&(&0 ,", naley uy nastpujcych dyrektyw w pliku


httpd.conf:
?K  * *

= &
9 &99 9 9 &
NM  9 &.
:P -
?P  * *

= &
' 4#* ++& # EJ G,
  #2 
 #& "
 & "  
N9M  .

W ten sposb klient moe otrzyma tekstow wersj pliku konfiguracyjnego serwera, przykadowo httpd.conf, dajc adresu URI http://localhost/conf/httpd.conf. Pod zawartoci pliku raportowany jest jeszcze rozmiar pliku na dysku serwera i liczba wysanych bajtw. Te dwie
liczby mog si rni, na przykad w systemie Win32, z powodu uycia rnych sekwencji
nowego wiersza.

176

Cz II G Interfejs API moduu mod_perl

6.4. Wczytywanie zawartoci plikw do zmiennych


Chcemy przechowywa zawarto caego pliku w zmiennej, aby mc na niej operowa.

Rozwizanie
Uyjemy perlowego idiomu

1%2, aby wessa (slurp) cay plik, ale naley przy tym zachowa ostrono!
"#$& % 

-. $& "


"#$&% ! $9N$& .6

Komentarz
Lokalizacja specjalnej zmiennej %2 jest to perlowy idiom, sucy do wczytywania caej zawartoci pliku do zmiennej tekstowej. Aby by wydajnym programist Perla, naley zna ten
idiom i podobne. W przypadku moduu mod_perl trzeba jednak gbiej zastanowi si nad jego znaczeniem.
Jak ju pisalimy w rozdziale 2., modu mod_perl jest tak uyteczny midzy innymi dlatego,
e interpreter Perla jest wbudowany w serwer Apache. Ma to wiele zalet, jak na przykad zmniejszenie nakadu czasowego za kadym uruchomieniem skryptu rodowiska $ )/.
Jedn z najwikszych wad takiego rozwizania jest jednak fakt, e pami, ktrej uywa interpreter Perla, nie jest zwracana do systemu operacyjnego, dopki nie zakoczy si dziaanie
odpowiedniego procesu potomnego httpd. Oznacza to, e jeeli jaki beztroski program obsugi
postanowi wczyta 10-megabajtowy plik do zmiennej, to pami, ktrej zmuszony bdzie
uy interpreter Perla, nie zostanie zwolniona dopki nie zostanie zakoczony proces potomny serwera Apache.
Generalnie naley wic unika operowania na zawartoci caych plikw jako zmiennych i stara si zrealizowa podan funkcjonalno inaczej. Zdarzaj si jednak sytuacje, kiedy nie
istnieje inna moliwo, jak w przypadku pobierania caych plikw z bazy danych (jak w zadaniu 3.11) albo gdy uywamy klasy 
)/ (ktra zapisuje wygenerowan zawarto w zmiennej). Jeeli koniecznie potrzebujemy takiej funkcjonalnoci w naszej aplikacji,
powinnimy upewni si, e stosujemy odpowiedni mechanizm utrzymywania rozmiarw
procesw potomnych w ryzach, na przykad  3 ' ).

6.5. Pobieranie informacji o danym pliku


Chcemy uy funkcji  na danym pliku albo przeprowadzi testy.

Rozdzia 6. G Obsuga plikw

177

Rozwizanie
Uyjemy metody %/" ", aby przeprowadzi testy i zastpi wywoania funkcji ))
bezporednio funkcj %/"
'.
Wydruk 6.6. Modu XBitHack.pm
*5 * *

QRP*
 

 ; ML;?L M;:


 


 :LQ:<:LQS<?

  !
'L"" 3"# #*#4>QRP*&> 5"?OP ,
"#$% &
 ; ML; 
-&$-.& & TT'* 3
$-.  #7O9 "7TT'3 *" "PKM
$-.   T?L M;:'  34UL  
': +"#2+#*3#* # # G035 5#,
"#$" %V@W
'F#* # 01 G0""# +1   ,
 ; ML; $" T:LQ:<
'"# 5GJ*M-K & 23(*3#* # # 5#,
$-." & VXW&$" T:LQS<?
' "#42(" G"   +3"4()  ",
$-.  78- 7
 
6
B

Komentarz
Jak ju wiemy, metoda %/"
' zwraca nazw fizycznego pliku dla dania, ktrej
mona uy w rozmaitych operacjach testowych na pliku czy w funkcji )). Jednak metoda
%/" " stanowi efektywniejszy sposb uzyskiwania tej samej informacji i oszczdza czas
przy wielu wywoaniach funkcji )), ktra zuywa duo zasobw systemu. Uycie jej dowodzi przy okazji, e posiedlimy biego w posugiwaniu si zaawansowanymi elementami
moduu mod_perl.

178

Cz II G Interfejs API moduu mod_perl

Kiedy serwer Apache zmapuje dany adres URI na plik fizyczny, wywouje funkcj ))
dla wasnych potrzeb i gromadzi informacj w polu " " rekordu dania. Kiedy wywoywana jest metoda %/" ", modu mod_perl wydobywa t informacj z rekordu dania,
wewntrznie wypenia specjalny perlowy uchwyt pliku  i zwraca go. Poniewa uchwyt 
uywany jest do buforowania informacji dla przyszych wywoa funkcji )), programici
moduu mod_perl mog unikn straty czasu, jaka zazwyczaj towarzyszy sprawdzaniu, czy
plik istnieje, pobieraniu czasu ostatniej modyfikacji i tym podobnym.
Program obsugi ,&(&-4 )5& (wydruk 6.6) stanowi implementacj dyrektywy -4 
)5& z moduu mod_include. Standardowo dyrektywa ta pozwala administratorowi serwera
Apache wskaza, ktre pliki s przetwarzane przez mechanizm SSI (Server Side Include engine
serwerowy mechanizm wczania plikw) w oparciu o uprawnienia dostpu do pliku i dyrektyw ) . Aby zaimplementowa ca funkcjonalno dyrektywy -4 )5&1"

przy
minimum wysiku, czynimy uytek z drg na skrty, ktre zapewnia modu mod_perl i tym
podobnych sztuczek.
Pierwszym z wywoa funkcji opartych o )) jest operator testu pliku ", ktry sprawdza,
czy plik istnieje i jest zwykym plikiem. Poniewa parametrem tego operatora jest %/
" ", obchodzimy w ten sposb wywoanie systemowej funkcji )), uywajc informacji przygotowanej przez serwer Apache. Pozostae wywoania )) uywaj uchwytu ,
wieo zainicjalizowanego przez %/" ", dziki czemu korzystamy z wewntrznego bufora interpretera Perla i oszczdzamy na wywoaniach metody %/" ".
Poniewa oryginalna dyrektywa -4 )5& rozrnia uprawnienia dla waciciela i grupy, operator testu 6 nie przyda si nam, jeeli chcemy zachowa z ni zgodno. Porwnujemy wic
uprawnienia do pliku, zwrcone przez funkcj )), z odpowiednimi staymi, zaimportowanymi
z pakietu )
, aby wyizolowa uprawnienie do wykonywania pliku przez waciciela i grup.
W naszym programie obsugi pozostaje ju tylko sprawdzi warto dyrektywy ) ,
ustawi nagwek )#! " ! i upewni si, e modu mod_include zajmie si faz generowania zawartoci. Aby sprawdzi ustawienie dyrektywy ) , uywamy operatora koniunkcji bitowej 7 na wartoci zwrconej przez metod %/

)  i jeszcze jednej


staej z moduu ,)). Metody tej uywa si bardzo rzadko w programach moduu mod_perl, ale przydaje si w sytuacjach, takich jak ta, kiedy chcemy wymusi ustawienia
pliku .htaccess. Uycie metody )
)'! " ! jest dokadniej opisane w nastpnym zadaniu, a uycie %/!
/ w podrozdziale 14.1.
Modu ,&(&-4 )5&, uyty jako program obsugi typu ./
 6 5!
/, ma identyczn
funkcjonalno, jak modu mod_include, z jednym istotnym wyjtkiem. W systemach Win32
nie istnieje rozrnienie midzy uprawnieniami do pliku dla waciciela i grupy, wic modu
mod_include stosuje specjaln obsug dla tej platformy (i kilku innych). Sprawdza wtedy po
prostu tylko, czy uytkownik moe wykonywa dany plik i zawsze ustawia nagwek )
#! " !. Chocia wydaje si to rozsdnym rozwizaniem, nie rozwizuje jeszcze problemu
uytkownikw Windows, gdy system ten uwaa za pliki wykonywalne tylko te, ktre maj
odpowiednie rozszerzenie, jak .exe czy .bat. Tak wic, chyba e uywamy SSI do przetwarzania dokumentw o nazwie typu index.exe, dyrektywa -4 )5& staje si bezuyteczna na platformie Win32 mimo najlepszych intencji moduu mod_include.

Rozdzia 6. G Obsuga plikw

179

Poniej (wydruk 6.7) prezentujemy alternatyw dla implementacji dyrektywy -4 )5& z moduu mod_include w wersji dostosowanej do specyfiki systemu Win32.
Wydruk 6.7. Modu WinBitHack.pm
*5 * *

F RP*
 

 ; ML;?L M;:


 


F Y@

<;MZ< PL=;

  !
'L"" 3"# #*#4>QRP*&> 5"?OP 2
'3 #"F Y@,
"#$% &
 ; ML; 
-&$-.& & TT'* 3
$-.  #7O9 "7TT'3 *" "PKM
$-.   T?L M;:'  34UL  
'? "###*,
"#$
F Y@



S$-.& "2$
'I"#G); ML;23(*" ##< PL=;,
 ; ML;&$T< PL=;
'"# 5GJ*M-K & 23( 3 ##<;MZ,
$-." & VXW $T<;MZ
' "#42(" G"   +3"4()  ",
$-.  78- 7
 
6
B

Zamiast uy uprawnie do pliku, modu ,&(&* 4 )5& sprawdza atrybuty ,50


(gotowy do archiwizacji) i   (tylko do odczytu) przy uyciu pakietu * 89
, dostpnego w dystrybucji libwin32 w archiwum CPAN. Jeeli atrybut ,50 nie jest ustawiony,
nasz program obsugi przekazuje go moduowi mod_include do przetworzenia. Poniewa atrybut ,50 trzeba usun z utworzonego pliku celowo, schemat dziaania dyrektywy -4 )5&
pozostaje bez zmian. Nasza nowa implementacja ustawia take nagwek )#! " !, ale
tylko, gdy nie jest ustawiony atrybut   jeeli plik nie moe by zmodyfikowany, nie
kopoczemy si ustawianiem nagwka.
W zalenoci od wersji systemu operacyjnego moe by wiele sposobw przeczania atrybutw pliku, ale najbardziej uniwersalne jest uycie programu  4 z wiersza polece:

[ [  .


180

Cz II G Interfejs API moduu mod_perl

6.6. Nagwki warunkowe


Chcemy waciwie posugiwa si nagwkami warunkowymi, na przykad wysya w odpowiedzi nagwek 

, czy sprawdza nagwek dania  

  .

Rozwizanie
Uyjemy metod dodanych do klasy  przez klas 
, jak )
)'! " !
czy ')! )  (spenia warunek).
Wydruk 6.8. Modu SendSmart.pm
*5 * *

: :"
 

 
 




KK5
L



  !
'F##G"#*#+ #+   " 5GJ*"#* 2* #
'*   )34,
"#$% &
' 

-.  (

KK5 +3$& -.*,


"#$& %L

-. $-.& "


  $& 
'>K5+ >"##KLK;,
$-.  #

KK5-. -. *#&  $& 


'"# 5GJ*M-K &   +" #&*3*,,,
$-." & $-.& & VXW
',,, + 5GJ*;5  -M 5 ,
$-.5
$-.   5 
'/(+#* *+ 5GJ*JL&-\)G  2##G"# 5GJ*,
'F+ #"++"#  ,
&"#$%$-."  %%!
$-.    
6
!
 $
6

Rozdzia 6. G Obsuga plikw

181

'"#*E **  +)*##G"#+ 01,


*$& 2A2A
$-. & $& 
 
6
B

Komentarz
W zadaniu 3.10 pokazalimy, jak, uywajc metody , ograniczy nadgorliwo
przegldarki klienta w buforowaniu ogldanych dokumentw, teraz zobaczymy, jak przekona
przegldark do uycia lokalnej kopii dokumentu, kiedy tylko to moliwe. W tym celu bdziemy sprawdza i ustawia zestaw odpowiednich nagwkw.
Czci specyfikacji protokou HTTP/1.1 jest pojcie warunkowego dania GET (conditional
GET request), czyli dania przy uyciu metody : opartego na dodatkowej informacji, zawartej w nagwkach dania i odpowiedzi. Nowoczesne przegldarki zapamituj odpowiedzi
serwera, jak rwnie dodatkowe informacje o daniu, w pamici podrcznej. Informacje te s
wysyane z nastpnymi daniami w celu ograniczenia przesyu danych.
Obsuga da, ktre mog wygenerowa odpowied, jest skomplikowana: samo przeczytanie
opisu nagwkw z rodziny "; w dokumencie RFC 2616 moe przyprawi o bl gowy. Na
szczcie interfejs API serwera Apache dostarcza kilku metod, ktre zajmuj si analiz
i ustawianiem nagwkw warunkowych. Kod tych metod, jak rwnie wyjanienia, pomocne
w rozszyfrowaniu specyfikacji HTTP/1.1, znajduj si w pliku http_protocol.c w dystrybucji kodu rdowego serwera Apache. Jak zwykle, moemy dosta si do tych metod dziki
moduowi mod_perl, w tym przypadku za porednictwem klasy 
.
Tabela 6.2 przedstawia metody dostpne przez obiekt dania. Inaczej ni do pozostaych metody klasy , dostp do tych jest moliwy dopiero po uyciu instrukcji 1
.
Dla dokumentw statycznych odpowiednimi nagwkami warunkowymi dania i odpowiedzi
zajmuje si domylny program obsugi serwera Apache. Przetwarzanie ich przez aplikacje generujce dynamiczn zawarto wymaga troch wicej wysiku ni po prostu wywoywanie
wyej wymienionych metod. Naley najpierw zadecydowa, co ma wpyw na zawarto, ktr
generujemy: dane rdowe, ich zmiany czy te inne czynniki, ktre mog by subtelne, ale
wane.
Modu ,&(& ! '/) (wydruk 6.8) pokazuje, jak w prostym programie obsugi zawartoci uy metod obsugujcych nagwki warunkowe. Po pobraniu danych z danego zasobu
statycznego przy uyciu metody %/"
' ustawiamy odpowiednie nagwki odpowiedzi i obiektu. Wywoanie metody ')! )  powoduje uycie interfejsu API serwera
Apache, aby zdecydowa, czy wiea zawarto powinna zosta wygenerowana na podstawie
nagwkw )$, "#), "'! " ! , "#), "#! " !  i $

182

Cz II G Interfejs API moduu mod_perl

Tabela 6.2. Metody dodane do klasy Apache przez klas Apache::File

Metoda
  #

Opis
Usuwa ciao komunikatu z nadchodzcego dania.

 # 5

Zwraca pozycje pocztkowe i dugoci kadego fragmentu


wyspecyfikowanego w daniu.

"  

Sprawdza, czy spenione s warunki z nagwkw L&-\. Jeeli zwrci ,


zawarto powinna zosta wysana do klienta.

""

Umoliwia dostp do czasu ostatniej modyfikacji danego zasobu,


przechowywanego w rekordzie dania serwera Apache.

# 5

Zwraca warto prawda, jeeli danie dotyczy fragmentw pliku.

   5 

Ustawia nagwek  -M 5 na wskazan warto albo na dugo


danego pliku (jeeli jest dostpna).

5

Generuje i ustawia nagwek ;5.

" & 

Ustawia nagwek M-K & na czas ostatniej modyfikacji danego


pliku, opcjonalnie wywoujc metod  ""z podan wartoci.

 "

Ustawia czas ostatniej modyfikacji danego pliku w rekordzie dania


tylko, kiedy nowo ustawiany czas jest pniejszy od dotychczasowego.

dania. Metoda ')! )  zwraca warto <, jeeli z analizy nagwkw i innych
informacji, ktre dostarczylimy na temat zasobu, jak na przykad czas ostatniej modyfikacji,
wynika, e naley wysa klientowi aktualn wersj zawartoci. Jeeli zwrcona warto jest
rna od <, powinna zosta przekazana do serwera Apache, aby mg podj odpowiedni
reakcj, na przykad wysa odpowied 8=>1)1#! " ! (zasb niezmieniony).
Mona by pomyle, e ustawianie nagwkw odpowiedzi przed wywoaniem metody '
)! )  to strata czasu. Jednak metoda ta uywa nagwka )#! " ! w swoich
porwnaniach, a ponadto niektre nagwki mona zwraca take z odpowiedzi 8=>1)1#
! " !, na przykad )$, )#! " !, <
? i inne.
Chocia wikszo metod w tabeli 6.2 moe by uywana przy wysyaniu zarwno dynamicznej, jak i statycznej zawartoci, metody ))$ powinno si uywa tylko przy wysyaniu
niezmienionych, statycznych plikw, poniewa obliczenie nagwka )$ jest bardzo kosztowne, gdy musi by zagwarantowana jego unikalno dla danego zasobu w danym stanie; nie
jest dopuszczalne, aby jakiekolwiek dwie wersje zasobu mogy mie ten sam nagwek )$.
Warto rwnie omwi osobno metod !)') '. Wpywa ona bezporednio na czas
ostatniej modyfikacji, ktry zostanie wysany w nagwku )#! " ! odpowiedzi, jeeli
uyjemy metody )
)'! " !. Metod !)') ' moemy wywoywa dowoln
ilo razy nagwek )#! " ! bdzie mia w rezultacie warto najpniejsz z tych,
ktre bdziemy prbowali ustawi, co uatwia wyraanie skomplikowanych warunkw logicznych dotyczcych dat w naszym kodzie. Dobr ilustracj tej cechy stanowi zadania 6.7 i 8.2.
Poniszy wynik dziaania metody %/)/ $ pokazuje komunikacj midzy klientem
a serwerem dla wczeniejszego przykadu (wydruk 6.8). Pierwszy zestaw nagwkw reprezentuje danie zasobu, ktrego przegldarka klienta jeszcze nie posiada w pamici podrcznej, a drugi powtrne danie tego samego zasobu.

Rozdzia 6. G Obsuga plikw

183

 

 !" "#$" % $" & "$"  & "$"  "$''
 ( ) !)*++,-$'$#+
  *
 "!".
 / "" ! $
#
(* * !0 1
*)!    *
2) " !3*.45678
* )9,:2;
P?9B,A@AA
M-K &
 2BCK#@AABB]
BC
^_SK
;5
>_]@-B]-YA^B`>
 -M 5 
YX^

 
 -#
O9 "
 

 !" "#$" % $" & "$"  & "$"  "$''
 ( ) !)*++,-$'$#+
  *
 "!".
 / "" ! $
#
(* * !0 1
*)!    *
#3*
#
  !$53<+!5!4=3: ">6-4
2) " !3*.45678
* )9,:2;
P?9B,AYA^ K &
M-K &
 2BCK#@AABB]
BC
^_SK
;5
>_]@-B]-YA^B`>
 -M 5 
YX^

 

6.7. dania fragmentw plikw


Chcemy obsugiwa dania fragmentw plikw, wymaganych na przykad przez moduy rozszerzajce przegldarki do obsugi dokumentw w formacie PDF.

Rozwizanie
Uyjemy metod )()/$ i ()/$, dodanych przez klas

.
Wydruk 6.9. Modu SendAnyDoc.pm
*5 * *

:  # 
 

 
 



184

Cz II G Interfejs API moduu mod_perl


RL
R


KLK;

##&&O
"

?

  !
"#$% &
"#$%$-.  &57R:;<7
"#$%$-.  &57R?::7
"#$ %$-.  &57R:;7
' +#"# *"

? JE 3,


"#$"% "
"#$  %RL-. $ 2$2$2
!<; %.B2 ""%.B2? ; %.B6aa $RL


'I 3 3"# +4#* * 3 & "30(,
'?+#*G # <L
 99  9:  # 9 9&, &
"#$2$& "%$-.  & %b"D9,\9,\D
' +#"#+# 2*J++ 01*+  3" #&*3
'*    +)* *2+54 "* 3&#+ 3
' +3 ( & *3",
"#$%
 " 2
" & -  7ABABBXCA727KKZZZZ7\]_^AA
& "$
  "%c

':3   JRMR,
$  -.!M 5< M 6%BA\BA@^\BA@^'BAK
"#$ %$  -.$
$ -.O$& "
"#$&2$" & %$ -.&  #
$ -.&  
  $&
'L & "3"#+5) *42(*3"#()  &5" J*,
$-.   -.7-< 57%.7#7
'"##KLK;   +++  +#*,
$-.  ##&&O$& "-.VAW
'  + # 32*J#+3 3JE 3+#

'B,+  #++#  #


'@,+" #&*3*EJ G 5 " G,

Rozdzia 6. G Obsuga plikw

185

'F+# *+++#  #  "#42+3SK,


"#$*5%? S;%bD

D9D5
$-. ""$" & -$"-.+ &&
$-. ""$L !>$*5,">6VXW
$-." & 
': +"#2+#3 ()  &5" J  "  -M 5
'+ #G " 5GJ*J25 #(& *3# 5" #&*33,
'?"43"#2(   -M 5 3* + ,
$-.   5  5 $&
"#$ 5%$-.# 5
'*  ,
&"#$%$-."  %%!
$-.    
6
!
 $
6
'##G"#+ 023(  )  + ,
 &$-.   #
'++3""#4&5" "*2+# * , *" ?,
&$ 5!
 "#$ &&2$ 5 %$-. # 5!
 $&2$ &&2$ 5 
6
6
!
 $&
6
 
6
B

Komentarz
Chocia powinnimy pozwoli serwerowi Apache obsugiwa wszystkie moliwe dokumenty
statyczne, kiedy plik jest przechowywany w bazie danych, moemy nie mie innego wyjcia,
jak tylko obsuy danie wasnorcznie. W takim przypadku dodatkowy wysiek, woony
w zapewnienie waciwej obsugi rnych nagwkw protokou HTTP/1.1, pozwoli znacznie
obniy obcienie naszego cza.
Nasz przykadowy program obsugi (wydruk 6.9) stanowi bardzo zmodyfikowan wersj programu ,&(& !*/!  z zadania 3.11. W nowej wersji dodalimy kilka usprawnie na
podstawie dotychczasowych rozwiza, w tym uycie dodatkowej informacji w adresie URI,
aby okreli nazw tabeli w bazie danych i pliku, ktry chcemy z niej uzyska. Dodalimy te
moliwo inteligentnej obsugi da warunkowych w oparciu o czas modyfikacji zarwno

186

Cz II G Interfejs API moduu mod_perl

pliku w bazie danych, jak i naszego moduu oba s uywane do okrelenia, czy zawarto
jest wiea. I, aby speni obietnic zawart w tytule podrozdziau, dodalimy moliwo przesyania fragmentw pliku.
Moliwo dania jedynie wskazanych fragmentw pliku zostaa dodana przez wprowadzenie odpowiedniego zestawu nagwkw w specyfikacji protokou HTTP/1.1. Pena implementacja tych nagwkw przez klienta i serwer redukuje transfery duych plikw, kiedy
uytkownik mgby by zainteresowany jedynie niektrymi fragmentami. Chocia taka koncepcja stanowi fascynujce rozwizanie problemu zapchania przepustowoci sieci, a serwer
Apache implementuje j w peni we wbudowanym, domylnym programie obsugi zawartoci
statycznej, przegldarki klientw rzadko j wykorzystuj, z wyjtkiem da plikw PDF1.
Mechanizm pobierania fragmentw pliku, uywany aktualnie przez moduy rozszerzajce
przegldark o obsug dokumentw PDF, moe si wyda nieco dziwny na pierwszy rzut
oka, gdy wywoywanych jest kilka da, z ktrych pierwsze jest przerywane, aby wywoa
nastpne, dotyczce fragmentw. Chocia moe si to wydawa niezgodne z intuicj w przypadku projektu majcego redukowa przesyanie danych, jednak po zidentyfikowaniu zasobu
jako dokumentu PDF, pochodzcego z serwera obsugujcego dania fragmentw, przegldarka natychmiast przerywa aktualne danie, aby wywoa jedno lub kilka nastpnych z odpowiednimi nagwkami dotyczcymi fragmentw pliku.
Jak opisalimy w zadaniu 4.9, zerwanie poczenia jest natychmiast rozpoznawane przez serwer Apache, ktry z kolei zamienia wszystkie operacje pisania na operacje puste w celu zaoszczdzenia cykli procesora. dania fragmentw pliku maj zmniejsza obcienie sieci,
niekoniecznie za obcienie naszego serwera.
Jeeli to wszystko brzmi skomplikowanie, to dlatego, e jest skomplikowane. Przykadowy
dialog danie-odpowied dla programu z wydruku 6.9 mgby wyglda nastpujco:

 ?*
*)# 
#
 !" "#$" % $" & "$"  & "$"  "''
 ( ) !)*++,-$'$#+
  *
 "!".
 / "" ! $
#
(* * !0 1
*)!    *
2) " !3*.45678
* )9,:2;
P?9B,A@AA
 -M 5 
BYXC`X_
-< 5
#
M-K &
2@X/ @AABB_
A]
`XSK

 
 -#
 9 &

 ?*
*)# 
#
 !" "#$" % $" & "$"  & "$"  "''
1

Moliwo t wykorzystuj rwnie coraz popularniejsze programy, zwane menederami pobierania


(download manager). W przypadku zerwania poczenia podczas pobierania duego pliku, program
prbuje, przy ponownej inicjacji poczenia, rozpocz pobieranie od miejsca, w ktrym zostao
przerwane przyp. tum.

Rozdzia 6. G Obsuga plikw

187

 ( ) !)*++,-$'$#+


  *
 "!".
 / "" ! $
#
(* * !0 1
*)!    *
 " !% )>6-=,5<6-5,-,$6+-446-=,5$@ ).) AB
 C ) " !% )>6-=,5<6-5,-,$6+-446-=,5$@ ).) AB
2) " !3*.45678
* )9,:2;
P?9B,A@A_?  
 -M 5 
BYX@A]A
-< 5
#
M-K &
2@X/ @AABB_
A]
`XSK

 
 -#
"9O-# 5  #%YY^YX

Metody )()/$ i ()/$ stanowi klucz do dynamicznego wysyania dokumentw PDF. Obie zostaj dodane do klasy  po zaimportowaniu (przy uyciu instrukcji
) klasy 
. Pierwsza analizuje nagwki dania, a nastpnie ustawia odpowiednio nagwki ,))  i ,))$ w razie potrzeby. Poniewa warto nagwka
,))$ zaley od wielkoci zawartoci, musimy wywoa metod )))

$) przed wywoaniem metody )()/$, ktra z kolei musi zosta wywoana
przed metod !))!/ kolejno jest tu bardzo istotna. Kiedy zostanie ju
stwierdzone, e dano fragmentw pliku, wywoanie metody ()/$ zwraca list
par, zawierajcych pocztek i dugo kadego fragmentu danego przez klienta. Moemy
uy tej listy, aby pobra odpowiednie fragmenty pliku i przesa je klientowi.
W naszym przykadzie pobieralimy plik z bazy danych, ale jeeli obsugujemy dynamicznie
dania fragmentw plikw statycznych na dysku, lepszym rozwizaniem bdzie uy dwuargumentowej wersji metody !"!, omwionej w zadaniu 6.3, ni wczytywa cay plik do
pamici i dzieli na fragmenty za pomoc funkcji  ()/. Na przykad w ptli przetwarzajcej list zwrcon przez metod ()/$ w naszym programie obsugi moglibymy
wprowadzi nastpujce zmiany, aby przetwarza pliki statyczne:
&$ 5!
 "#$ &&2$ 5 %$-. # 5!
*$& 2$ &&2A
$-. & $& 2$ 5 
6
6
!
$-. & $& 
6

6.8. Nagwki zwizane z datami


Chcemy bezporednio odczytywa i zmienia warto nagwkw zwizanych z datami.

188

Cz II G Interfejs API moduu mod_perl

Rozwizanie
Uyjemy funkcji )) ' i /!), dostarczonych przez klas )
.
$-. 5-. & >5GJ*M-K &  # 
>2
 



"$-.""

Komentarz
Poniewa omawiamy teraz nagwki zwizane z datami, jest to dobre miejsce, aby szerzej
omwi dwie metody z klasy )
, o ktrych wspomnielimy tylko w rozdziale 5.
Funkcje )) ' i /!) zapewniaj wygodny sposb konwersji dat midzy formatem protokou HTTP a liczb sekund od pocztku epoki, ktr zwraca wiele funkcji perlowych. Funkcja /!) przelicza dat z formatu HTTP na odpowiedni liczb sekund od
pocztku epoki. Funkcja )) ' zamienia sekundy na dat w formacie HTTP, ktra zawsze
jest wyraana w czasie GMT.
Chocia te metody s wygodne, nie zawsze mog wykona za nas ca prac. Na przykad jeeli obliczamy liczb sekund w innej strefie czasowej ni GMT (jak na wydruku 6.9), bdziemy musieli wykona konwersj samodzielnie, uywajc moduu, takiego jak '. .

6.9. Oprnianie buforw wyjciowych


Chcemy oprni wewntrzne bufory wyjciowe serwera Apache.

Rozwizanie
Uyjemy metody /"
.
 N$& .!
'F#3"#*( #+*##G"#5  + * ,
'R + +G# "#G4*+ 0# *J,
 
$-.& 
6

Komentarz
Serwer Apache w normalnych warunkach buforuje dane wypisywane przez program obsugi,
wysyajc je do klienta dopiero, kiedy bufor jest peny albo program obsugi zakoczy dziaanie.
Mog si jednak zdarzy sytuacje, kiedy trzeba wysa dane do klienta natychmiast, na przykad

Rozdzia 6. G Obsuga plikw

189

gdy nasz program jest w trakcie jakiego relatywnie dugiego procesu i chcielibymy, aby
w tym czasie pojawio si co w przegldarce klienta. W takim przypadku moemy uy metody %//"
, aby oprni bufor. Naley jednak uywa jej z umiarem, gdy obnia
znacznie wydajno serwera.
Jako przykad a take przypomnienie kilku metod, ktre poznalimy dotychczas, rozwamy
nastpujcy program obsugi, ktry wybiera losowy obraz z katalogu ServerRoot/icons i wysya go klientowi.
Wydruk 6.10. Modu SendIcon.pm
*5 * *

: L 
 

 :;<=;<;<<<
 


P 

  !
"#$% &
'? "# G (  * 5 9+54 ":8< ,
"#$ %$-.8 87 7
"#$ %P -. $ 
 $ !
$-. 5 >" (   +#1* 5$ 
$D>
 :;<=;<;<<<
6
'? "#+ 01* 5 3"# #d +#*+ + 
'*#SL,
"#d 
&  "#$ $ -. !
"#$%$-. *>9 9$ >
 O $-.  #7"595&7
 d 2$-.& "
6
'F#"#  # +,
"#$"5%$ V d W
'"## #* +##G"#5 *  ,
"#$& % 

-. $"5
 $& !
$-. 5 >" (   +#1*$"5
$D>
 :;<=;<;<<<
6
 " $& '#"5  #"JF Y@
$-.    7"595&7

190

Cz II G Interfejs API moduu mod_perl


$-. & $& 
'J( "#& 2# ++ G#G # # ",
$-.& 
':#"3"#3*0 G5 G# ,,,
`
 
6
B

Bez wywoania metody %//"


 klient nie ujrzaby obrazu, zanim nie skoczyby si
dugotrway proces (w naszym przykadzie symulowany wywoaniem funkcji 
). Jednake, podkrelamy po raz kolejny, metoda %//"
 moe znacznie obniy wydajno
serwera, wic powinna by uywana tylko w razie potrzeby.

6.10. Przekierowanie uchwytw


plikw wyjciowych
Chcemy zmieni domylne przypisanie strumieni wyjciowych  i .

Rozwizanie
Uyjemy interfejsu 5 , pochodzcego z klasy  lub innej, aby zmieni zachowanie uchwytw plikw.
Wydruk 6.11. Przykadowy program obsugi
 

 :;<=;<;<<<


?

  !
"#$% &
 :;<=;<;<<<  >9">
$-.    7O9 7
'?+* 3"#"H:;<< +5) ** ,
'F  J*("4G* " *3+"?,
\:;<<27 7

Rozdzia 6. G Obsuga plikw

191

"#$&%

?-. >&, , 5>25%.`


$&-. 5 > #" >
$&-. #
$&-. >9 ?9" 9#-" 9 9>
$&-.5>" -B,@_,,5+>
$&-.
':"H:;<<  *  #  + *G4 J,
 \:;<<
 
6

Komentarz
Mechanizm )  to zdradzieckie narzdzie, ktre moe zosta uyte do zmiany zachowania
wielu perlowych typw danych. W zadaniu 2.17 widzielimy, jak mona dowiza (tie) map
do klasy  65, aby zachowa kolejno wstawiania elementw i umoliwi powtarzanie si kluczy normalnie mapa nie dopuszcza takiej funkcjonalnoci. Tak samo atwo moemy za pomoc instrukcji )  zmusi uchwyty plikw  i  do wykonania naszych diabelskich sztuczek.
Modu mod_perl podcza strumienie  i  do przegldarki klienta, uywajc interfejsu 5  z klasy , natomiast  jest kierowany do pliku wskazanego przez
warto ///
$ w rekordzie serwera. Chocia nie ma duego sensu przekierowywanie
strumienia , to samo w przypadku strumieni wyjciowych moe przynie nieoczekiwane korzyci w rkach cudotwrcw, magikw, guru i tym podobnych. Moemy poczu smaczek tej magii, kiedy uywamy klasy 
)/ do czenia wyniku dziaania kilku
perlowych programw obsugi w serwerze Apache 1.3 filtrowanie danych wyjciowych
jest po prostu niemoliwe przy uyciu istniejcego interfejsu API jzyka C. Programy obsugi
moduu mod_perl mog omin to ograniczenie, uywajc przekierowanych uchwytw plikw i paru innych, bardzo pomysowych rozwiza, aby osign imponujce rezultaty.
W zadaniu 15.4 mamy przykad, jak uywa klasy 
)/.
Jeeli interesuje nas przekierowanie strumienia  zamiast , moemy go dowiza
do klasy, takiej jak  )/ $,  
/ (z dystrybucji )/ $) lub naszego wasnego
interfejsu 5 . Naley tylko pamita, aby zwrci strumie  do serwera Apache,
kiedy skoczymy. Oto bardzo prosty przykad.
Wydruk 6.12. Przekierowanie strumienia STDOUT
 

 
L

:

  !
"#$% &

192

Cz II G Interfejs API moduu mod_perl


"#$ 5
$-.    7O9 7
 >/++  )+ #,,,[ >
\:27Le

:72[$ 5
 >?+"# +" 3[$ 5>
\:27 7
 >?   )+ #
$ 5[ >
 
6

Aby nasz program zachowywa si grzecznie i przewidywalnie, nie powinnimy zakada, e


strumie  jest dowizany do klasy . Waciwe rozwizanie polega na zapamitaniu
klasy, do ktrej strumie by dowizany i odtworzenie go, kiedy skoczymy ju nasze czary.
"#$  %& \:
'--* ,,,
\:2$  

You might also like