mod_perl. Podręcznik programisty
Upcoming SlideShare
Loading in...5
×
 

mod_perl. Podręcznik programisty

on

  • 1,027 views

Być może Perl jest najlepszym językiem służącym do pisania skryptów CGI, ale skrypty CGI nie są najlepszym sposobem tworzenia aplikacji internetowych. Potrzeba większej wydajności, lepszej ...

Być może Perl jest najlepszym językiem służącym do pisania skryptów CGI, ale skrypty CGI nie są najlepszym sposobem tworzenia aplikacji internetowych. Potrzeba większej wydajności, lepszej integracji z serwerem WWW i pełniejszego wykorzystania jego możliwości doprowadziła do stworzenia modułu mod_perl. Pozwala on na pisanie modułów serwera Apache w Perlu i na pełny dostęp do funkcji API Apache"a z poziomu Perla.

mod_perl jest bardzo rozbudowany, dzięki czemu daje programiście ogromne możliwości. Książka "mod_perl. Podręcznik programisty" będzie nieocenioną pomocą w poznawaniu jego potencjału. Nauczysz się z niej podstaw mod_perla, a gdy już je opanujesz, poznasz tajniki pisania dużych i skomplikowanych aplikacji.

W książce opisano między innymi:

* Instalację i konfigurację mod_perla
* Komunikację mod_perla z Apache
* Działania na adresach URL
* Obsługę plików w środowisku mod_perla
* Tworzenie własnych aplikacji w oparciu o mod_perla
* Osiągania maksymalnej wydajności aplikacji używających mod_perla
* Dodatkowe moduły współpracujące z mod_perlem

Po przeczytaniu tej książki uzyskasz nową perspektywę na programowanie aplikacji sieciowych w Perlu. Programiści Slashdot.org, Internet Movie Database i Wired wybrali mod_perl jako platformę do tworzenia aplikacji. Może i Ty powinieneś pójść w ich ślady?

Statistics

Views

Total Views
1,027
Views on SlideShare
1,027
Embed Views
0

Actions

Likes
0
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

mod_perl. Podręcznik programisty mod_perl. Podręcznik programisty Document Transcript

  • IDZ DO PRZYK£ADOWY ROZDZIA£ SPIS TRE CI mod_perl. Podrêcznik programisty KATALOG KSI¥¯EK Autorzy: Geoffrey Young, Paul Lindner, Randy Kobes T³umaczenie: Przemys³aw Kowalczyk KATALOG ONLINE ISBN: 83-7197-799-9 Tytu³ orygina³u: mod_perl Developer's Cookbook ZAMÓW DRUKOWANY KATALOG Format: B5, stron: 564 Przyk³ady na ftp: 105 kB TWÓJ KOSZYK DODAJ DO KOSZYKA Byæ mo¿e Perl jest najlepszym jêzykiem s³u¿¹cym do pisania skryptów CGI, ale skrypty CGI nie s¹ najlepszym sposobem tworzenia aplikacji internetowych. Potrzeba wiêkszej wydajno ci, lepszej integracji z serwerem WWW i pe³niejszego wykorzystania jego CENNIK I INFORMACJE mo¿liwo ci doprowadzi³a do stworzenia modu³u mod_perl. Pozwala on na pisanie modu³ów serwera Apache w Perlu i na pe³ny dostêp do funkcji API Apache'a z poziomu ZAMÓW INFORMACJE Perla. O NOWO CIACH mod_perl jest bardzo rozbudowany, dziêki czemu daje programi cie ogromne mo¿liwo ci. Ksi¹¿ka „mod_perl. Kompendium programisty” bêdzie nieocenion¹ pomoc¹ ZAMÓW CENNIK w poznawaniu jego potencja³u. Nauczysz siê z niej podstaw mod_perla, a gdy ju¿ je opanujesz, poznasz tajniki pisania du¿ych i skomplikowanych aplikacji. W ksi¹¿ce opisano miêdzy innymi: CZYTELNIA • Instalacjê i konfiguracjê mod_perla FRAGMENTY KSI¥¯EK ONLINE • Komunikacjê mod_perla z Apache • Dzia³ania na adresach URL • Obs³ugê plików w rodowisku mod_perla • Tworzenie w³asnych aplikacji w oparciu o mod_perla • Osi¹gania maksymalnej wydajno ci aplikacji u¿ywaj¹cych mod_perla • Dodatkowe modu³y wspó³pracuj¹ce z mod_perlem Po przeczytaniu tej ksi¹¿ki uzyskasz now¹ perspektywê na programowanie aplikacji sieciowych w Perlu. Programi ci Slashdot.org, Internet Movie Database i Wired wybrali mod_perl jako platformê do tworzenia aplikacji. Mo¿e i Ty powiniene pój æ w ich lady? Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl
  • Spis treści Podziękowania.................................................................................................................................................9 O Autorach .....................................................................................................................................................12 Przedmowa...................................................................................................................................................... 13 Wprowadzenie............................................................................................................................................... 15 Część I Instalacja i konfiguracja................................................................................. 19 Rozdział 1. Instalacja modułu 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 modułu mod_perl jako biblioteki dzielonej............................................37 1.8. Testowanie instalacji ..................................................................................................38 1.9. Zmiana katalogów instalacji serwera Apache............................................................39 1.10. Dodawanie modułu mod_perl do działającego serwera Apache .............................40 1.11. Ponowne u ycie opcji kompilacji ............................................................................40 1.12. Odtwarzanie instalacji modułu mod_perl ................................................................41 1.13. Instalacja modułu mod_perl na wielu komputerach ................................................42 1.14. Sprawdzanie istniejącego serwera............................................................................45 1.15. Instalacja modułów serwera Apache z archiwum CPAN ........................................46 1.16. Śledzenie rozwoju modułu mod_perl.......................................................................47 1.17. Więcej ni dostęp przez CVS...................................................................................48 1.18. Kompilacja modułu mod_perl przy u yciu innej wersji Perla.................................50
  • 4 mod_perl. Kompendium programisty Rozdział 2. Konfigurowanie modułu mod_perl .......................................................................................................53 Wprowadzenie...................................................................................................................53 2.1. Przenoszenie skryptów 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 skryptów 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. Zarządzanie własnymi bibliotekami.........................................................................67 2.11. Trwałe połączenia z bazą danych.............................................................................69 2.12. Wcześniejsze nawiązywanie połączeń .....................................................................70 2.13. Nietrwałe połączenia do bazy danych w środowisku Apache::DBI ........................72 2.14. Ustawianie zmiennych specyficznych dla modułu mod_perl ..................................73 2.15. Ustawianie bardziej skomplikowanych zmiennych .................................................74 2.16. Dynamiczna konfiguracja serwera Apache..............................................................75 2.17. Zachowywanie kolejności w sekcjach <Perl> .........................................................77 2.18. U ywanie opcji w wierszu poleceń..........................................................................78 2.19. Uruchamianie podwójnego serwera .........................................................................79 2.20. U ywanie modułu mod_proxy do przekazywania ądań do serwera Apache z modułem mod_perl ................................................................80 2.21. U ywanie modułu mod_proxy_add_forward...........................................................80 Część II Interfejs API modułu mod_perl..................................................................83 Rozdział 3. Obiekt ądania ..............................................................................................................................................87 Wprowadzenie...................................................................................................................87 3.1. Obiekt ądania............................................................................................................87 3.2. Komunikat ądania HTTP..........................................................................................89 3.3. ądanie klienta ...........................................................................................................91 3.4. Dostęp do nagłówków ądania...................................................................................92 3.5. Dostęp do pól formularzy HTML ..............................................................................95 3.6. Dane wysłane metodą POST......................................................................................97 3.7. Obsługa cookies .........................................................................................................98 3.8. Obsługa plików wysyłanych na serwer....................................................................100 3.9. Ustawianie nagłówków odpowiedzi serwera ...........................................................103 3.10. Sterowanie pamięcią podręczną .............................................................................105 3.11. Wysyłanie nagłówków odpowiedzi serwera ..........................................................106 3.12. Ustawianie statusu odpowiedzi ..............................................................................108 3.13. Ustawianie nagłówków w przypadku błędu...........................................................111 3.14. Nagłówki o wielu wartościach ...............................................................................113 3.15. ądania wewnętrzne...............................................................................................115 3.16. Ustawianie nagłówków ądania wewnętrznego.....................................................117 3.17. Rozpoznawanie ądań wewnętrznych....................................................................118 3.18. Metoda HTTP ądania ...........................................................................................118 3.19. Dostęp do obiektu ądania z podprogramu XS......................................................120
  • Spis treści 5 Rozdział 4. Komunikacja z serwerem Apache....................................................................................................... 127 Wprowadzenie.................................................................................................................127 4.1. Obiekt Apache::Server .............................................................................................127 4.2. Symulowanie dyrektyw IfModule i IfDefine ...........................................................130 4.3. Dostęp do dyrektyw ServerRoot i DocumentRoot...................................................132 4.4. Zapis do dziennika błędów.......................................................................................134 4.5. Dostęp do dyrektywy ErrorLog................................................................................136 4.6. Wartość LogLevel ....................................................................................................138 4.7. Obiekt Apache::Connection .....................................................................................140 4.8. Zdalne adresy IP i nazwy serwerów.........................................................................141 4.9. Wykrywanie zerwania połączenia............................................................................143 4.10. Zamykanie procesu potomnego serwera Apache...................................................145 Rozdział 5. Przetwarzanie adresów URI................................................................................................................. 149 Wprowadzenie.................................................................................................................149 5.1. ądany adres URI.....................................................................................................150 5.2. Określanie dyrektywy <Location> dla adresu URI .................................................152 5.3. Zmiana ądanego adresu URI ..................................................................................155 5.4. Konstruowanie nowego adresu URI ........................................................................157 5.5. Kodowanie znaków specjalnych w adresie URI ......................................................159 5.6. Wymuszenie typu MIME za pomocą adresu URI ...................................................161 5.7. Pobieranie zawartości ądania wewnętrznego .........................................................162 5.8. U ycie klasy Apache::Util poza środowiskiem modułu mod_perl..........................166 Rozdział 6. Obsługa plików .......................................................................................................................................... 169 Wprowadzenie.................................................................................................................169 6.1. Tworzenie uchwytów plików ...................................................................................170 6.2. Tworzenie plików tymczasowych............................................................................172 6.3. Wysyłanie całego pliku ............................................................................................173 6.4. Wczytywanie zawartości plików do zmiennych ......................................................176 6.5. Pobieranie informacji o ądanym pliku ...................................................................176 6.6. Nagłówki warunkowe ..............................................................................................180 6.7. ądania fragmentów plików.....................................................................................183 6.8. Nagłówki związane z datami....................................................................................187 6.9. Opró nianie buforów wyjściowych .........................................................................188 6.10. Przekierowanie uchwytów plików wyjściowych ...................................................190 Rozdział 7. Tworzenie programów obsługi..............................................................................................................193 Wprowadzenie.................................................................................................................193 7.1. Tworzenie programu obsługi ...................................................................................194 7.2. Konfiguracja programów obsługi.............................................................................197 7.3. Dodawanie niewielkich programów obsługi............................................................199 7.4. Przygotowanie modułu do publikacji.......................................................................201 7.5. Tworzenie archiwum programu TAR ......................................................................202 7.6. Tworzenie binarnej dystrybucji PPM.......................................................................204 7.7. Testowanie modułu ..................................................................................................207 7.8. Własne dyrektywy konfiguracyjne...........................................................................214 7.9. Rozszerzanie prototypów własnych dyrektyw.........................................................223 7.10. Łączenie własnych dyrektyw .................................................................................225 7.11. Zastępowanie dyrektyw rdzeniowych....................................................................231 7.12. Dodawanie znaczników serwera ............................................................................236 7.13. Publikowanie modułu w archiwum CPAN ............................................................237
  • 6 mod_perl. Kompendium programisty Rozdział 8. Współpraca z programami obsługi ..................................................................................................... 239 Wprowadzenie.................................................................................................................239 8.1. Wykrywanie zmian programów obsługi ..................................................................239 8.2. Dzielenie danych wewnątrz procesu potomnego .....................................................241 8.3. Tworzenie dzielonego bufora...................................................................................244 8.4. Zachowywanie stanu ................................................................................................247 8.5. Wewnętrzne przekierowania ....................................................................................251 8.6. Tworzenie własnych stron o błędach .......................................................................254 8.7. Przywracanie domyślnych stron o błędach ..............................................................257 8.8. Łańcuchy programów obsługi..................................................................................259 8.9. Łańcuchy programów obsługi w języku C...............................................................261 8.10. Dostęp do zmiennych środowiskowych.................................................................264 8.11. Dzielenie danych między fazami ...........................................................................265 8.12. Określanie aktualnej fazy ądania..........................................................................268 8.13. Dane konfiguracyjne modułu Perla........................................................................269 8.14. Dane konfiguracyjne modułu języka C..................................................................270 Rozdział 9. Dostrajanie serwera Apache i modułu mod_perl ......................................................................... 275 Wprowadzenie.................................................................................................................275 9.1. Zbieranie podstawowych informacji o serwerze......................................................277 9.2. Tworzenie raportu zu ycia pamięci .........................................................................281 9.3. Zu ycie pamięci przez procesy serwera Apache......................................................283 9.4. Bardziej szczegółowe informacje o zu yciu pamięci przez procesy serwera..........284 9.5. Zu ycie pamięci przez moduły Perla .......................................................................286 9.6. Redukcja narzutu przy imporcie modułów ..............................................................288 9.7. Zmniejszanie całkowitego zu ycia pamięci.............................................................289 9.8. Zwiększanie obszaru pamięci dzielonej...................................................................291 9.9. Regulacja liczby procesów potomnych....................................................................293 9.10. Ograniczanie wzrostu zu ycia pamięci przez procesy...........................................294 9.11. Zamykanie niekontrolowanych procesów..............................................................296 9.12. Profilowanie programów obsługi ...........................................................................298 9.13. Znajdowanie wąskich gardeł wydajności...............................................................299 9.14. Dostrajanie wydajności serwera.............................................................................301 9.15. Serwer Apache jako serwer proxy .........................................................................305 9.16. U ywanie programu uruchomieniowego Perla z modułem mod_perl...................308 9.17. Wyszukiwanie błędów w skryptach Apache::Registry..........................................310 9.18. Redukcja narzutu uruchomieniowego....................................................................311 9.19. Wyszukiwanie błędów przy naruszeniach segmentacji .........................................313 Rozdział 10. Programowanie obiektowe przy u yciu modułu mod_perl......................................................315 Wprowadzenie.................................................................................................................315 10.1. Tworzenie klas i obiektów .....................................................................................316 10.2. Dziedziczenie metod ..............................................................................................318 10.3. Tworzenie obiektowych programów obsługi.........................................................321 10.4. U ywanie obiektowych programów obsługi..........................................................323 10.5. Dziedziczenie po klasie Apache.............................................................................326 10.6. Dziedziczenie po klasie Apache przy u yciu modułów XS...................................328 10.7. Dziedziczenie po klasie Apache::Registry.............................................................330 10.8. Dziedziczenie po klasie Apache::Request..............................................................333
  • Spis treści 7 Część III Oprogramowywanie cyklu yciowego serwera Apache...............339 Rozdział 11. PerlInitHandler .......................................................................................................................................... 345 Wprowadzenie.................................................................................................................345 11.1. Przetwarzanie ka dego ądania..............................................................................346 11.2. Przetwarzanie ka dego ądania w danej dyrektywie zbiorczej .............................347 11.3. Mierzenie czasu ądania.........................................................................................348 11.4. Przerywanie cyklu obsługi ądania ........................................................................350 Rozdział 12. PerlTransHandler .......................................................................................................................................353 Wprowadzenie.................................................................................................................353 12.1. ądania pliku favicon.ico.......................................................................................354 12.2. Rozpoznawanie serwerów wirtualnych w ądaniach.............................................355 12.3. Identyfikatory sesji w adresach URL .....................................................................358 12.4. Współdzielenie dyrektywy DocumentRoot ...........................................................360 12.5. Sterowanie wbudowanym serwerem proxy ...........................................................362 12.6. Redukcja wywołań funkcji stat()............................................................................364 Rozdział 13. PerlAccessHandler, PerlAuthenHandler i PerlAuthzHandler.................................................371 Wprowadzenie.................................................................................................................371 13.1. Prosta kontrola dostępu ..........................................................................................372 13.2. Ograniczanie dostępu „chciwym” klientom...........................................................375 13.3. Identyfikacja podstawowa......................................................................................376 13.4. Ustawianie danych u ytkownika............................................................................379 13.5. Warunkowa identyfikacja ......................................................................................381 13.6. Autoryzacja u ytkownika.......................................................................................383 13.7. Tworzenie własnego mechanizmu autoryzacji ......................................................386 13.8. Identyfikacja przy u yciu funkcji skrótu................................................................392 Rozdział 14. PerlTypeHandler i PerlFixupHandler ............................................................................................. 401 Wprowadzenie.................................................................................................................401 14.1. Przywracanie domyślnego programu obsługi generowania zawartości.................402 14.2. Wybór programu obsługi na podstawie rozszerzenia nazwy pliku........................404 14.3. Zmiana typu MIME i programu obsługi ................................................................409 14.4. Zmiana domyślnych typów MIME ........................................................................413 14.5. Własny mechanizm buforujący..............................................................................414 Rozdział 15. PerlHandler.................................................................................................................................................. 421 Wprowadzenie.................................................................................................................421 15.1. Podstawowy PerlHandler .......................................................................................422 15.2. Zarządzanie wieloma programami obsługi typu PerlHandler................................425 15.3. Wysyłanie poczty ...................................................................................................427 15.4. Filtrowanie generowanej zawartości......................................................................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 dokumentów XML.........................................................................461
  • 8 mod_perl. Kompendium programisty 15.13. Generowanie ogólnych dokumentów 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 zwykłym pliku ....................................................................................485 16.3. Zmiana wiersza ądania .........................................................................................488 16.4. Zapisywanie niestandardowych informacji............................................................489 16.5. Rejestrowanie warunkowe .....................................................................................490 16.6. Przechwytywanie błędów.......................................................................................491 Rozdział 17. PerlChildInitHandler, PerlChildExitHandler, PerlRestartHandler i PerlDispatchHandler.............................................................................................................................499 Wprowadzenie.................................................................................................................499 17.1. Konfiguracja kodu poza obsługą ądania...............................................................501 17.2. Uruchamianie kodu podczas restartu serwera........................................................503 17.3. Jednokrotne ładowanie konfiguracji ......................................................................504 17.4. Przeładowywanie skryptów Registry w procesie nadrzędnym ..............................506 17.5. Identyfikacja procesów potomnych .......................................................................507 17.6. Wczesne łączenie ze źródłem danych ....................................................................509 17.7. Śledzenie u ycia modułów Perla............................................................................511 17.8. Zastępowanie programów obsługi .........................................................................512 Dodatki.......................................................................................................................................517 Dodatek A Dostępne punkty zaczepienia i opcje kompilacji modułu mod_perl.....................................519 Punkty zaczepienia modułu mod_perl ............................................................................519 Opcje kompilacji modułu mod_perl................................................................................523 Dodatek B Dostępne stałe ..............................................................................................................................................531 Wartości zwracane przez programy obsługi ...................................................................531 Stałe określone przez protokół HTTP .............................................................................531 Stałe u ywane przez programy obsługi dyrektyw...........................................................533 Stałe sterujące zapisem w dzienniku...............................................................................536 Stałe serwera ...................................................................................................................536 Dodatek C Zasoby związane z modułem mod_perl............................................................................................ 537 Zasoby sieciowe ..............................................................................................................537 Ksią ki.............................................................................................................................540 Skorowidz..................................................................................................................................................... 543
  • Obsługa plików Wprowadzenie Podczas obsługi ka dego ądania serwera Apache nasza aplikacji musi czytać i przetwarzać zawartość plików na dysku. W Perlu mo na to zrealizować wieloma sposobami. Aplikacje WWW jednak, a w szczególności aplikacje modułu mod_perl, mają specjalne wymagania, które naj- lepiej wypełnia nowy interfejs obsługi plików. Zadania w tym rozdziale przedstawiają typowe problemy i rozwiązania spotykane przy posługiwaniu się plikami. Apache zawiera interfejs API obsługi plików zoptymalizowany pod kątem działania serwera WWW. Moduł mod_perl udostępnia elegancki, obiektowy interfejs do tych funkcji w klasie #RCEJG(KNG. Korzystając z tej klasy, nasza aplikacja zyska na jakości. G Działa szybciej. Klasa #RCEJG(KNG u ywa skompilowanego kodu języka C, aby wykonać większość zadań. G Jest bardziej stabilna. Pliki tymczasowe i zasoby tworzone dla ądania są automatycznie czyszczone. G Pełniej wykorzystuje mo liwości protokołu HTTP. Klasa #RCEJG (a w konsekwencji tak e #RCEJG(KNG) obsługuje zaawansowane mo liwości protokołu HTTP/1.1, takie jak ądania fragmentów (byte range) plików czy nowe nagłówki. Ten rozdział zawiera tak e recepty na typowe sytuacje. G Konwersja dat modyfikacji plików (i dowolnych innych) na odpowiednie nagłówki HTTP. G Opró nienie bufora danych wyjściowych i wysłanie ich do klienta przed zakończeniem przetwarzania. G Przekierowanie wyjścia istniejącego uchwytu pliku (jak 56&176 czy 56&'44).
  • 170 Część II G Interfejs API modułu mod_perl Omówienie klasy #RCEJG(KNG stanowi koniec naszego wprowadzenia do klas rdzeniowych modułu mod_perl. Kolejne rozdziały poka ą, jak posługiwać się nimi w konkretnych aplikacjach. 6.1. Tworzenie uchwytów plików Chcemy utworzyć nowy uchwyt pliku do czytania lub pisania. Rozwiązanie U yjemy metod PGY i QRGP klasy #RCEJG(KNG, która stanowi obiektowy interfejs do uchwytów plików (filehandle). Wydruk 6.1. Przykładowy program obsługi WUG #RCEJG%QPUVCPVU SY 1- 016A(170&  WUG #RCEJG(KNG WUG UVTKEV UWD JCPFNGT ] O[ T  UJKHV 1VYKGTCO[ æFCP[ RNKM Y VT[DKG V[NMQ FQ QFE[VW O[ HJ  #RCEJG(KNG PGY T HKNGPCOG  TGVWTP 016A(170& WPNGUU HJ ,CMKG RTGVYCTCPKG T UGPFAJVVRAJGCFGT T UGPFAHF HJ  0KG VTGDC CO[MCè WEJY[VW RNKMW LGUV QP CO[MCP[ CWVQOCV[EPKG MKGF[ Y[EJQFK CUKúIW YKFQEPQ EK TGVWTP 1- _ Komentarz Jest wiele sposobów obsługi wejścia-wyjścia plikowego w Perlu. Najczęściej u ywa się mo- dułów FileHandle.pm i +1(KNG oraz funkcji QRGP i U[UQRGP . Klasa #RCEJG(KNG stanowi jeszcze jedno rozwiązanie, dostarczając obiektowy interfejs do uchwytów plików, podobny do modułów FileHandle.pm i +1(KNG. Stylistycznie klasa #RCEJG(KNG dobrze wkomponowuje się w moduł mod_perl, poniewa większą część jego interfejsu API stanowią wywołania metod
  • Rozdział 6. G Obsługa plików 171 ró nych klas, więc „obiektowy” dostęp do plików rozjaśnia kod. Dodatkowo klasa #RCEJG (KNG posiada zaletę w postaci większej wydajności, nie musimy się więc przejmować spowol- nieniem operacji na plikach, jak w przypadku modułu +1(KNG. Konstruktor PGY zwraca nowy uchwyt pliku. Je eli parametrem jest nazwa pliku, jak w na- szym przykładzie (wydruk 6.1), wywołuje metodę #RCEJG(KNG QRGP i zwraca otwarty uchwyt pliku. Domyślnie pliki są otwierane w trybie tylko do odczytu (znacznik 1A4&10.;), ale mo emy u yć tych samych parametrów w metodzie #RCEJG(KNG QRGP co w perlowej funkcji QRGP . Chodzi tu oczywiście o starszą wersję tej funkcji, nie tę z trzema parametrami, wprowadzoną w wersji 5.6 Perla. O[ HJ  #RCEJG(KNG PGY 1VYKGTCO[ Y VT[DKG FQ FQRKU[YCPKC HJ QRGP  T UGTXGTATQQVATGNCVKXG NQIUCEEGUUANQI QT TGVWTP 5'48'4A'4414 Jedną z zalet u ywania konstruktora PGY w stosunku do metody QRGP jest zwracanie war- tości WPFGH w przypadku błędu, co pozwala stosować prosty mechanizm obsługi sytuacji wy- jątkowych. Poni sza tabela przedstawia listę metod klasy #RCEJG(KNG. Tabela 6.1. Metody klasy Apache::File Metoda Opis PGY Tworzy nowy uchwyt pliku, opcjonalnie otwierając wskazany plik. QRGP Otwiera wskazany plik. ENQUG Zamyka uchwyt pliku. VORHKNG Tworzy plik tymczasowy i zwraca jego nazwę i uchwyt w kontekście listowym albo tylko uchwyt w kontekście skalarnym. Chocia klasa #RCEJG(KNG umo liwia wygodną obsługę uchwytów plików, jak równie do- datkowe korzyści, które opisujemy w kolejnych zadaniach, posiada niestety pewne ogranicze- nia. Między innymi nie implementuje wszystkich metod, których moglibyśmy wymagać od uchwytu pliku. To utrudnienie wychodzi na jaw w zadaniu 6.6, kiedy klasa (KNG//CIKE wy- maga wywołania metody HJ UGGM . Oczywiście uchwyt pliku, utworzony przez klasę #RC EJG(KNG, jest normalnym, perlowym uchwytem pliku, więc zawsze mo emy na nim wywo- łać perlową funkcję UGGM w sposób „nieobiektowy”. Innym utrudnieniem jest nakład czasu w trakcie wykonywania spowodowany przez interfejs obiektowy. Je eli zdecydujemy się pozostać przy perlowej funkcji QRGP , mo emy skorzystać z automatycznego tworzenia anonimowych referencji (autovivification), wprowadzonego w wersji 5.6 Perla, co pozwala opuścić wywołanie metody 5[ODQNIGPU[O . Je eli jednak u y- wamy starszej wersji Perla i chcemy u yć funkcji QRGP , moduł mod_perl udostępnia metodę #RCEJG IGPU[O , byśmy nie musieli dołączać modułu 5[ODQN do naszego programu obsługi. O[ HJ  #RCEJG IGPU[O QRGP HJ NC[NKPGJVON 
  • 172 Część II G Interfejs API modułu mod_perl 6.2. Tworzenie plików tymczasowych Chcemy utworzyć plik tymczasowy, który istnieje tylko podczas przetwarzania ądania. Rozwiązanie U yjemy metody VORHKNG z klasy #RCEJG(KNG. Wydruk 6.2. Moduł Rules.pm RCEMCIG %QQMDQQM4WNGU WUG #RCEJG%QPUVCPVU SY 1-  WUG 2&(%TGCVG WUG UVTKEV UWD JCPFNGT ] O[ T  UJKHV O[ HKNGPCOG HJ  #RCEJG(KNG VORHKNG O[ RFH  2&(%TGCVG PGY HKNGPCOG  HKNGPCOG  O[ RCIG  RFH PGYARCIG RCIG UVTKPI RFH HQPV    OQFARGTN LGUV HCLP[  RFH ENQUG 7UVCYKCO[ YUMC PKM RNKMW PC RQEæVMW UGGM HJ   T UGVAEQPVGPVANGPIVJ U HKNGPCOG  T UGPFAJVVRAJGCFGT CRRNKECVKQPRFH  9[U CO[ RNKM T UGPFAHF HJ  2NKM HKNGPCOG LGUV WUWYCP[ RQ CMQ EGPKW æFCPKC TGVWTP 1- _ 
  • Rozdział 6. G Obsługa plików 173 Komentarz Czasem potrzebujemy pliku tymczasowego, na przykład kiedy tworzymy du y dokument i nie chcemy przechowywać go w pamięci przed wysłaniem do klienta. W takiej sytuacji (i w po- dobnych) metoda VORHKNG stanowi wygodny sposób tworzenia plików tymczasowych, które są usuwane po zakończeniu przetwarzania ądania. Metoda VORHKNG mo e zostać wywołana na dwa sposoby: w kontekście listowym zwraca nazwę nowego pliku i otwarty uchwyt, a w kontekście skalarnym — tylko uchwyt. W obu przypadkach plik otwierany jest przy u yciu znaczników 1A4&94^1A%4'#6^1A':%., czyli w try- bie do odczytu i zapisu. Pliki tymczasowe utworzone w ten sposób ró nią od plików tworzonych przez metodę +1 (KNG PGYAVORHKNG pod dwoma względami: mamy dostęp do nazwy pliku, a sam plik nie jest usuwany, kiedy jego uchwyt wychodzi z zasięgu widoczności. Są to wymarzone cechy dla pro- gramistów modułu mod_perl, pozwalające łatwo u yć tego samego pliku tymczasowego w ró nych fazach przetwarzania ądania. Mo emy na przykład skorzystać z metody RPQVGU , opisanej w zadaniu 8.11, do przekazania nazwy lub uchwytu do pliku tymczasowego w łańcuchu programów obsługi. <CRCOKúVWLGO[ PCYú RNKMW V[OECUQYGIQ PC RÎ PKGL  T RPQVGU 6'/2(+.'  HKNGPCOG  Warto te zauwa yć, e wywołanie funkcji UGGM nie jest niezbędne w naszym przykładzie (wydruk 6.2), gdy moduł 2&(%TGCVG nie korzysta bezpośrednio z uchwytu pliku utworzo- nego za pomocą metody VORHKNG . W ogólnym przypadku jednak je eli chcemy pisać do wy- generowanego pliku tymczasowego (albo jakiegokolwiek innego), a później wypisać jego za- wartość przy u yciu tego samego uchwytu pliku, musimy u yć perlowej funkcji UGGM , aby ustawić wskaźnik pliku z powrotem na jego początku, jak w poni szym przykładzie (wydruk 6.3). Wydruk 6.3. U ycie funkcji seek() O[ HJ  #RCEJG(KNG VORHKNG RTKPV HJ /ÎY OK +UJOCGN  2TGUVCYKCO[ YUMC PKM RNKMW PC RQEæVGM UGGM HJ   9[U[ CO[ RNKM FQ MNKGPVC T UGPFAHF HJ  6.3. Wysyłanie całego pliku Chcemy wysłać cały plik do klienta.
  • 174 Część II G Interfejs API modułu mod_perl Rozwiązanie U yjemy metody #RCEJG UGPFAHF . Wydruk 6.4. Przykładowy skrypt O[ HJ  #RCEJG(KNG PGY GPEJKNCFCJVON  KH O[ NGPIVJ  T RCTCO NGPIVJ ] 9[U[ CO[ Eú è RNKMW T UGPFAHF HJ NGPIVJ  _ GNUG ] CNDQ EC [ T UGPFAHF HJ _ Komentarz Wszystkie dotychczasowe przykłady w tym rozdziale u ywały metody T UGPFAHF , aby przesłać plik bezpośrednio do klienta. Zazwyczaj mo na się spotkać z u yciem funkcji RTKPV do wypisania zawartości pliku, jak na przykład: RTKPV YJKNG  HJ  Poniewa jednak wysyłanie pliku do klienta jest często potrzebne w aplikacjach WWW, me- toda UGPFAHF pozwala na wykonanie tej czynności łatwo i efektywnie. Jej parametrem jest otwarty uchwyt pliku; u ywa ona interfejsu API języka C serwera Apache, aby wysłać za- wartość pliku do przeglądarki klienta mo liwie wydajnie. Zwraca długość w bajtach przesła- nych danych na wypadek, gdybyśmy chcieli znać ró nicę między liczbą wszystkich wysła- nych bajtów a pochodzących z pliku. Drugim opcjonalnym parametrem mo e być liczba bajtów do wysłania, u ywa się go rzadko, ale w pewnych warunkach jest u yteczny, co mo na zobaczyć w zadaniu 6.7. Rozwa my na przykład sytuację, w której chcielibyśmy uruchomić usługę, umo liwiającą (zaufanemu) klientowi za ądanie zawartości pliku konfiguracyjnego serwera. Moglibyśmy zrealizować to za pomocą następującego programu obsługi (wydruk 6.5). Wydruk 6.5. Moduł ViewConf.pm RCEMCIG %QQMDQQM8KGY%QPH WUG #RCEJG%QPUVCPVU SY 1- 5'48'4A'4414 016A(170&  WUG #RCEJG(KNG WUG UVTKEV UWD JCPFNGT ] O[ T  UJKHV
  • Rozdział 6. G Obsługa plików 175 2QDKGTCO[ PCYú æFCPGIQ RNKMW O[ HKNG  T HKNGPCOG 7RGYPKCO[ UKú G KUVPKGLG WPNGUU H T HKPHQ ] T NQIAGTTQT 2NKM HKNG PKG KUVPKGLG  TGVWTP 016A(170& _ 1VYKGTCO[ WEJY[V RNKMW O[ HJ  #RCEJG(KNG PGY HKNG  WPNGUU HJ ] T NQIAGTTQT 0KG OQ PC QVYQT[è RNKMW HKNG  TGVWTP 5'48'4A'4414 _ T UGPFAJVVRAJGCFGT VGZVRNCKP  2QDKGTCO[ TQOKCT RNKMW K Y[U[ CO[ IQ O[ UKG  U A O[ UGPV  T UGPFAHF HJ  T RTKPV  '0&   4QOKCT RNKMW UKG 9[U CPQ DCLVÎY UGPV  '0& TGVWTP 1- _  Aby uruchomić moduł %QQMDQQM8KGY%QPH, nale y u yć następujących dyrektyw w pliku httpd.conf: 2GTN/QFWNG %QQMDQQM8KGY%QPH #NKCU EQPH WUTNQECNCRCEJGEQPH .QECVKQP EQPH 5GV*CPFNGT RGTNUETKRV 2GTN*CPFNGT %QQMDQQM8KGY%QPH &QUVúR V[NMQ CWHCP[EJ TÎFG  1TFGT &GP[#NNQY &GP[ HTQO #NN #NNQY HTQO NQECNJQUV .QECVKQP W ten sposób klient mo e otrzymać tekstową wersję pliku konfiguracyjnego serwera, przykła- dowo httpd.conf, ądając adresu URI http://localhost/conf/httpd.conf. Pod zawartością pliku ra- portowany jest jeszcze rozmiar pliku na dysku serwera i liczba wysłanych bajtów. Te dwie liczby mogą się ró nić, na przykład w systemie Win32, z powodu u ycia ró nych sekwencji nowego wiersza.
  • 176 Część II G Interfejs API modułu mod_perl 6.4. Wczytywanie zawartości plików do zmiennych Chcemy przechowywać zawartość całego pliku w zmiennej, aby móc na niej operować. Rozwiązanie U yjemy perlowego idiomu NQECN , aby „wessać” (slurp) cały plik, ale nale y przy tym za- chować ostro ność! O[ HJ  #RCEJG(KNG PGY HKNGPCOG  O[ HKNG  FQ ]NQECN   HJ _ Komentarz Lokalizacja specjalnej zmiennej  jest to perlowy idiom, słu ący do wczytywania całej za- wartości pliku do zmiennej tekstowej. Aby być wydajnym programistą Perla, nale y znać ten idiom i podobne. W przypadku modułu mod_perl trzeba jednak głębiej zastanowić się nad je- go znaczeniem. Jak ju pisaliśmy w rozdziale 2., moduł mod_perl jest tak u yteczny między innymi dlatego, e interpreter Perla jest wbudowany w serwer Apache. Ma to wiele zalet, jak na przykład zmniej- szenie nakładu czasowego za ka dym uruchomieniem skryptu środowiska #RCEJG4GIKUVT[. Jedną z największych wad takiego rozwiązania jest jednak fakt, e pamięć, której u ywa in- terpreter Perla, nie jest zwracana do systemu operacyjnego, dopóki nie zakończy się działanie odpowiedniego procesu potomnego httpd. Oznacza to, e je eli jakiś beztroski program obsługi postanowi wczytać 10-megabajtowy plik do zmiennej, to pamięć, której zmuszony będzie u yć interpreter Perla, nie zostanie zwolniona dopóki nie zostanie zakończony proces potom- ny serwera Apache. Generalnie nale y więc unikać operowania na zawartości całych plików jako zmiennych i sta- rać się zrealizować po ądaną funkcjonalność inaczej. Zdarzają się jednak sytuacje, kiedy nie istnieje inna mo liwość, jak w przypadku pobierania całych plików z bazy danych (jak w za- daniu 3.11) albo gdy u ywamy klasy #RCEJG(KNVGT (która zapisuje wygenerowaną zawar- tość w zmiennej). Je eli koniecznie potrzebujemy takiej funkcjonalności w naszej aplikacji, powinniśmy upewnić się, e stosujemy odpowiedni mechanizm utrzymywania rozmiarów procesów potomnych w ryzach, na przykład #RCEJG5KG.KOKV. 6.5. Pobieranie informacji o ądanym pliku Chcemy u yć funkcji UVCV na ądanym pliku albo przeprowadzić testy.
  • Rozdział 6. G Obsługa plików 177 Rozwiązanie U yjemy metody T HKPHQ , aby przeprowadzić testy i zastąpić wywołania funkcji UVCV bezpośrednio funkcją T HKNGPCOG . Wydruk 6.6. Moduł XBitHack.pm RCEMCIG %QQMDQQM:$KV*CEM WUG #RCEJG%QPUVCPVU SY 1- &'%.+0'& 126A+0%.7&'5  WUG #RCEJG(KNG WUG (EPVN SY 5A+:754 5A+:)42  WUG UVTKEV UWD JCPFNGT ] +ORNGOGPVWLGO[ F[TGMV[Yú :$KV*CEM HWNN Y RTQITCOKG 2GTN(KZWR*CPFNGT O[ T  UJKHV TGVWTP &'%.+0'& WPNGUU H T HKPHQ RNKM KUVPKGLG T EQPVGPVAV[RG GS VGZVJVON K LGUV FQMWOGPVGO *6/. T CNNQYAQRVKQPU 126A+0%.7&'5  K WUVCYKQPQ QRELú +PENWFGU 5RTCYFCO[ E[ RNKM LGUV Y[MQP[YCNP[ FNC Y C EKEKGNC K LGIQ ITWR[ O[ OQFG  UVCV A =? 9[MQP[YCNPQ è FNC Y C EKEKGNC OWUKO[ URTCYFKè QUQDPQ TGVWTP &'%.+0'& WPNGUU OQFG 5A+:754  7UVCYKCO[ PCI ÎYGM .CUV/QFKHKGF LG GNK RNKM LGUV Y[MQP[YCNP[ FNC ITWR[ T UGVANCUVAOQFKHKGF UVCV A =? KH OQFG 5A+:)42  7RGYPKCO[ UKú G OQFW OQFAKPENWFG CLOKG UKú æFCPKGO T JCPFNGT UGTXGTRCTUGF  TGVWTP 1- _  Komentarz Jak ju wiemy, metoda T HKNGPCOG zwraca nazwę fizycznego pliku dla ądania, której mo na u yć w rozmaitych operacjach testowych na pliku czy w funkcji UVCV . Jednak metoda T HKPHQ stanowi efektywniejszy sposób uzyskiwania tej samej informacji i oszczędza czas przy wielu wywołaniach funkcji UVCV , która zu ywa du o zasobów systemu. U ycie jej do- wodzi przy okazji, e posiedliśmy biegłość w posługiwaniu się zaawansowanymi elementami modułu mod_perl.
  • 178 Część II G Interfejs API modułu mod_perl Kiedy serwer Apache zmapuje ądany adres URI na plik fizyczny, wywołuje funkcję UVCV dla własnych potrzeb i gromadzi informację w polu HKPHQ rekordu ądania. Kiedy wywoływa- na jest metoda T HKPHQ , moduł mod_perl wydobywa tę informację z rekordu ądania, wewnętrznie wypełnia specjalny perlowy uchwyt pliku A i zwraca go. Poniewa uchwyt A u ywany jest do buforowania informacji dla przyszłych wywołań funkcji UVCV , programiści modułu mod_perl mogą uniknąć straty czasu, jaka zazwyczaj towarzyszy sprawdzaniu, czy plik istnieje, pobieraniu czasu ostatniej modyfikacji i tym podobnym. Program obsługi %QQMDQQM:$KV*CEM (wydruk 6.6) stanowi implementację dyrektywy :$K V*CEM z modułu mod_include. Standardowo dyrektywa ta pozwala administratorowi serwera Apache wskazać, które pliki są przetwarzane przez mechanizm SSI (Server Side Include engine — serwerowy mechanizm włączania plików) w oparciu o uprawnienia dostępu do pliku i dy- rektywę 1RVKQPU. Aby zaimplementować całą funkcjonalność dyrektywy :$KV*CEM HWNN przy minimum wysiłku, czynimy u ytek z „dróg na skróty”, które zapewnia moduł mod_perl i tym podobnych sztuczek. Pierwszym z wywołań funkcji opartych o UVCV jest operator testu pliku H, który sprawdza, czy plik istnieje i jest zwykłym plikiem. Poniewa parametrem tego operatora jest T HKPHQ , „obchodzimy” w ten sposób wywołanie systemowej funkcji UVCV , u ywając in- formacji przygotowanej przez serwer Apache. Pozostałe wywołania UVCV u ywają uchwytu A, świe o zainicjalizowanego przez T HKPHQ , dzięki czemu korzystamy z wewnętrznego bu- fora interpretera Perla i oszczędzamy na wywołaniach metody T HKPHQ . Poniewa oryginalna dyrektywa :$KV*CEM rozró nia uprawnienia dla właściciela i grupy, ope- rator testu Z nie przyda się nam, je eli chcemy zachować z nią zgodność. Porównujemy więc uprawnienia do pliku, zwrócone przez funkcję UVCV , z odpowiednimi stałymi, zaimportowanymi z pakietu (EPVN, aby wyizolować uprawnienie do wykonywania pliku przez właściciela i grupę. W naszym programie obsługi pozostaje ju tylko sprawdzić wartość dyrektywy 1RVKQPU, ustawić nagłówek .CUV/QFKHKGF i upewnić się, e moduł mod_include zajmie się fazą gene- rowania zawartości. Aby sprawdzić ustawienie dyrektywy 1RVKQPU, u ywamy operatora ko- niunkcji bitowej na wartości zwróconej przez metodę T CNNQYUAQRVKQPU i jeszcze jednej stałej z modułu #RCEJG%QPUVCPVU. Metody tej u ywa się bardzo rzadko w programach mo- dułu mod_perl, ale przydaje się w sytuacjach, takich jak ta, kiedy chcemy wymusić ustawienia pliku .htaccess. U ycie metody UGVANCUVAOQFKHKGF jest dokładniej opisane w następnym za- daniu, a u ycie T JCPFNGT — w podrozdziale 14.1. Moduł %QQMDQQM:$KV*CEM, u yty jako program obsługi typu 2GTN(KZWR*CPFNGT, ma identyczną funkcjonalność, jak moduł mod_include, z jednym istotnym wyjątkiem. W systemach Win32 nie istnieje rozró nienie między uprawnieniami do pliku dla właściciela i grupy, więc moduł mod_include stosuje specjalną obsługę dla tej platformy (i kilku innych). Sprawdza wtedy po prostu tylko, czy u ytkownik mo e wykonywać dany plik i zawsze ustawia nagłówek .CUV /QFKHKGF. Chocia wydaje się to rozsądnym rozwiązaniem, nie rozwiązuje jeszcze problemu u ytkowników Windows, gdy system ten uwa a za pliki wykonywalne tylko te, które mają odpowiednie rozszerzenie, jak .exe czy .bat. Tak więc, chyba e u ywamy SSI do przetwarza- nia dokumentów o nazwie typu index.exe, dyrektywa :$KV*CEM staje się bezu yteczna na plat- formie Win32 mimo „najlepszych intencji” modułu mod_include.
  • Rozdział 6. G Obsługa plików 179 Poni ej (wydruk 6.7) prezentujemy alternatywę dla implementacji dyrektywy :$KV*CEM z mo- dułu mod_include w wersji dostosowanej do specyfiki systemu Win32. Wydruk 6.7. Moduł WinBitHack.pm RCEMCIG %QQMDQQM9KP$KV*CEM WUG #RCEJG%QPUVCPVU SY 1- &'%.+0'& 126A+0%.7&'5  WUG #RCEJG(KNG WUG 9KP(KNG SY 4'#&10.; #4%*+8'  WUG UVTKEV UWD JCPFNGT ] +ORNGOGPVWLGO[ F[TGMV[Yú :$KV*CEM HWNN Y RTQITCOKG 2GTN(KZWR*CPFNGT YGTULC FNC U[UVGOW 9KP O[ T  UJKHV TGVWTP &'%.+0'& WPNGUU H T HKPHQ RNKM KUVPKGLG T EQPVGPVAV[RG GS VGZVJVON K LGUV FQMWOGPVGO *6/. T CNNQYAQRVKQPU 126A+0%.7&'5  K WUVCYKQPQ QRELú +PENWFGU 2QDKGTCO[ CVT[DWV[ RNKMW O[ CVVT 9KP(KNG)GV#VVTKDWVGU T HKNGPCOG CVVT  <YTCECO[ UVC æ &'%.+0'& LG GNK RNKM OC WUVCYKQP[ CVT[DWV #4%*+8' TGVWTP &'%.+0'& KH CVVT #4%*+8' 7UVCYKCO[ PCI ÎYGM .CUV/QFKHKGF LG GNK PKG LGUV WUVCYKQP[ CVT[DWV 4'#&10.; T UGVANCUVAOQFKHKGF UVCV A =? WPNGUU CVVT 4'#&10.; 7RGYPKCO[ UKú G OQFW OQFAKPENWFG CLOKG UKú æFCPKGO T JCPFNGT UGTXGTRCTUGF  TGVWTP 1- _  Zamiast u yć uprawnień do pliku, moduł %QQMDQQM9KP$KV*CEM sprawdza atrybuty #4%*+8' (gotowy do archiwizacji) i 4'#&10.; (tylko do odczytu) przy u yciu pakietu 9KP(KNG, do- stępnego w dystrybucji libwin32 w archiwum CPAN. Je eli atrybut #4%*+8' nie jest ustawiony, nasz program obsługi przekazuje go modułowi mod_include do przetworzenia. Poniewa atry- but #4%*+8' trzeba usunąć z utworzonego pliku celowo, schemat działania dyrektywy :$KV*CEM pozostaje bez zmian. Nasza nowa implementacja ustawia tak e nagłówek .CUV/QFKHKGF, ale tylko, gdy nie jest ustawiony atrybut 4'#&10.; — je eli plik nie mo e być zmodyfikowany, nie kłopoczemy się ustawianiem nagłówka. W zale ności od wersji systemu operacyjnego mo e być wiele sposobów przełączania atry- butów pliku, ale najbardziej uniwersalne jest u ycie programu #664+$ z wiersza poleceń: %>#RCEJG>JVFQEU #664+$ # WPFGTYC[JVON
  • 180 Część II G Interfejs API modułu mod_perl 6.6. Nagłówki warunkowe Chcemy właściwie posługiwać się nagłówkami warunkowymi, na przykład wysyłać w odpo- wiedzi nagłówek .CUV/QFKHKGF, czy sprawdzać nagłówek ądania +H/QFKHKGF5KPEG. Rozwiązanie U yjemy metod dodanych do klasy #RCEJG przez klasę #RCEJG(KNG, jak UGVANCUVAOQFKHKGF czy OGGVUAEQPFKVKQP (spełnia warunek). Wydruk 6.8. Moduł SendSmart.pm RCEMCIG %QQMDQQM5GPF5OCTV WUG #RCEJG%QPUVCPVU SY 1- 016A(170&  WUG #RCEJG(KNG WUG (KNG//CIKE WUG +1(KNG WUG UVTKEV UWD JCPFNGT ] 9[U[ CO[ RNKM UVCV[EP[ QFRQYKGFPKOK PCI ÎYMCOK V[NMQ MKGF[ MNKGPV RQUKCFC UVCTæ YGTULú O[ T  UJKHV 0KG #RCEJG(KNG PGY RQPKGYC (KNG//CIKE RQVTGDWLG HJ UGGM  O[ HJ  +1(KNG PGY T HKNGPCOG  TGVWTP 016A(170& WPNGUU HJ /CIKEPKG WUVCYKCO[ V[R /+/' T EQPVGPVAV[RG (KNG//CIKE PGY EJGEMV[RGAHKNGJCPFNG HJ  7UVCYKCO[ PCI ÎYGM .CUV/QFKHKGF PC RQFUVCYKG ECUW OQF[HKMCELK RNKMW T UGVANCUVAOQFKHKGF UVCV T HKPHQ =?  QTC PCI ÎYMK 'VCI K %QPVGPV.GPIVJ T UGVAGVCI T UGVAEQPVGPVANGPIVJ ,G GNK YU[UVMKG YCTWPMK PCI ÎYMÎY +H
  • Uæ URG PKQPG Y[U[ CO[ PCI ÎYMK 9 RTGEKYP[O TCKG YTCECO[ UVCVWU FQ UGTYGTC #RCEJG KH O[ UVCVWU  T OGGVUAEQPFKVKQPU  1- ] T UGPFAJVVRAJGCFGT _ GNUG ] TGVWTP UVCVWU _
  • Rozdział 6. G Obsługa plików 181 7UVCYKCO[ YUMC PKM RNKMW PC RQEæVGM K Y[U[ CO[ CYCTVQ è UGGM HJ   T UGPFAHF HJ  TGVWTP 1-  _  Komentarz W zadaniu 3.10 pokazaliśmy, jak, u ywając metody PQAECEJG , ograniczyć „nadgorliwość” przeglądarki klienta w buforowaniu oglądanych dokumentów, teraz zobaczymy, jak „przekonać” przeglądarkę do u ycia lokalnej kopii dokumentu, kiedy tylko to mo liwe. W tym celu bę- dziemy sprawdzać i ustawiać zestaw odpowiednich nagłówków. Częścią specyfikacji protokołu HTTP/1.1 jest pojęcie warunkowego ądania GET (conditional GET request), czyli ądania przy u yciu metody )'6 opartego na dodatkowej informacji, za- wartej w nagłówkach ądania i odpowiedzi. Nowoczesne przeglądarki zapamiętują odpowiedzi serwera, jak równie dodatkowe informacje o ądaniu, w pamięci podręcznej. Informacje te są wysyłane z następnymi ądaniami w celu ograniczenia przesyłu danych. Obsługa ądań, które mogą wygenerować odpowiedź, jest skomplikowana: samo przeczytanie opisu nagłówków z rodziny +H
  • w dokumencie RFC 2616 mo e przyprawić o ból głowy. Na szczęście interfejs API serwera Apache dostarcza kilku metod, które zajmują się analizą i ustawianiem nagłówków warunkowych. Kod tych metod, jak równie wyjaśnienia, pomocne w „rozszyfrowaniu” specyfikacji HTTP/1.1, znajdują się w pliku http_protocol.c w dystrybu- cji kodu źródłowego serwera Apache. Jak zwykle, mo emy dostać się do tych metod dzięki modułowi mod_perl, w tym przypadku za pośrednictwem klasy #RCEJG(KNG. Tabela 6.2 przedstawia metody dostępne przez obiekt ądania. Inaczej ni do pozostałych meto- dy klasy #RCEJG, dostęp do tych jest mo liwy dopiero po u yciu instrukcji WUG #RCEJG(KNG. Dla dokumentów statycznych odpowiednimi nagłówkami warunkowymi ądania i odpowiedzi zajmuje się domyślny program obsługi serwera Apache. Przetwarzanie ich przez aplikacje ge- nerujące dynamiczną zawartość wymaga trochę więcej wysiłku ni po prostu wywoływanie wy ej wymienionych metod. Nale y najpierw zadecydować, co ma wpływ na zawartość, którą generujemy: dane źródłowe, ich zmiany czy te inne czynniki, które mogą być subtelne, ale wa ne. Moduł %QQMDQQM5GPF5OCTV (wydruk 6.8) pokazuje, jak w prostym programie obsługi zawarto- ści u yć metod obsługujących nagłówki warunkowe. Po pobraniu danych z ądanego zasobu statycznego przy u yciu metody T HKNGPCOG ustawiamy odpowiednie nagłówki odpowie- dzi i obiektu. Wywołanie metody OGGVUAEQPFKVKQPU powoduje u ycie interfejsu API serwera Apache, aby zdecydować, czy „świe a” zawartość powinna zostać wygenerowana na podstawie nagłówków 'VCI, +H/CVEJ, +H7POQFKHKGF5KPEG, +H0QPG/CVEJ, +H/QFKHKGF5KPEG i 4CPIG
  • 182 Część II G Interfejs API modułu mod_perl Tabela 6.2. Metody dodane do klasy Apache przez klasę Apache::File Metoda Opis FKUECTFATGSWGUVADQF[ Usuwa ciało komunikatu z nadchodzącego ądania. GCEJAD[VGTCPIG Zwraca pozycje początkowe i długości ka dego fragmentu wyspecyfikowanego w ądaniu. OGGVUAEQPFKVKQPU Sprawdza, czy spełnione są warunki z nagłówków +H
  • . Je eli zwróci 1-, zawartość powinna zostać wysłana do klienta. OVKOG Umo liwia dostęp do czasu ostatniej modyfikacji ądanego zasobu, przechowywanego w rekordzie ądania serwera Apache. UGVAD[VGTCPIG Zwraca wartość „prawda”, je eli ądanie dotyczy fragmentów pliku. UGVAEQPVGPVANGPIVJ Ustawia nagłówek %QPVGPV.GPIVJ na wskazaną wartość albo na długość ądanego pliku (je eli jest dostępna). UGVAGVCI Generuje i ustawia nagłówek 'VCI. UGVANCUVAOQFKHKGF Ustawia nagłówek .CUV/QFKHKGF na czas ostatniej modyfikacji ądanego pliku, opcjonalnie wywołując metodę WRFCVGAOVKOG z podaną wartością. WRFCVGAVKOG Ustawia czas ostatniej modyfikacji ądanego pliku w rekordzie ądania tylko, kiedy nowo ustawiany czas jest późniejszy od dotychczasowego. ądania. Metoda OGGVUAEQPFKVKQPU zwraca wartość 1-, je eli z analizy nagłówków i innych informacji, które dostarczyliśmy na temat zasobu, jak na przykład czas ostatniej modyfikacji, wynika, e nale y wysłać klientowi aktualną wersję zawartości. Je eli zwrócona wartość jest ró na od 1-, powinna zostać przekazana do serwera Apache, aby mógł podjąć odpowiednią reakcję, na przykład wysłać odpowiedź  0QV /QFKHKGF (zasób niezmieniony). Mo na by pomyśleć, e ustawianie nagłówków odpowiedzi przed wywołaniem metody OG GVUAEQPFKVKQPU to strata czasu. Jednak metoda ta u ywa nagłówka .CUV/QFKHKGF w swoich porównaniach, a ponadto niektóre nagłówki mo na zwracać tak e z odpowiedzią  0QV /Q FKHKGF, na przykład 'VCI, .CUV/QFKHKGF, -GGR#NKXG i inne. Chocia większość metod w tabeli 6.2 mo e być u ywana przy wysyłaniu zarówno dynamicz- nej, jak i statycznej zawartości, metody UGVAGVCI powinno się u ywać tylko przy wysyłaniu niezmienionych, statycznych plików, poniewa obliczenie nagłówka 'VCI jest bardzo kosztow- ne, gdy musi być zagwarantowana jego unikalność dla danego zasobu w danym stanie; nie jest dopuszczalne, aby jakiekolwiek dwie wersje zasobu mogły mieć ten sam nagłówek 'VCI. Warto równie omówić osobno metodę WRFCVGAOVKOG . Wpływa ona bezpośrednio na czas ostatniej modyfikacji, który zostanie wysłany w nagłówku .CUV/QFKHKGF odpowiedzi, je eli u yjemy metody UGVANCUVAOQFKHKGF . Metodę WRFCVGAOVKOG mo emy wywoływać dowolną ilość razy — nagłówek .CUV/QFKHKGF będzie miał w rezultacie wartość najpóźniejszą z tych, które będziemy próbowali ustawić, co ułatwia wyra anie skomplikowanych warunków logicz- nych dotyczących dat w naszym kodzie. Dobrą ilustrację tej cechy stanowią zadania 6.7 i 8.2. Poni szy wynik działania metody T CUAUVTKPI pokazuje komunikację między klientem a serwerem dla wcześniejszego przykładu (wydruk 6.8). Pierwszy zestaw nagłówków repre- zentuje ądanie zasobu, którego przeglądarka klienta jeszcze nie posiada w pamięci podręcz- nej, a drugi — powtórne ądanie tego samego zasobu.
  • Rozdział 6. G Obsługa plików 183 )'6 5OCTVKPFGZJVON *662 #EEGRV KOCIGIKH KOCIGZZDKVOCR KOCIGLRGI KOCIGRLRGI KOCIGRPI
  • 
  • #EEGRV%JCTUGV KUQ
  • WVH #EEGRV'PEQFKPI IKR #EEGRV.CPIWCIG GPRFH %QPPGEVKQP -GGR#NKXG *QUV YYYGZCORNGEQO 7UGT#IGPV /QKNNC 9KPFQYU 06  7 *662  1- .CUV/QFKHKGF 6JW  /C[   )/6 '6CI DCCDEC %QPVGPV.GPIJV  %QPPGEVKQP ENQUG %QPVGPV6[RG VGZVJVON )'6 5OCTVKPFGZJVON *662 #EEGRV KOCIGIKH KOCIGZZDKVOCR KOCIGLRGI KOCIGRLRGI KOCIGRPI
  • 
  • #EEGRV%JCTUGV KUQ
  • WVH #EEGRV'PEQFKPI IKR #EEGRV.CPIWCIG GPRFH %QPPGEVKQP -GGR#NKXG *QUV YYYGZCORNGEQO +H/QFKHKGF5KPEG 6JW  /C[   )/6 NGPIJV 7UGT#IGPV /QKNNC 9KPFQYU 06  7 *662  0QV /QFKHKGF .CUV/QFKHKGF 6JW  /C[   )/6 '6CI DCCDEC %QPVGPV.GPIJV  %QPPGEVKQP ENQUG 6.7. ądania fragmentów plików Chcemy obsługiwać ądania fragmentów plików, wymaganych na przykład przez moduły roz- szerzające przeglądarki do obsługi dokumentów w formacie PDF. Rozwiązanie U yjemy metod #RCEJG UGVAD[VGTCPIG i #RCEJG GCEJAD[VGTCPIG , dodanych przez klasę #RCEJG(KNG. Wydruk 6.9. Moduł SendAnyDoc.pm RCEMCIG %QQMDQQM5GPF#P[&QE WUG #RCEJG%QPUVCPVU SY 1- 016A(170&  WUG #RCEJG(KNG
  • 184 Część II G Interfejs API modułu mod_perl WUG &$+ WUG &$&1TCENG WUG /+/'6[RGU SY D[AUWHHKZ  WUG 6KOG2KGEG WUG UVTKEV UWD JCPFNGT ] O[ T  UJKHV O[ WUGT  T FKTAEQPHKI &$75'4  O[ RCUU  T FKTAEQPHKI &$2#55  O[ FDCUG  T FKTAEQPHKI &$#5'  6YQT[O[ QDKGMV 6KOG2KGEG PC RÎ PKGL O[ VKOG  NQECNVKOG O[ FDJ  &$+ EQPPGEV FDCUG WUGT RCUU ]4CKUG'TTQT   #WVQ%QOOKV   2TKPV'TTQT  _ ^^ FKG &$+GTTUVT <PCLFWLGO[ PCYú VCDNKE[ K RNKMW Y FQFCVMQYGL KPHQTOCELK Y EKG EG 2T[M CFQY[ CFTGU 74+ JVVRNQECNJQUV5GPF#P[&QEFQEUHKNGRFH O[ VCDNG HKNGPCOG  T RCVJAKPHQ ` O  
  •  
  •  6YQT[O[ CR[VCPKG MVÎTG YTCEC CYCTVQ è RNKMW K ECU QUVCVPKGL OQF[HKMCELK Y UGMWPFCEJ QF RQEæVMW GRQMK CNG YINúFGO CMVWCNPGL UVTGH[ ECUQYGL KPCEGL PK RGTNQYC HWPMELC VKOG  O[ USN SS UGNGEV FQEWOGPV NCUVAOQFKHKGF  VQAFCVG   &&//;;;;
  •  HTQO VCDNG YJGTG PCOG  !  5RGELCNPG WUVCYKGPKC FNC RÎN $.1$ FDJ ].QPI4GCF.GP_  
  • 
  •  / O[ UVJ  FDJ RTGRCTG USN  UVJ GZGEWVG HKNGPCOG  O[ HKNG NCUVAOQFKHKGF  UVJ HGVEJTQYACTTC[ UVJ HKPKUJ TGVWTP 016A(170& WPNGUU HKNG +PHQTOWLGO[ RTGINæFCTMú G CMEGRVWLGO[ æFCPKC HTCIOGPVÎY RNKMW T JGCFGTUAQWV UGV #EEGRV4CPIGU  D[VGU  7UVCYKCO[ V[R /+/' PC RQFUVCYKG TQUGTGPKC PCY[ RNKMW T EQPVGPVAV[RG D[AUWHHKZ HKNGPCOG  =?  0KGEJ #RCEJG FGE[FWLG MVÎT[ ECU LGUV PCLRÎ PKGLU[  ECU RQDTCP[ DC[ FCP[EJ  ECU OQF[HKMCELK RNKMW TÎF QYGIQ OQFW W
  • Rozdział 6. G Obsługa plików 185 9 RT[RCFMW ECUW DC[ FCP[EJ WRGYPKCO[ UKú G LGUV Y )/6 O[ RCEMCIG  AA2#%-#)'AA ` U   I T WRFCVGAOVKOG NCUVAOQFKHKGF  VKOG VQHHUGV  T WRFCVGAOVKOG UVCV +0%] RCEMCIGRO _ =?  T UGVANCUVAOQFKHKGF 5RTCYFCO[ E[ LGUV VQ æFCPKG HTCIOGPVÎY ARQA WUVCYKGPKGO %QPVGPV.GPIVJ CNG ARTGFA Y[U CPKGO PCI ÎYMÎY IF[ HWPMELC CRAUGVAD[VGTCPIG OQF[HKMWLG LG 2COKúVCLO[ G WUVCYKGPKG %QPVGPV.GPIVJ LGUV AMQPKGEPGA T UGVAEQPVGPVANGPIVJ NGPIVJ HKNG  O[ TCPIGATGSWGUV  T UGVAD[VGTCPIG 6CM CNDQ PKG KH O[ UVCVWU  T OGGVUAEQPFKVKQPU  1- ] T UGPFAJVVRAJGCFGT _ GNUG ] TGVWTP UVCVWU _ 0KG Y[U[ CO[ CYCTVQ EK LG GNK Q PKæ PKG RTQUQPQ TGVWTP 1- KH T JGCFGTAQPN[ 6GTC CLOKGO[ UKú HTCIOGPVCOK RNKMW Y RT[RCFMW PR FQMWOGPVW 2&( KH TCPIGATGSWGUV ] YJKNG O[ QHHUGV NGPIVJ  T GCEJAD[VGTCPIG ] RTKPV UWDUVT HKNG QHHUGV NGPIVJ  _ _ GNUG ] RTKPV HKNG _ TGVWTP 1-  _  Komentarz Chocia powinniśmy pozwolić serwerowi Apache obsługiwać wszystkie mo liwe dokumenty statyczne, kiedy plik jest przechowywany w bazie danych, mo emy nie mieć innego wyjścia, jak tylko obsłu yć ądanie „własnoręcznie”. W takim przypadku dodatkowy wysiłek, wło ony w zapewnienie właściwej obsługi ró nych nagłówków protokołu HTTP/1.1, pozwoli znacznie obni yć obcią enie naszego łącza. Nasz przykładowy program obsługi (wydruk 6.9) stanowi bardzo zmodyfikowaną wersję pro- gramu %QQMDQQM5GPF9QTF&QE z zadania 3.11. W nowej wersji dodaliśmy kilka usprawnień na podstawie dotychczasowych rozwiązań, w tym u ycie dodatkowej informacji w adresie URI, aby określić nazwę tabeli w bazie danych i pliku, który chcemy z niej uzyskać. Dodaliśmy te mo liwość inteligentnej obsługi ądań warunkowych w oparciu o czas modyfikacji zarówno
  • 186 Część II G Interfejs API modułu mod_perl pliku w bazie danych, jak i naszego modułu — oba są u ywane do określenia, czy zawartość jest „świe a”. I, aby spełnić obietnicę zawartą w tytule podrozdziału, dodaliśmy mo liwość prze- syłania fragmentów pliku. Mo liwość ądania jedynie wskazanych fragmentów pliku została dodana przez wprowadze- nie odpowiedniego zestawu nagłówków w specyfikacji protokołu HTTP/1.1. Pełna imple- mentacja tych nagłówków przez klienta i serwer redukuje transfery du ych plików, kiedy u ytkownik mógłby być zainteresowany jedynie niektórymi fragmentami. Chocia taka kon- cepcja stanowi fascynujące rozwiązanie problemu „zapchania” przepustowości sieci, a serwer Apache implementuje ją w pełni we wbudowanym, domyślnym programie obsługi zawartości statycznej, przeglądarki klientów rzadko ją wykorzystują, z wyjątkiem ądań plików PDF1. Mechanizm pobierania fragmentów pliku, u ywany aktualnie przez moduły rozszerzające przeglądarkę o obsługę dokumentów PDF, mo e się wydać nieco dziwny na pierwszy rzut oka, gdy wywoływanych jest kilka ądań, z których pierwsze jest przerywane, aby wywołać następne, dotyczące fragmentów. Chocia mo e się to wydawać niezgodne z intuicją w przy- padku projektu mającego redukować przesyłanie danych, jednak po zidentyfikowaniu zasobu jako dokumentu PDF, pochodzącego z serwera obsługującego ądania fragmentów, przeglą- darka natychmiast przerywa aktualne ądanie, aby wywołać jedno lub kilka następnych z od- powiednimi nagłówkami dotyczącymi fragmentów pliku. Jak opisaliśmy w zadaniu 4.9, zerwanie połączenia jest natychmiast rozpoznawane przez ser- wer Apache, który z kolei zamienia wszystkie operacje pisania na operacje puste w celu za- oszczędzenia cykli procesora. ądania fragmentów pliku mają zmniejszać obcią enie sieci, niekoniecznie zaś obcią enie naszego serwera. Je eli to wszystko brzmi skomplikowanie, to dlatego, e jest skomplikowane. Przykładowy dialog ądanie-odpowiedź dla programu z wydruku 6.9 mógłby wyglądać następująco: )'6 5GPF#P[&QEFQEUHKNGRFH *662 #EEGRV KOCIGIKH KOCIGZZDKVOCR KOCIGLRGI KOCIGRLRGI KOCIGRPI
  • 
  • #EEGRV%JCTUGV KUQ
  • WVH #EEGRV'PEQFKPI IKR #EEGRV.CPIWCIG GPRFH %QPPGEVKQP -GGR#NKXG *QUV YYYGZCORNGEQO 7UGT#IGPV /QKNNC 9KPFQYU 06  7 *662  1- %QPVGPV.GPIJV  #EEGRV4CPIGU D[VGU .CUV/QFKHKGF (TK  ,WP   )/6 %QPPGEVKQP ENQUG %QPVGPV6[RG CRRNKECVKQPRFH )'6 5GPF#P[&QEFQEUHKNGRFH *662 #EEGRV KOCIGIKH KOCIGZZDKVOCR KOCIGLRGI KOCIGRLRGI KOCIGRPI
  • 
  • 1 Mo liwość tę wykorzystują równie coraz popularniejsze programy, zwane mened erami pobierania (download manager). W przypadku zerwania połączenia podczas pobierania du ego pliku, program próbuje, przy ponownej inicjacji połączenia, rozpocząć pobieranie od miejsca, w którym zostało przerwane — przyp. tłum.
  • Rozdział 6. G Obsługa plików 187 #EEGRV%JCTUGV KUQ
  • WVH #EEGRV'PEQFKPI IKR #EEGRV.CPIWCIG GPRFH %QPPGEVKQP -GGR#NKXG *QUV YYYGZCORNGEQO 4CPIG D[VGU =TGUVC WUWPKúVC? 4GSWGUV4CPIG D[VGU =TGUVC WUWPKúVC? 7UGT#IGPV /QKNNC 9KPFQYU 06  7 *662  2CTVKCN %QPVGPV %QPVGPV.GPIJV  #EEGRV4CPIGU D[VGU .CUV/QFKHKGF (TK  ,WP   )/6 %QPPGEVKQP ENQUG %QPVGPV6[RG OWNVKRCTVZD[VGTCPIGU DQWPFCT[DEDGCG Metody UGVAD[VGTCPIG i GCEJAD[VGTCPIG stanowią klucz do dynamicznego wysyłania do- kumentów PDF. Obie zostają dodane do klasy #RCEJG po zaimportowaniu (przy u yciu instrukcji WUG) klasy #RCEJG(KNG. Pierwsza analizuje nagłówki ądania, a następnie ustawia odpowied- nio nagłówki %QPVGPV6[RG i %QPVGPV4CPIG w razie potrzeby. Poniewa wartość nagłówka %QPVGPV4CPIG zale y od wielkości zawartości, musimy wywołać metodę UGVAEQPVGPVA NGPIVJ przed wywołaniem metody UGVAD[VGTCPIG , która z kolei musi zostać wywołana przed metodą UGPFAJVVRAJGCFGT — kolejność jest tu bardzo istotna. Kiedy zostanie ju stwierdzone, e ądano fragmentów pliku, wywołanie metody GCEJAD[VGTCPIG zwraca listę par, zawierających początek i długość ka dego fragmentu ądanego przez klienta. Mo emy u yć tej listy, aby pobrać odpowiednie fragmenty pliku i przesłać je klientowi. W naszym przykładzie pobieraliśmy plik z bazy danych, ale je eli obsługujemy dynamicznie ądania fragmentów plików statycznych na dysku, lepszym rozwiązaniem będzie u yć dwuar- gumentowej wersji metody UGPFAHF , omówionej w zadaniu 6.3, ni wczytywać cały plik do pamięci i dzielić na fragmenty za pomocą funkcji UWDUVT . Na przykład w pętli przetwarzają- cej listę zwróconą przez metodę GCEJAD[VGTCPIG w naszym programie obsługi moglibyśmy wprowadzić następujące zmiany, aby przetwarzać pliki statyczne: KH TCPIGATGSWGUV ] YJKNG O[ QHHUGV NGPIVJ  T GCEJAD[VGTCPIG ] UGGM HJ QHHUGV  T UGPFAHF HJ NGPIVJ  _ _ GNUG ] T UGPFAHF HJ  _ 6.8. Nagłówki związane z datami Chcemy bezpośrednio odczytywać i zmieniać wartość nagłówków związanych z datami.
  • 188 Część II G Interfejs API modułu mod_perl Rozwiązanie U yjemy funkcji JVAVKOG i RCTUGFCVG , dostarczonych przez klasę #RCEJG7VKN. T NQI KPHQ 0CI ÎYGM .CUV/QFKHKGF WUVCYKQP[ PC  #RCEJG7VKNJVAVKOG T OVKOG  Komentarz Poniewa omawiamy teraz nagłówki związane z datami, jest to dobre miejsce, aby szerzej omówić dwie metody z klasy #RCEJG7VKN, o których wspomnieliśmy tylko w rozdziale 5. Funkcje JVAVKOG i RCTUGFCVG zapewniają wygodny sposób konwersji dat między forma- tem protokołu HTTP a liczbą sekund od początku epoki, którą zwraca wiele funkcji perlo- wych. Funkcja RCTUGFCVG przelicza datę z formatu HTTP na odpowiednią liczbę sekund od początku epoki. Funkcja JVAVKOG zamienia sekundy na datę w formacie HTTP, która zawsze jest wyra ana w czasie GMT. Chocia te metody są wygodne, nie zawsze mogą wykonać za nas całą pracę. Na przykład je- eli obliczamy liczbę sekund w innej strefie czasowej ni GMT (jak na wydruku 6.9), będzie- my musieli wykonać konwersję samodzielnie, u ywając modułu, takiego jak 6KOG2KGEG. 6.9. Opró nianie buforów wyjściowych Chcemy opró nić wewnętrzne bufory wyjściowe serwera Apache. Rozwiązanie U yjemy metody #RCEJG THNWUJ . YJKNG  HJ ] 9[RKUWLGO[ MC F[ YKGTU RNKMW K Y[U[ CO[ IQ QF TCW FQ MNKGPVC $CTFQ [ RQO[U Y YKúMUQ EK Y[RCFMÎY RTKPV T THNWUJ _ Komentarz Serwer Apache w normalnych warunkach buforuje dane wypisywane przez program obsługi, wysyłając je do klienta dopiero, kiedy bufor jest pełny albo program obsługi zakończy działanie. Mogą się jednak zdarzyć sytuacje, kiedy trzeba wysłać dane do klienta natychmiast, na przykład
  • Rozdział 6. G Obsługa plików 189 gdy nasz program jest w trakcie jakiegoś relatywnie długiego procesu i chcielibyśmy, aby w tym czasie pojawiło się coś w przeglądarce klienta. W takim przypadku mo emy u yć me- tody T THNWUJ , aby opró nić bufor. Nale y jednak u ywać jej z umiarem, gdy obni a znacznie wydajność serwera. Jako przykład a tak e przypomnienie kilku metod, które poznaliśmy dotychczas, rozwa my następujący program obsługi, który wybiera losowy obraz z katalogu ServerRoot/icons i wy- syła go klientowi. Wydruk 6.10. Moduł SendIcon.pm RCEMCIG %QQMDQQM5GPF+EQP WUG #RCEJG%QPUVCPVU SY 1- 5'48'4A'4414  WUG #RCEJG(KNG WUG &KT*CPFNG WUG UVTKEV UWD JCPFNGT ] O[ T  UJKHV 2QDKGTCO[ RQ Q GPKG RQFMCVCNQIW KEQPU YINúFGO 5GTXGT4QQV O[ KEQPU  T UGTXGTATQQVATGNCVKXG KEQPU  O[ FJ  &KT*CPFNG PGY KEQPU  WPNGUU FJ ] T NQIAGTTQT 0KG OQ PC QVYQT[è MCVCNQIW KEQPU  TGVWTP 5'48'4A'4414 _ 2QDKGTCO[ CYCTVQ è MCVCNQIW K FQFCLGO[ FQ NKUV[ "KEQPU YU[UVMKG PCNGKQPG RNKMW V[RW )+( O[ "KEQPU HQTGCEJ O[ KEQP FJ TGCF ] O[ UWD  T NQQMWRAWTK KEQPU KEQP  PGZV WPNGUU UWD EQPVGPVAV[RG GS KOCIGIKH  RWUJ "KEQPU UWD HKNGPCOG _ 9[DKGTCO[ NQUQY[ QDTC O[ KOCIG  KEQPU=TCPF "KEQPU? 1VYKGTCO[ Y[DTCP[ RNKM QDTCW K Y[U[ CO[ IQ MNKGPVQYK O[ HJ  #RCEJG(KNG PGY KOCIG  WPNGUU HJ ] T NQIAGTTQT 0KG OQ PC QVYQT[è RNKMW KOCIG  TGVWTP 5'48'4A'4414 _ DKPOQFG HJ Y[OCICPG FNC U[UVGOÎY 9KP T UGPFAJVVRAJGCFGT KOCIGIKH 
  • 190 Część II G Interfejs API modułu mod_perl T UGPFAHF HJ  1RTÎ PKCO[ DWHQT CD[ QDTC QUVC Y[U CP[ PCV[EJOKCUV T THNWUJ 5[OWNWLGO[ LCMK F WIQVTYC [ RTQEGU UNGGR   TGVWTP 1- _  Bez wywołania metody T THNWUJ klient nie ujrzałby obrazu, zanim nie skończyłby się długotrwały proces (w naszym przykładzie symulowany wywołaniem funkcji UNGGR ). Jed- nak e, podkreślamy po raz kolejny, metoda T THNWUJ mo e znacznie obni yć wydajność serwera, więc powinna być u ywana tylko w razie potrzeby. 6.10. Przekierowanie uchwytów plików wyjściowych Chcemy zmienić domyślne przypisanie strumieni wyjściowych 56&176 i 56&'44. Rozwiązanie U yjemy interfejsu 6+'*#0&.', pochodzącego z klasy #RCEJG lub innej, aby zmienić zachowa- nie uchwytów plików. Wydruk 6.11. Przykładowy program obsługi WUG #RCEJG%QPUVCPVU SY 1- 5'48'4A'4414  WUG 0GV(62 WUG UVTKEV UWD JCPFNGT ] O[ T  UJKHV TGVWTP 5'48'4A'4414 WPNGUU EJFKT VOR  T UGPFAJVVRAJGCFGT VGZVRNCKP  2TGMKGTQYWLGO[ UVTWOKG 56&'44 FQ RTGINæFCTMK MNKGPVC 9 VGP URQUÎD WMC G OW UKú EC C MQOWPKMCELC UGTYGTGO (62 VKG
  • 56&'44 #RCEJG 
  • Rozdział 6. G Obsługa plików 191 O[ HVR  0GV(62 PGY HVRERCPQTI  &GDWI    HVR NQIKP CPQP[OQWU  HVR DKPCT[ HVR EYF RWD%2#0OQFWNGUD[OQFWNG#RCEJG  HVR IGV OQFARGTNVCTI  HVR SWKV 5VTWOKG 56&'44 RQPQYPKG UMKGTQYCP[ FQ FKGPPKMC D úFÎY WPVKG
  • 56&'44 TGVWTP 1- _ Komentarz Mechanizm VKG to „zdradzieckie” narzędzie, które mo e zostać u yte do zmiany zachowania wielu perlowych typów danych. W zadaniu 2.17 widzieliśmy, jak mo na dowiązać (tie) mapę do klasy 6KG&Z*CUJ, aby zachować kolejność wstawiania elementów i umo liwić powtarza- nie się kluczy — normalnie mapa nie dopuszcza takiej funkcjonalności. Tak samo łatwo mo- emy za pomocą instrukcji VKG zmusić uchwyty plików 56&176 i 56&'44 do wykonania na- szych „diabelskich sztuczek”. Moduł mod_perl podłącza strumienie 56&176 i 56&+0 do przeglądarki klienta, u ywając inter- fejsu 6+'*#0&.' z klasy #RCEJG, natomiast 56&'44 jest kierowany do pliku wskazanego przez wartość GTTQTANQI w rekordzie serwera. Chocia nie ma du ego sensu przekierowywanie strumienia 56&+0, to samo w przypadku strumieni wyjściowych mo e przynieść nieoczekiwa- ne korzyści w rękach cudotwórców, magików, guru i tym podobnych. Mo emy poczuć sma- czek tej „magii”, kiedy u ywamy klasy #RCEJG(KNVGT do łączenia wyniku działania kilku perlowych programów obsługi — w serwerze Apache 1.3 filtrowanie danych wyjściowych jest po prostu niemo liwe przy u yciu istniejącego interfejsu API języka C. Programy obsługi modułu mod_perl mogą ominąć to ograniczenie, u ywając przekierowanych uchwytów pli- ków i paru innych, bardzo pomysłowych rozwiązań, aby osiągnąć imponujące rezultaty. W zadaniu 15.4 mamy przykład, jak u ywać klasy #RCEJG(KNVGT. Je eli interesuje nas przekierowanie strumienia 56&176 zamiast 56&'44, mo emy go dowiązać do klasy, takiej jak +15VTKPI, +15ECNCT (z dystrybucji +1UVTKPI[) lub naszego własnego interfejsu 6+'*#0&.'. Nale y tylko pamiętać, aby „zwrócić” strumień 56&176 do serwera Apache, kiedy skończymy. Oto bardzo prosty przykład. Wydruk 6.12. Przekierowanie strumienia STDOUT WUG #RCEJG%QPUVCPVU SY 1-  WUG +15ECNCT WUG UVTKEV UWD JCPFNGT ] O[ T  UJKHV
  • 192 Część II G Interfejs API modułu mod_perl O[ UVTKPI T UGPFAJVVRAJGCFGT VGZVRNCKP  RTKPV ,GUEG PKGFQYKæCP[>P  VKG
  • 56&176 +35ECNCT  > UVTKPI RTKPV 2KUGO[ FQ OKGPPGL > UVTKPI  VKG
  • 56&176 #RCEJG  RTKPV 2QPQYPKG FQYKæCP[ UVTKPI>P  TGVWTP 1- _ Aby nasz program zachowywał się grzecznie i przewidywalnie, nie powinniśmy zakładać, e strumień 56&176 jest dowiązany do klasy #RCEJG. Właściwe rozwiązanie polega na zapamiętaniu klasy, do której strumień był dowiązany i odtworzenie go, kiedy skończymy ju nasze „czary”. O[ QNF  TGH VKGF
  • 56&176  CDTCVKGMCFCDTC VKG
  • 56&176 QNF