PHP5 Zaawansowane tworzenie stron WWW Szybki start


PHP5. Zaawansowane
tworzenie stron WWW.
Szybki start
Autor: Larry Ullman
Tłumaczenie: Radosław Meryk
ISBN: 78-83-246-1171-3
Tytuł oryginału: PHP 5 Advanced for the World
Wide Web: Visual QuickPro Guide (2nd Edition)
Format: B5, stron: około 6002
Kurs zaawansowanych technik programistycznych w języku PHP
" Programowanie obiektowe
" Komunikacja z bazami danych
" Korzystanie z technologii Ajax
PHP to dziS jeden z najpopularniejszych języków programowania stosowanych
do tworzenia aplikacji i witryn internetowych. Za jego pomocą powstały setki tysięcy
blogów, galerii, portali, sklepów internetowych, serwisów społecznoSciowych i innych
stron WWW. PHP jest prosty, ma czytelną składnię i duże możliwoSci, a jego najnowsza
wersja  PHP5  umożliwia wykorzystanie wszystkich zalet, jakie płyną z programowania
obiektowego. Skrypty PHP łatwo połączyć z bazami danych i stosować razem z innymi
technologiami, np. z zyskującym coraz większe uznanie Ajaksem.
Książka  PHP5. Zaawansowane tworzenie stron WWW. Szybki start to wprowadzenie do
rozwiązywania przy użyciu tego języka bardziej złożonych zagadnień programistycznych.
CzytajÄ…c jÄ…, poznasz zasady programowania obiektowego, komunikacji z bazami danych,
zabezpieczania aplikacji i poprawy ich wydajnoSci. Dowiesz się, jak projektować złożone
aplikacje sieciowe i tworzyć dokumentację projektową. Przeczytasz o interakcji skryptów
PHP z serwerem i technikach uruchamiania ich z poziomu wiersza poleceń. Znajdziesz tu
także informacje o tworzeniu aplikacji e-commerce. Ostatni rozdział został poSwięcony
technologii Ajax w skryptach PHP.
" Projektowanie aplikacji i dokumentowanie kodu
" Przechowywanie danych sesji w bazie
" Zabezpieczanie aplikacji WWW
" Tworzenie elementów sklepów internetowych
" Komunikacja z innymi witrynami WWW
Wydawnictwo Helion
" Interakcja z serwerem
ul. KoSciuszki 1c
" Uruchamianie skryptów PHP z wiersza poleceń
44-100 Gliwice
" Korzystanie z repozytorium PEAR
tel. 032 230 98 63
" Technologia Ajax w PHP
e-mail: helion@helion.pl
Pokonaj kolejny etap w PHP
i zostań ekspertem w dziedzinie programowania
Spis treści
Spis treści
Wprowadzenie 9
Rozdział 1. Zaawansowane techniki programowania w PHP 17
Tablice wielowymiarowe ..................................................................................... 18
Definiowanie zaawansowanych funkcji .............................................................. 34
Składnia heredoc .................................................................................................. 47
Korzystanie z funkcji printf() i sprintf() ............................................................... 53
Rozdział 2. Projektowanie aplikacji WWW 59
Dokumentowanie kodu ........................................................................................ 60
Styl i struktura kodu ............................................................................................. 63
Modularyzacja witryny WWW ............................................................................ 65
Operacje z buforem przeglÄ…darki ........................................................................ 90
Rozdział 3. Zaawansowane zagadnienia dotyczące baz danych 97
Zapisywanie danych sesji w bazie danych .......................................................... 98
Przetwarzanie kodów pocztowych .................................................................... 112
Tworzenie funkcji składowanych ...................................................................... 126
Wyświetlanie wyników w układzie poziomym ................................................. 132
Rozdział 4. Techniki zabezpieczania stron WWW 139
Podstawy ............................................................................................................. 140
Sprawdzanie poprawności danych przesyłanych za pomocą formularzy ........... 142
Korzystanie z biblioteki Filter z repozytorium PECL ..................................... 152
Uwierzytelnianie z wykorzystaniem pakietu Auth z repozytorium PEAR ......... 159
Korzystanie z pakietu MCrypt .......................................................................... 173
Rozdział 5. Techniki e-commerce 185
Pojęcia związane z dziedziną e-commerce ....................................................... 186
Tworzenie bazy danych ..................................................................................... 187
Tworzenie pliku konfiguracyjnego .................................................................... 199
Tworzenie szablonu ........................................................................................... 206
Tworzenie strony głównej ................................................................................. 213
Przeglądanie towarów według kategorii ........................................................... 215
5
Spis treści
Spis treści
Wyświetlanie informacji o produkcie ................................................................ 221
Implementacja koszyka na zakupy .................................................................... 228
Sprawdzanie ważności karty kredytowej .......................................................... 240
Rozdział 6. Podstawy programowania obiektowego 249
Teoria programowania obiektowego ................................................................. 250
Definiowanie klas ............................................................................................... 251
Tworzenie obiektu ............................................................................................. 256
Atrybut $this ....................................................................................................... 260
Tworzenie konstruktorów .................................................................................. 267
Tworzenie destruktorów .................................................................................... 272
Automatyczne Å‚adowanie klas ............................................................................ 276
Rozdział 7. Zaawansowane programowanie obiektowe 279
Zaawansowane teorie ......................................................................................... 280
Dziedziczenie klas ............................................................................................. 282
Dziedziczenie konstruktorów i destruktorów ................................................... 287
Przesłanianie metod ........................................................................................... 292
Kontrola dostępu ................................................................................................ 297
Stosowanie operatora zasięgu ............................................................................ 305
Tworzenie składowych statycznych .................................................................. 310
Klasy i metody abstrakcyjne .............................................................................. 316
Rozdział 8. Praktyczne zastosowania technik obiektowych 325
Przechwytywanie wyjątków ............................................................................... 326
Rozszerzanie klasy Exception ............................................................................ 333
Tworzenie klasy koszyka na zakupy .................................................................. 344
Posługiwanie się klasą koszyka na zakupy ........................................................ 356
Rozdział 9. PHP w sieci 363
Dostęp do innych witryn WWW ....................................................................... 364
Obsługa gniazd ................................................................................................... 371
Identyfikacja geograficzna adresu IP ................................................................ 379
Korzystanie z cURL ........................................................................................... 384
Rozdział 10. PHP a serwer 389
Kompresowanie plików ..................................................................................... 390
PHP-GTK ........................................................................................................... 401
Korzystanie z serwisu cron ................................................................................ 415
Planowanie zadań w systemie Windows ........................................................... 418
Wykorzystanie modułu COM w PHP ............................................................... 420
6
Spis treści
Spis treści
Rozdział 11. PHP w wierszu polecenia 433
Testowanie instalacji .......................................................................................... 434
Uruchamianie fragmentów kodu ....................................................................... 438
Tworzenie skryptu działającego w wierszu polecenia ...................................... 440
Uruchamianie skryptów działających w wierszu polecenia ............................. 444
Wykorzystanie argumentów wiersza polecenia ................................................ 448
Pobieranie danych wejściowych ........................................................................ 453
Rozdział 12. Korzystanie z PEAR 459
Korzystanie z pakietu Benchmark ..................................................................... 460
Korzystanie z klasy HTML_QuickForm ........................................................... 472
Korzystanie z pakietu Mail_Mime .................................................................... 485
Rozdział 13. Ajax 497
Wprowadzenie do Ajaksa ................................................................................... 498
Prosty przykład ................................................................................................... 500
Ajax w pełnej krasie ........................................................................................... 522
Debugowanie aplikacji Ajax .............................................................................. 539
Rozdział 14. XML i PHP 545
Czym jest XML? ................................................................................................ 546
Składnia XML .................................................................................................... 548
Atrybuty, puste elementy i encje ....................................................................... 552
Definicje typu dokumentów .............................................................................. 556
Parsowanie dokumentu XML ............................................................................ 564
Tworzenie kanałów RSS .................................................................................... 578
Skorowidz 585
7
Spis treści
Projektowanie
aplikacji WWW
Rozdział 2. Projektowanie aplikacji WWW
Kariera programisty PHP zazwyczaj rozpoczyna się od tworzenia pojedynczych skryptów,
przeznaczonych do wykonania określonego zadania. Na ich bazie zwykle zaczynamy definiować coraz
to więcej plików, aż w końcu powstaje aplikacja internetowa. W końcu tworzymy witryny działające
na własnym serwerze, a nawet korzystające z wielu serwerów. Niezależnie od stopnia złożoności
projektu, nauczenie się nowych i lepszych sposobów tworzenia aplikacji internetowych to istotna
część życia programisty języka PHP. Warto o tym pamiętać.
W tym rozdziale skoncentrowano siÄ™ na tworzeniu aplikacji internetowych wykraczajÄ…cych
poza poziom początkującego lub średnio zaawansowanego programisty. Założono, że Czytelnicy
potrafią posługiwać się standardowymi mechanizmami stosowanymi w aplikacjach internetowych,
takimi jak sesje i szablony. Omówione tematy służą zarówno ugruntowaniu podstaw (które w dużych
projektach nabierają większego znaczenia), jak i zmianie sposobu tworzenia stron WWW.
Rozdział kończy się omówieniem dwóch rodzajów buforowania usprawniających komunikację
pomiędzy częścią kliencką a serwerową aplikacji.
59
Projektowanie aplikacji WWW
Rozdział 2.
Dokumentowanie kodu
Właściwe dokumentowanie kodu jest tak ważne,
że życzyłbym sobie, aby interpreter PHP
generował błędy w przypadku napotkania kodu
pozbawionego komentarzy. Wiem z mojego
wieloletniego doświadczenia w nauczaniu języka
PHP i kontaktów z Czytelnikami, że komentarze
są bardzo często zaniedbywane. Czasami
programiści odkładają wstawianie komentarzy
na tzw.  pózniej (którego zwykle nigdy nie ma).
Prawidłowe dokumentowanie kodu jest czymś,
co warto robić dla własnego dobra, dla dobra
klientów, współpracowników oraz programistów,
którym przypadnie w udziale wprowadzanie
poprawek do naszej pracy. Trzeba to robić nawet
wtedy, a może zwłaszcza wtedy, gdy to my sami
będziemy tymi programistami.
Można zaryzykować stwierdzenie, że dokumentacji
nigdy za wiele. Warto robić notatki dotyczące
funkcji, zmiennych, fragmentów kodu i całych
stron. Należy także pamiętać, że dokumentowanie
trzeba rozpocząć razem z kodowaniem
i kontynuować przez cały czas trwania prac.
Powrócenie do kodu w pózniejszym czasie w celu
Komentarze i spacje
wprowadzenia notatek to nie to samo (często się
w przykładach w tej książce
zdarza, że jeśli czegoś nie zrobimy od razu, nie
zrobimy tego nigdy). Coś, co wydaje się oczywiste Z powodu ograniczeń wynikających
z formatu książkowego skrypty
w momencie tworzenia, zaledwie trzy miesiÄ…ce
zaprezentowane w tej książce nigdy
pózniej okazuje się bardzo zagmatwane.
nie sÄ… tak dobrze udokumentowane,
jakbym sobie tego życzył (i jak powinienem
je udokumentować). Istnieją jednak granice
w zapełnianiu cennego miejsca w książce
notatkami w stylu:
// Opracował: Larry E. Ullman.
Zakładam, że Czytelnicy uczą się PHP
ode mnie i z tej książki. W związku z tym
w kwestii dokumentowania kodu i układu
komentarzy zalecam przyjęcie wzoru z tej
książki za niezbędne minimum. Objętość
komentarzy w tej książce być może nie
jest zbyt mała, ale bez szkody dla nikogo
mogłaby być dwukrotnie większa.
60
Dokumentowanie kodu
Projektowanie aplikacji WWW
Aby właściwie udokumentować kod:
1. Na początku skryptu dokładnie opisz
wszystkie metawłaściwości.
Metawłaściwości odnoszą się do informacji
na temat pliku: kto go utworzył, kiedy, dlaczego,
w ramach jakiej witryny itp. Można tu również
umieścić informacje dotyczące autora skryptu,
nawet jeśli wydaje się nam, że nikt inny nigdy
nie będzie go oglądał.
2. Opisz wszystkie elementy środowiska.
Jest to dokładniejszy typ dokumentacji od tej,
którą stworzyliśmy w punkcie 1. Przez pojęcie
 elementy środowiska rozumiem wszystko to,
co musi istnieć lub być wykonane, aby skrypt
mógł działać zgodnie z przeznaczeniem.
Czy skrypt pobiera informacje z bazy danych?
Czy wymaga repozytorium PEAR lub innego
kodu zewnętrznego? Czy korzysta z szablonu?
Ogólnie rzecz biorąc, należy wymienić wszystkie
pliki, z którymi skrypt się komunikuje lub
z których korzysta. Jeśli skrypt ma jakieś
wymagania dotyczÄ…ce minimalnej wersji PHP,
również to należy zanotować.
3. Dokładnie opisz wszystkie funkcje.
Funkcje należy opisywać tak samo jak skrypty:
ich przeznaczenie, zależności, pobierane
wartości, zwracane wyniki itp.
4. Zrób notatki opisujące przeznaczenie
zmiennych, jeśli nazwy nie są oczywiste
dla początkujących programistów.
Nazwy zmiennych powinny dobrze opisywać
ich przeznaczenie. Nie zawsze jednak można
założyć, że będą one czytelne dla wszystkich.
5. Objaśnij przeznaczenie fragmentów kodu.
61
Dokumentowanie kodu
Rozdział 2.
6. Opisz przeznaczenie instrukcji warunkowych.
Wskazówki
Upewnij się, że powód użycia warunku nie
W modułach wchodzących w skład
ulega wątpliwości oraz że pożądane wyniki
repozytorium PEAR wykorzystuje siÄ™
są czytelne. Jeśli w instrukcji warunkowej
program phpDocumentor (www.phpdoc.org
występuje odwołanie do określonej liczby
 rysunek 2.1), który automatycznie
lub wartości, napisz w komentarzu, do czego
generuje dokumentację pakietów.
służy ta liczba lub wartość.
Narzędzie to jest napisane w PHP
i przypomina popularny system JavaDoc
7. Oznacz zamykajÄ…ce nawiasy klamrowe
(używany przez programistów Javy). Jego
złożonych funkcji i konstrukcji sterujących
działanie polega na analizowaniu kodu
(instrukcji warunkowych, pętli itp.).
i tworzeniu odpowiednich komentarzy
W moich skryptach bardzo często występuje
w skryptach. Automatycznie
zapis następującej postaci:
wygenerowanych komentarzy nie należy
używać zamiast komentarzy pisanych
} // Koniec funkcji nazwa_funkcji().
samodzielnie, ale można je wykorzystać
8. Pamiętaj o zaktualizowaniu komentarzy
jako standardowÄ… dokumentacjÄ™ stron.
po wprowadzeniu modyfikacji w kodzie.
Nieco przestarzały, ale w dalszym ciągu
Oto częsty błąd, stwarzający wiele problemów:
przydatny jest dokument o nazwie PHP
zaktualizowano kod, ale bez modyfikacji
Coding Standard, opisujÄ…cy standardy
w komentarzach. Kiedy powrócimy do kodu
kodowania w PHP. Warto go przeczytać,
za jakiś czas, przeczytamy, że kod wykonuje
nawet jeśli nie zawsze będziemy stosować
operację X, podczas gdy w rzeczywistości
siÄ™ do opisanych w nim zasad. Niestety,
wykonuje operacjÄ™ Y. W zwiÄ…zku z tym trudno
adres URL dokumentu często się zmienia,
nam będzie stwierdzić, czy działa tak,
zatem by go znalezć, trzeba skorzystać
jak powinien.
z wyszukiwarki.
Wiele sugestii dotyczÄ…cych sposobu
wprowadzania komentarzy, ich stylu
i struktury można również znalezć,
studiujÄ…c standardy kodowania dla innych
języków.
62
Dokumentowanie kodu
Projektowanie aplikacji WWW
Styl i struktura kodu
Drugim tematem, który można przypisać
do kategorii  warto przestrzegać tych zasad,
choć właściwie nie służą niczemu konkretnemu ,
jest styl kodowania i struktury kodu. Najbardziej
podstawowe zasady dotyczÄ…ce struktury kodu
mówią o sposobach stosowania wcięć w kodzie,
pozostawiania pustych wierszy, stosowania
nawiasów klamrowych itp. Samo stosowanie
właściwej składni implikuje określoną strukturę
kodu, są jednak dwie  złote zasady:
należy zachować spójność kodu,
należy zadbać o to, by kod był czytelny.
Trzeba bardzo mocno podkreślić, że zachowanie
spójności ma znaczenie podstawowe. Niespójność
prowadzi do powstania wielu błędów i wymaga
dodatkowego czasu, który trzeba poświęcić na ich
usuwanie.
Styl w całości zależy od preferencji Styl to sprawa znacznie bardziej subiektywna.
programisty. Wszelkie rekomendacje, Obejmuje stosowanie konwencji nazewnictwa
włącznie z tymi, których ja udzielam, są (stron, zmiennych, klas i funkcji), miejsc,
tylko sugestiami. Trzeba jedynie dbać w których można definiować funkcje,
o zachowanie spójności. sposobów ich organizacji itp.
Rysunek 2.1.
Macierzysta
strona programu
phpDocumentor
63
Styl i struktura kodu
Rozdział 2.
Aby kod miał właściwą strukturę i styl: Używaj pustych wierszy do wizualnego
oddzielania fragmentów kodu.
Zawsze używaj nawiasów klamrowych, nawet
jeśli z punktu widzenia poprawności składniowej Tam, gdzie pozwala na to składnia, używaj
są one zbędne. spacji pomiędzy słowami, argumentami
funkcji, operatorami itp. (ogólnie rzecz
Wielu programistów ignoruje to zalecenie,
biorÄ…c, spacje wewnÄ…trz kodu w PHP
jednak stosowanie nawiasów klamrowych
nie majÄ… znaczenia).
w każdym przypadku umożliwia uniknięcie
wielu błędów. Umieszczaj funkcje na początku skryptu
lub w osobnym pliku.
Stosuj wcięcia dla bloków kodu (np. treści
instrukcji warunkowych lub instrukcji wewnątrz Zawsze używaj formalnych znaczników
funkcji)  najlepiej o szerokości jednej tabulacji PHP.
lub czterech spacji (z punktu widzenia
Ponieważ krótkie znaczniki () mają
formalnego należy używać spacji zamiast
specjalne znaczenie w języku XML,
tabulacji, ale programiści często używają
w przypadku korzystania z XML zawsze
tabulacji, ponieważ są one wygodniejsze).
należy używać formalnych znaczników
Właściwe stosowanie wcięć w kodzie PHP (). Więcej informacji na ten
bezpośrednio przekłada się na jego czytelność. temat można znalezć w rozdziale 14.,
Wcięcia umożliwiają oznaczenie czytelnych  XML i PHP . Zaleca się używanie
relacji pomiędzy kodem a strukturami formalnych znaczników PHP niezależnie
sterującymi (pętlami, instrukcjami warunkowymi od sytuacji, ponieważ jest to najlepszy
itp.), funkcjami, klasami i innymi elementami, sposób zapewnienia zgodności kodu
których częścią jest określony kod. pomiędzy różnymi serwerami.
Struktura serwisu
Podczas tworzenia większych aplikacji internetowych istotne są nie tylko struktura kodu i jego
dokumentowanie, ale także  w równym stopniu  struktura serwisu, czyli sposób organizacji
plików i ich zapisywania na serwerze. Zachowanie właściwej struktury serwisu ma na celu poprawę
bezpieczeństwa i ułatwienie administracji, a także poprawę skalowalności, przenośności i łatwości
wprowadzania zmian.
Kluczowe znaczenie dla stworzenia właściwej struktury serwisu ma podział kodu i aplikacji na strony
i katalogi zgodnie z ich zastosowaniem, przeznaczeniem i funkcją. Wewnątrz głównego katalogu
dokumentów witryny, który nosi nazwę html, powinien się znalezć osobny katalog na grafikę
(tak przynajmniej czyni większość programistów), osobny dla klas (jeśli używamy technik obiektowych),
dla funkcji itp. Co więcej, ze względów bezpieczeństwa zalecam stosowanie własnych nazw folderów.
Im trudniej złośliwemu użytkownikowi odgadnąć nazwy folderów i dokumentów, tym lepiej. Jeśli
ktoś zastosuje nazwę admin dla administracyjnej części witryny, z punktu widzenia bezpieczeństwa
nie wyświadczy sobie przysługi.
64
Styl i struktura kodu
Projektowanie aplikacji WWW
Zaleca siÄ™ stosowanie rozszerzenia .php
Modularyzacja witryny WWW
dla plików, których zawartość ma być
Wiem z doświadczenia, że większość programistów
interpretowana jako kod PHP (w przypadku
rozpoczyna swojÄ…  krzywÄ… rozwoju od pisania
skryptów włączanych, takich jak klasy
jednostronicowych aplikacji, które wykonują
i skrypty konfiguracyjne, można stosować
proste operacje. Aplikacje te przekształcają się
inne rozszerzenia).
w narzędzia złożone z dwóch stron i na koniec
Dozwolone rozszerzenia plików określa
w wielostronicowe witryny, w których stosuje się
konfiguracja serwera WWW, jednak
szablony, sesje i (lub) pliki cookie do powiÄ…zania
w społeczności programistów PHP
ich ze sobą. W przypadku wielu programistów
istnieje trend stosowania rozszerzenia
krzywa rozwoju jest właściwie  krzywą dzwonu .
.php jako domyślnego.
W miarę zdobywania doświadczenia programista
PHP zaczyna wykonywać tę samą liczbę operacji
za pomocą mniejszej liczby stron  na przykład
wykorzystuje ten sam skrypt zarówno
do wyświetlania, jak i do obsługi formularza.
Inni zaawansowani programiści zaczynają tworzyć
pojedyncze skrypty, które wykonują mniej działań,
bowiem każdy ze skryptów koncentruje się
na osobnym zadaniu. Jest to jedna z przesłanek
modularyzacji witryny WWW.
Dla potrzeb tego przykładu utworzę witrynę-atrapę
(tzn. taką, która nie będzie wykonywała zbyt wielu
działań) i podzielę ją na części. Z pokazanego
przykładu Czytelnicy dowiedzą się, w jaki sposób
wydziela się poszczególne funkcje, jak należy
je zorganizować i połączyć ze sobą. Zamiast
używania wielu stron (contact.php, about.php,
index.php itp.), cała aplikacja będzie działać
za pośrednictwem jednej głównej strony. Strona
będzie włączała odpowiedni moduł na podstawie
wartości przekazywanych za pośrednictwem
adresu URL.
65
Modularyzacja witryny WWW
Rozdział 2.
Tworzenie pliku konfiguracyjnego
Każda aplikacja internetowa, jaką tworzę,
rozpoczyna siÄ™ od pliku konfiguracyjnego.
Pliki konfiguracyjne spełniają kilka funkcji.
Cztery najważniejsze to:
definicja stałych,
zdefiniowanie parametrów obowiązujących
w całej witrynie,
utworzenie funkcji użytkownika,
obsługa błędów.
Ogólnie rzecz biorąc, wszystkie dane, do których
jest potrzebny dostęp z poziomu każdej strony
w witrynie, powinny być zapisane w pliku
konfiguracyjnym (jeśli funkcja nie będzie używana
przez większość stron witryny, lepiej umieścić ją
w osobnym pliku; w ten sposób unikamy
dodatkowych kosztów związanych z definiowaniem
funkcji na stronach, na których nie będzie używana).
Aby utworzyć plik konfiguracyjny:
1. Utwórz nowy skrypt PHP w edytorze tekstu
lub środowisku IDE (skrypt 2.1):
Skrypt 2.1. Plik konfiguracyjny to skrypt o kluczowym znaczeniu. Definiuje stałe obowiązujące w całym skrypcie
oraz decyduje o sposobie obsługi błędów
1 2
3 /*
4 *Nazwa pliku: config.inc.php
5 *Utworzony przez: Larry E. Ullman z firmy DMC Insights, Inc.
6 *Kontakt: LarryUllman@DMCInsights.com, http://www.dmcinsights.com
7 *Data ostatniej modyfikacji: 8 listopada 2006
8 *
9 *Plik konfiguracyjny spełnia następujące zadania:
10 * - definiuje wszystkie parametry witryny w jednej lokalizacji,
66
Modularyzacja witryny WWW
Projektowanie aplikacji WWW
Skrypt 2.1.  ciÄ…g dalszy
11 * - zawiera adresy URL i URI w formie stałych,
12 * - określa sposób obsługi błędów.
13 */
14
15 # ******************** #
16 # ***** PARAMETRY ***** #
17
18 // Komunikaty o błędach są wysyłane pocztą elektroniczną.
19 $contact_email = 'adres@przyklad.pl';
20
21 // Sprawdzamy, czy skrypt pracuje na serwerze lokalnym,
22 // czy na serwerze produkcyjnym:
23 if (stristr($_SERVER['HTTP_HOST'], 'local') ||
(substr($_SERVER['HTTP_HOST'], 0, 7) == '192.168')) {
24 $local = TRUE;
25 } else {
26 $local = FALSE;
27 }
28
29 // Określenie lokalizacji plików i adresu URL witryny:
30 // umożliwienie pracy na innych serwerach.
31 if ($local) {
32
33 // Na serwerze lokalnym skrypt zawsze działa w trybie diagnostycznym:
34 $debug = TRUE;
35
36 // Definicja stałych:
37 define ('BASE_URI', '/ścieżka/do/folderu/html/');
38 define ('BASE_URL','http://localhost/katalog/');
39 define ('DB', '/ścieżka/do/mysql.inc.php');
40
41 } else {
42
43 define ('BASE_URI', '/ścieżka/do/produkcyjnego/folderu/html/');
44 define ('BASE_URL','http://www.przyklad.com/');
45 define ('DB', '/ścieżka/do/produkcyjnego/mysql.inc.php');
46
47 }
48
49 /*
50 *Najważniejsze ustawienia&
51 *Zmienna $debug służy do ustawienia obsługi błędów.
52 *W celu debugowania określonej strony należy dodać poniższy kod do strony index.php:
53
54 if ($p == 'thismodule') $debug = TRUE;
55 require_once('./include/config.inc.php');
56
57 *W celu debugowania całej witryny należy ustawić zmienną $debug
58
59 $debug = TRUE;
60
61 *przed następną instrukcją warunkową.
62 */
67
Modularyzacja witryny WWW
Rozdział 2.
Skrypt 2.1.  ciÄ…g dalszy
63
64 // Zakładamy, że debugowanie wyłączono.
65 if (!isset($debug)) {
66 $debug = FALSE;
67 }
68
69 # ***** PARAMETRY ***** #
70 # ******************** #
71
72
73 # **************************** #
74 # ***** OBSAUGA BADÓW ***** #
75
76 // Utworzenie procedury obsługi błędów.
77 function my_error_handler ($e_number, $e_message, $e_file, $e_line, $e_vars) {
78
79 global $debug, $contact_email;
80
81 // Stworzenie komunikatu o błędzie.
82 $message = "Wystąpił błąd w skrypcie '$e_file' w wierszu $e_line: \n />$e_message\n
";
83
84 // Umieszczenie daty i godziny.
85 $message .= "Data/godzina: " . date('n-j-Y H:i:s') . "\n
";
86
87 // Dołączenie zmiennej $e_vars do komunikatu $message.
88 $message .= "
" . print_r ($e_vars, 1) . "
\n
";
89
90 if ($debug) { // Wyświetlenie komunikatu o błędzie.
91
92 echo '

' . $message . '

';
93
94 } else {
95
96 // Zarejestrowanie błędu:
97 error_log ($message, 1, $contact_email); // Wysłanie wiadomości email.
98
99 // Wyświetlenie komunikatu o błędzie tylko wtedy, gdy nie jest to błąd klasy NOTICE lub STRICT.
100 if ( ($e_number != E_NOTICE) && ($e_number < 2048)) {
101 echo '

Wystąpił błąd systemowy. Przepraszamy za niedogodności.

';
102 }
103
104 } // Koniec instrukcji IF $debug.
105
106 } // Koniec definicji funkcji my_error_handler().
107
108 // Użycie procedury obsługi błędów:
109 set_error_handler ('my_error_handler');
110
111 # ***** OBSAUGA BADÓW ***** #
112 # **************************** #
113
114 ?>
68
Modularyzacja witryny WWW
Projektowanie aplikacji WWW
2. Dodaj komentarze opisujÄ…ce naturÄ™ Ja zawsze najpierw tworzÄ™ skrypty na serwerze
i przeznaczenie strony: lokalnym, a następnie kopiuję ukończoną
stronÄ™ na serwer docelowy. Te dwa
/*
środowiska charakteryzują się innymi
* Nazwa pliku: config.inc.php
* Utworzony przez: Larry E. Ullman z firmy
ustawieniami, zatem plik konfiguracyjny
DMC Insights, Inc.
powinien potwierdzić, w jakim środowisku
* Kontakt: LarryUllman@DMCInsights.com,
pracuje serwis. W celu sprawdzenia, czy
http://www.dmcinsights.com
witryna pracuje lokalnie, wykorzystałem
* Data ostatniej modyfikacji: 8 listopada 2006
*
dwie instrukcje warunkowe sprawdzajÄ…ce
* Plik konfiguracyjny spełnia następujące
parametr $_SERVER['HTTP_HOST']. Jeśli zmienna
zadania:
zawiera słowo local (na przykład
* - definiuje wszystkie parametry witryny
w jednej lokalizacji; http://localhost lub http://powerbook.local) albo
* - zawiera adresy URL i URI w formie stałych;
jeśli adres IP witryny zaczyna się od 192.168
* - określa sposób obsługi błędów.
(co wskazuje na sieć lokalną), wówczas
*/
ustawiamy zmienną $local na wartość TRUE.
Ponieważ plik konfiguracyjny jest wspólny
W przeciwnym przypadku ustawiamy jÄ…
dla całej witryny, powinien być najlepiej
na FALSE.
udokumentowanym skryptem w całym
5. Ustaw stałe specyficzne dla serwera.
serwisie.
if ($local) {
3. Ustaw adres e-mail, pod który będą
$debug = TRUE;
przesyłane zgłoszenia błędów: define ('BASE_URI',
'/ścieżka/do/folderu/html/'); define
$contact_email = 'adres@przyklad.com';
('BASE_URL','http://localhost/
katalog/');
W przypadku  żywych
define ('DB',
(tzw. produkcyjnych) witryn preferujÄ™
'/ścieżka/do/mysql.inc.php');
sposób powiadamiania o błędach
} else {
define ('BASE_URI', '/ścieżka/
za pomocÄ… poczty elektronicznej.
do/produkcyjnego/folderu/html/');
W związku z tym zadeklarowałem
define('BASE_URL',
zmienną, która definiuje adres docelowy
'http://www.przyklad.com/');
dla wiadomości. Może to być adres
define ('DB', '/ścieżka/
do/produkcyjnego/mysql.inc.php');
programisty w fazie testowej witryny
}
lub adres administratora po przekazaniu
jej do eksploatacji.
4. Sprawdz, czy skrypt działa na serwerze
 produkcyjnym czy testowym.
if (stristr($_SERVER['HTTP_HOST'],
'local') ||
(substr($_SERVER['HTTP_HOST'], 0, 7) ==
'192.168')) {
$local = TRUE;
} else {
$local = FALSE;
}
69
Modularyzacja witryny WWW
Rozdział 2.
W aplikacjach internetowych, które tworzę,
zawsze używam tych trzech stałych. Stała
BASE_URI zawiera bezwzględną ścieżkę
do głównego folderu witryny na serwerze
(rysunek 2.2). Dzięki tej stałej można z łatwością
korzystać z bezwzględnych adresów URL
w przypadku, gdy skrypt włącza plik. Stała
BASE_URL definiuje nazwę hosta i katalog (jeśli
serwis działa w podkatalogu). Na serwerze
testowym może to być na przykład
http://localhost/r02/. Na koniec ustawiliśmy
zmienną DB zawierającą bezwzględną ścieżkę
do pliku zawierającego parametry połączeń
z bazą danych. Ze względów bezpieczeństwa
plik ten należy zapisać poza głównym katalogiem
dokumentów witryny. Zwróćmy uwagę na to,
że dla każdej stałej istnieją dwie reprezentacje:
jedna dla serwera testowego i druga dla
produkcyjnego. W przypadku serwera testowego
Rysunek 2.2. Główna strona witryny jest zapisana
(zmienna $local ma wartość TRUE) dodatkowo
w głównym folderze serwisu. Wewnątrz tego folderu
włączyłem debugowanie. Wkrótce opiszę to
mogą być zdefiniowane podfoldery, na przykład
dokładniej.
grafika, include lub moduly
6. Ustawiamy poziom debugowania.
if (!isset($debug)) {
$debug = FALSE;
}
Do określenia sposobu obsługi błędów użyłem
zmiennej $debug. Jeśli witryna działa lokalnie,
zmienna $debug ma wartość TRUE. Aby można
było debugować skrypt w serwisie przekazanym
do eksploatacji, trzeba użyć następującego
wiersza:
$debug = TRUE;
przed włączeniem pliku konfiguracyjnego.
We wszystkich pozostałych przypadkach
debugowanie jest wyłączone.
70
Modularyzacja witryny WWW
Projektowanie aplikacji WWW
7. Rozpocznij funkcję obsługi błędów. 8. Skonstruuj komunikat o błędzie:
function my_error_handler ($e_number, $message = "Wystąpił błąd w skrypcie
$e_message, $e_file, $e_line, '$e_file' w wierszu $e_line: \n $e_vars) { />$e_message\n
";
global $debug, $contact_email; $message .= "Data/godzina: " .
date('n- j-Y H:i:s') . "\n
";
PHP umożliwia zdefiniowanie własnej
$message .= "
" . print_r ($e_vars, 1) .
"
\n
";
funkcji obsługi błędów, którą można
wykorzystywać zamiast funkcji
W celu ułatwienia diagnozowania błędów
wbudowanej. Więcej informacji na temat
komunikat o błędzie powinien być opisowy.
tego procesu, a także na temat składni
Powinien zawierać co najmniej nazwę pliku,
funkcji można znalezć w podręczniku
w którym wystąpił błąd, oraz numer wiersza.
PHP online lub w mojej książce PHP
Następnie w komunikacie powinna znalezć się
i MySQL. Dynamiczne strony WWW.
data i godzina wystąpienia błędu oraz wszystkie
Szybki start (Helion 2006).
występujące zmienne. To sporo danych
(rysunek 2.3), ale są one potrzebne, by można
W funkcji wykorzystywane będą dwie
było szybko zlokalizować i usunąć błąd.
zmienne globalne.
Rysunek 2.3. Oto niektóre informacje zgłaszane w przypadku wystąpienia błędu
71
Modularyzacja witryny WWW
Rozdział 2.
9. Jeśli włączono debugowanie, wyświetlamy
komunikat o błędzie:
if ($debug) {
echo '

' . $message .
'

';
Jeśli włączono debugowanie, w przeglądarce
WWW zostanie wyświetlony pełny komunikat
o błędzie (rysunek 2.4). Jest to doskonały
mechanizm w fazie projektowania witryny
i olbrzymia luka w systemie bezpieczeństwa
dla serwisu w eksploatacji. Kod należy
odpowiednio zmodyfikować, tak aby pasował
do środowiska wybranego serwisu.
10. Jeśli debugowanie wyłączono, przesyłamy
komunikat o błędzie pocztą elektroniczną
i wyświetlamy domyślny komunikat:
} else {
Rysunek 2.4. Wyświetlanie komunikatów o błędach
error_log ($message, 1,
podczas diagnostycznego uruchamiania strony
$contact_email);
if ( ($e_number != E_NOTICE) &&
($e_number < 2048)) {
echo '

Wystąpił
błąd systemowy. Przepraszamy za
niedogodności.

';
}
} // Koniec instrukcji IF $debug.
W przypadku witryny przekazanej już
do eksploatacji nie należy wyświetlać
szczegółowego komunikatu o błędzie
(chyba że dla strony czasowo włączono tryb
diagnostyczny). Można to zrobić za pomocą
funkcji error_log(), jeśli przekaże się do niej
liczbę 1 jako drugi argument. Użytkownik
powinien jednak wiedzieć, że coś nie działa
tak jak powinno, dlatego wyświetlamy
domyślny komunikat (rysunek 2.5). Jeśli błąd
jest klasy NOTICE lub STRICT (o numerze 2048),
nie należy wyświetlać komunikatu o błędzie,
ponieważ błąd prawdopodobnie
Rysunek 2.5. W serwisach przekazanych
nie przeszkadza w działaniu strony.
do eksploatacji błędy należy obsługiwać bardziej
dyskretnie (i bezpieczniej)
72
Modularyzacja witryny WWW
Projektowanie aplikacji WWW
11. Zakończ funkcję, zainicjuj używanie
zdefiniowanej procedury obsługi błędów
i zakończ stronę:
} // Koniec definicji funkcji my_error_handler().
set_error_handler('my_err_handler');
?>
12. Zapisz plik jako config.inc.php i umieść
na serwerze WWW (w podfolderze include).
Układ katalogów dla przykładowego serwisu
pokazano na rysunku 2.2.
Tworzenie pliku konfiguracji
bazy danych
W tym przykładzie nie utworzyłem pliku
konfiguracji bazy danych, ponieważ witryna
nie korzysta z baz danych. Gdyby była
potrzebna baza danych, trzeba by napisać
plik mysql.inc.php (lub postgresql.inc.php,
oracle.inc.php czy jakiś inny), którego
zadaniem byłoby nawiązanie połączenia
z bazÄ… danych. W takim pliku definiuje siÄ™
również funkcje wykonujące operacje
na bazie danych aplikacji.
Plik można zapisać w katalogu include,
choć najlepiej zapisać go poza katalogiem
dokumentów serwisu WWW. W pliku
config.inc.php zdefiniowano stałą DB, która
określa bezwzględną ścieżkę do tego pliku
na serwerze.
Jeśli na jakiejś stronie jest potrzebne
połączenie z bazą danych, można włączyć
potrzebny plik za pomocą następującej
instrukcji:
require_once(DB);
Ponieważ stała DB reprezentuje bezwzględną
ścieżkę do pliku, nie ma znaczenia, czy
włączany skrypt znajduje się w głównym
folderze, czy w podkatalogu.
73
Modularyzacja witryny WWW
Rozdział 2.


Niemal we wszystkich większych aplikacjach
stosuje się szablony HTML. Można w tym celu
aż do:
skorzystać z technologii Smarty (http://smarty.

php.net) lub wielu innych systemów obsługi

szablonów. Ja jednak preferuję użycie dwóch
W pierwszym pliku sÄ… poczÄ…tkowe
prostych plików: nagłówka, który zawiera wszystko,
znaczniki HTML (poczÄ…wszy od znacznika
co ma się znalezć na stronie do miejsca, w którym
DOCTYPE, przez nagłówek, aż do początku
występuje specyficzna treść, oraz stopki
zawierającej pozostałą część strony (rysunek 2.6). treści strony). Jest w nim również kod
tworzÄ…cy kolumnÄ™ Å‚Ä…czy po lewej stronie
Dla potrzeb tego szablonu skorzystałem z projektu,
okna przeglÄ…darki oraz margines po prawej
który znalazłem w witrynie Open Source Web
(rysunek 2.7). W tym kroku pominÄ…Å‚em
Design (www.oswd.org)  doskonałego zródła
duży fragment kodu HTML. Kompletny
materiałów do projektowania aplikacji
kod zamieszczono w skrypcie 2.2. Można
internetowych. Autorem tego projektu (rysunek 2.7)
go również pobrać ze strony WWW
jest Anthony Yeung (www.smallpark.org). Użyłem
towarzyszącej książce.
go grzecznościowo, dzięki uprzejmości autora.
Aby stworzyć strony korzystające z szablonów:
1. Zaprojektuj stronÄ™ HTML w edytorze
tekstowym lub WYSIWYG.
Aby przystąpić do tworzenia szablonu witryny
WWW, należy zaprojektować standardową
stronę HTML niezależną od kodu PHP. Dla
potrzeb tego przykładu, jak już wspominałem,
skorzystam z projektu Leaves CSS (rysunek 2.7).
Rysunek 2.6. Bardzo prosty przykład szablonu
Uwaga! W celu zaoszczędzenia miejsca plik
witryny: obszar treści specyficznej dla strony
CSS dla tego przykładu (decydujący o układzie
został otoczony dwoma plikami włączanymi
strony) nie został dołączony do książki. Można
go pobrać ze strony WWW towarzyszącej
książce (www.DMCInsights.com/phpvqp2/
 patrz strona Extras). Można też uruchomić
przykład bez arkusza CSS (szablon będzie
działał, tylko będzie mniej estetyczny).
2. Skopiuj do nowego dokumentu treść szablonu
od pierwszego wiersza do miejsca, w którym
zaczyna się treść specyficzna dla strony (skrypt
2.2). Tak więc, skopiuj tekst począwszy od:
Transitional//EN" "http://www.w3.org/
TR/xhtml1/DTD/xhtml1-transitional.dtd">
Rysunek 2.7. Szablon używany dla wszystkich
stron w tej witrynie
74
Modularyzacja witryny WWW
Projektowanie aplikacji WWW
Skrypt 2.2. Plik nagłówka rozpoczyna szablon HTML Zawiera również plik CSS oraz wykorzystuje zmienną
PHP w celu zdefiniowania tytułu okna przeglądarki
1 2
3 // Ta strona rozpoczyna nagłówek HTML witryny.
4
5 // Sprawdzenie wartości zmiennej $page_title:
6 if (!isset($page_title)) $page_title = 'Domyślny tytuł strony';
7 ?>
8 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
9
10
11
12 <?php echo $page_title; ?>
13
14
15
16

17
26
27
38
każdej ze stron. W tym celu ustawię zmienną, 43
44

której wartość wyświetli interpreter PHP.
45
4. Przed kodem HTML strony utwórz sekcję
kodu PHP, która sprawdza wartość zmiennej
$page_title.
if (!isset($page_title)) $page_title =
'Domyślny tytuł strony';
?>
Na wypadek, gdyby skrypt PHP włączył nie było tego fragmentu, a opcja zgłaszania
plik nagłówkowy bez ustawienia zmiennej błędów byłaby włączona, tytuł strony
$page_title, w tym fragmencie kodu PHP w przeglądarce mógłby wyświetlić się
zadeklarowano domyślny tytuł strony (oczywiście w postaci pokazanej na rysunku 2.8.
można go zmienić na bardziej opisowy). Gdyby
Rysunek 2.8.
Należy sprawdzić,
czy ustawiono
zmiennÄ…
$page_title. Jeśli nie
ustawiono wartości
tej zmiennej, system
zgłaszania błędów
zamiast tytułu
wyświetli
szczegółowy
komunikat o błędzie
76
Modularyzacja witryny WWW
Projektowanie aplikacji WWW
Skrypt 2.3. Plik stopki uzupełnia szablon HTML
5. Zapisz plik jako header.html.
Dla plików włączanych można używać
1
dowolnych rozszerzeń. Niektórzy programiści
2

stosują rozszerzenie .inc, które wskazuje,
3
że plik jest włączany. W tym przypadku można
4

9





W pliku stopki zamieszczono pozostałe elementy
formatowania dla treści strony, włącznie z jej
stopkÄ…, oraz znaczniki zamykajÄ…ce dokument
HTML.
7. Zapisz plik jako footer.html.
8. Umieść oba pliki w katalogu include serwera
WWW.
77
Modularyzacja witryny WWW
Rozdział 2.
Aby stworzyć główną stronę witryny:
Tworzenie strony głównej
1. Utwórz nowy skrypt PHP w edytorze
Strona index.php to główny skrypt w aplikacji
tekstu lub środowisku IDE (skrypt 2.4):
podzielonej na moduły. W rzeczywistości jest
to jedyna strona, która obowiązkowo musi być
załadowana w przeglądarce WWW. Strona
2. Dołącz plik konfiguracyjny.
index.php spełnia jeden cel: scala odpowiednie
fragmenty, które razem tworzą kompletną stronę require_once('./include/config.inc.php');
WWW. Proces ten może obejmować następujące
W pliku konfiguracyjnym znajdujÄ… siÄ™
działania:
definicje wielu ważnych ustawień,
włączenie pliku konfiguracyjnego; dlatego należy go dołączyć w pierwszej
kolejności.
włączenie pliku parametrów połączenia z bazą
danych;
zastosowanie szablonu HTML;
załadowanie właściwego modułu z zawartością.
Pamiętając o tym, pozostaje jedynie opracować kod
i upewnić się, że właściwie go obsłużono. Proces
ten objaśnię szczegółowo w poniższej procedurze.
Skrypt 2.4. Strona index.php to skrypt, za pośrednictwem którego wykonywane są wszystkie operacje w witrynie.
Określa moduły, które należy dołączyć, ładuje plik konfiguracyjny i łączy treść strony z szablonem HTML
1 2
3 /*
4 * To jest główna strona.
5 * Skrypt ten dołącza pliki konfiguracyjne,
6 * szablony i wszystkie moduły zawierające treść strony.
7 */
8
9 // Załadowanie pliku konfiguracyjnego przed kodem PHP:
10 require_once('./include/config.inc.php');
11
12 // Sprawdzenie, jaką stronę należy wyświetlić:
13 if (isset($_GET['p'])) {
14 $p = $_GET['p'];
15 } elseif (isset($_POST['p'])) { // Formularze
16 $p = $_POST['p'];
17 } else {
18 $p = NULL;
19 }
20
21 // Sprawdzenie, jaką stronę należy wyświetlić:
22 switch ($p) {
23
78
Modularyzacja witryny WWW
Projektowanie aplikacji WWW
Skrypt 2.4.  ciÄ…g dalszy
24 case 'about':
25 $page = 'about.inc.php';
26 $page_title = 'Informacje o tej witrynie';
27 break;
28
29 case 'this':
30 $page = 'this.inc.php';
31 $page_title = 'To jest inna strona.';
32 break;
33
34 case 'that':
35 $page = 'that.inc.php';
36 $page_title = 'A to jeszcze inna strona.';
37 break;
38
39 case 'contact':
40 $page = 'contact.inc.php';
41 $page_title = 'Skontaktuj siÄ™ z nami';
42 break;
43
44 case 'search':
45 $page = 'search.inc.php';
46 $page_title = 'Wyniki wyszukiwania';
47 break;
48
49 // Domyślnie skrypt włącza stronę główną.
50 default:
51 $page = 'main.inc.php';
52 $page_title = 'Główna strona witryny';
53 break;
54
55 } // Koniec głównej instrukcji switch.
56
57 // Sprawdzenie, czy plik istnieje:
58 if (!file_exists('./moduly/' . $page)) {
59 $page = 'main.inc.php';
60 $page_title = 'Główna strona witryny';
61 }
62
63 // Włączenie pliku nagłówkowego:
64 include_once ('./include/header.html');
65
66 // Włączenie modułu z treścią:
67 // zmienna $page jest określona na podstawie powyższej instrukcji switch.
68 include ('./moduly/' . $page);
69
70 // Włączenie pliku stopki w celu uzupełnienia szablonu:
71 include_once ('./include/footer.html');
72
73 ?>
79
Modularyzacja witryny WWW
Rozdział 2.
case 'contact':
3. Sprawdz poprawność wyświetlanej strony.
$page = 'contact.inc.php';
if (isset($_GET['p'])) {
$page_title = 'Skontaktuj siÄ™
$p = $_GET['p'];
z nami';
} elseif (isset($_POST['p'])) { // Formularze
break;
$p = $_POST['p'];
} else {
case 'search':
$p = NULL;
$page = 'search.inc.php';
}
$page_title = 'Wyniki
wyszukiwania';
Zawartość, która zostanie wyświetlona
break;
na stronie, zależy od wartości parametru
default:
przesłanego do strony. W przypadku kliknięcia
$page = 'main.inc.php';
łącza wartości są przesyłane za pomocą adresu
$page_title = 'Główna strona
URL. W większości formularzy wartości są
witryny';
przesyłane za pomocą tablicy superglobalnej break;
} // Koniec głównej instrukcji switch.
$_POST. Dla pozostałych przypadków należy
ustawić zmienną $p na wartość NULL.
Dla każdego dostępnego modułu treści
użyto osobnego warunku case instrukcji
4. Rozpocznij instrukcję switch, która określa
switch. Ze względów bezpieczeństwa
tytuł strony i plik.
domyślny warunek case ma znaczenie
switch ($p) {
kluczowe. Jeśli zmiennej $p nie przypisano
case 'about':
wartości lub jeśli jej wartość jest
$page = 'about.inc.php';
$page_title = 'Informacje o tej
niewłaściwa (tzn. nie istnieje dla niej
witrynie';
właściwy przypadek case )  skrypt
break;
ładuje plik main.inc.php. Jest to niezbędna
Każdy moduł ma nazwę nazwa.inc.php. Użyte operacja ze względów bezpieczeństwa.
rozszerzenie to mój sposób oznaczenia, że jest Złośliwy użytkownik może zauważyć,
to zarówno skrypt PHP, jak i plik włączany. że w witrynie są stosowane adresy URL
Ze względu na sposób interpretowania
postaci index.php?p=contact i spróbować
rozszerzeń w komputerach, znaczenie ma
użyć adresu postaci index.php?p=/
tylko końcowe rozszerzenie, tzn. przy próbie
sciezka/do/jakiegos/skryptu. W takim
bezpośredniego uruchomienia pliku zostałby
przypadku skrypt włączy główną stronę
on zinterpretowany jako skrypt PHP.
witryny.
Dla każdego modułu ustawiono również
tytuł strony (który zostanie wyświetlony
w przeglÄ…darce).
5. Uzupełnij instrukcję switch.
case 'this':
$page = 'this.inc.php';
$page_title = 'To jest inna strona.';
break;
case 'that':
$page = 'that.inc.php';
$page_title = 'A to jeszcze
inna strona.';
break;
80
Modularyzacja witryny WWW
Projektowanie aplikacji WWW
6. Sprawdz, czy istnieje plik modułu.
if (!file_exists('./moduly/' . $page)) {
$page = 'main.inc.php';
$page_title = 'Główna strona witryny';
}
Umieszczenie powyższej instrukcji nie jest
absolutnie konieczne, jeśli dla każdego
przypadku case istnieje właściwy moduł.
Użycie tej instrukcji tworzy jednak dodatkową
warstwę bezpieczeństwa.
7. Dołącz plik nagłówkowy.
include_once ('./include/header.html');
W tym pliku znajduje siÄ™ poczÄ…tek szablonu
HTML.
Moja przygoda zwiÄ…zana
8. Włącz moduł.
z zabezpieczeniami
include ('./moduly/' . $page);
Latem 2006 roku usprawniłem witrynę
Spowoduje to wstawienie odpowiedniej
WWW mojej firmy (www.DMCInsights.com),
zawartości.
wprowadzając organizację modułową.
Już pierwszej nocy po opublikowaniu nowej
9. Dołącz plik stopki:
wersji witryny ktoś próbował włamać się
include_once ('./include/footer.html');
na serwer, zmieniajÄ…c adres URL postaci
about.php?i=phpmysql2 na wartość Ten plik uzupełnia szablon HTML.
about.php?i=http://jakisserwis.com/plik.txt.
10. Zakończ stronę.
Skrypt plik.txt na tym serwerze zawierał
?>
kod PHP wyświetlający zawartość mojego
serwera. Gdyby hakerowi udało się go
11. Zapisz plik jako index.php i umieść go
uruchomić, bezpieczeństwo mojej witryny
w katalogu dokumentów na serwerze WWW.
byłoby zagrożone.
Skryptu nie można przetestować do momentu
Próba nie powiodła się z dwóch powodów.
utworzenia przynajmniej jednego modułu
Po pierwsze, sprawdziłem poprawność
zawartości (co najmniej main.inc.php).
elementu $_GET['i'], porównując go
ze zbiorem dopuszczalnych wartości.
Wskazówka
Po drugie, zachowałem ostrożność podczas
operacji włączania plików. Równie ważny
Instrukcja switch, która sprawdza poprawność
był jednak mechanizm zgłaszania błędów
wartości zmiennej $p, jest bardzo ważnym
zaimplementowany w witrynie. Ponieważ
zabezpieczeniem. Inne zabezpieczenie polega
witryna była przekazana do eksploatacji,
na użyciu osobnej zmiennej jako nazwy
użytkownik nie uzyskał żadnych
włączanego pliku (tzn. $page). Poniższy
interesujących informacji przy próbie
kod stwarzałby bardzo duże zagrożenie:
włączenia niewłaściwego pliku, ale ja
include ($_GET['p']);
otrzymałem informację o próbie włamania
pocztÄ… elektronicznÄ….
81
Modularyzacja witryny WWW
Rozdział 2.
Aby stworzyć główny moduł treści:
Utworzenie modułów treści
1. Utwórz nowy skrypt PHP w edytorze
Teraz, kiedy wykonaliśmy wszystkie czynności
tekstu lub w środowisku IDE (skrypt 2.5):
wstępne  napisaliśmy plik konfiguracyjny, szablon
i skrypt index.php, nadszedł czas, by przystąpić
do tworzenia modułów treści. W takim systemie
zaimplementowanie modułu treści jest niezwykle
proste. Pliki z treścią nie muszą włączać plików
konfiguracyjnych bądz szablonów, ponieważ
zrobiono to już w głównym skrypcie. Ponieważ
wszystkie moduły treści są włączane, mogą one
zawierać zarówno kod HTML, jak i PHP.
Jest jednak jedna pułapka: moduły nie powinny być
ładowane bezpośrednio. Gdyby ktoś spróbował
bezpośrednio wywołać skrypt main.inc.php
(lub dowolny inny moduł) w przeglądarce WWW,
zobaczyłby wynik bez szablonu HTML (rysunek
2.9), bez odpowiedniej obsługi błędów oraz
potencjalnie bez kodu nawiązującego połączenie
z bazą danych. W związku z tym w każdym
z modułów powinien znalezć się kod, który
w przypadku próby bezpośredniego wywołania
przekieruje użytkownika do właściwej strony.
Rysunek 2.9. Należy tak zaprojektować witrynę, aby nie było możliwości bezpośredniego
dostępu do modułów z treścią za pomocą adresu URL. W takim przypadku strona
wyświetlałaby się, między innymi, bez szablonu HTML
82
Modularyzacja witryny WWW
Projektowanie aplikacji WWW
Skrypt 2.5. W pierwszym module treści znajduje się kod HTML strony głównej. Wykorzystano również kod PHP,
który przekierowuje użytkownika w przypadku próby bezpośredniego dostępu do skryptu w przeglądarce
1 2
3 /*
4 * To jest główny moduł treści strony.
5 * Ta strona jest dołączana przez skrypt index.php.
6 */
7
8 // Przekierowanie w przypadku próby bezpośredniego dostępu:
9 if (!defined('BASE_URL')) {
10
11 // Potrzebna jest stała BASE_URL zdefiniowana w pliku konfiguracyjnym:
12 require_once ('../include/config.inc.php');
13
14 // Przekierowanie do strony głównej:
15 $url = BASE_URL . 'index.php';
16 header ("Location: $url");
17 exit;
18
19 } // Koniec instrukcji IF !defined().
20 ?>
21
22

Witajcie na stronie o szablonie Liście.


23

Witajcie na stronie o szablonie Liście - statycznym składającym się z 3 kolumn
szablonie stworzonym za pomocą arkusza stylów CSS i kodu XHTML. Szablon pozwala na właściwą
interpretację dowolnego powiększenia lub zmniejszenia czcionki. Działa prawidłowo
w przeglÄ…darkach Firefox, Opera, Internet Explorer i Safari. Jest prostszy od innych
projektów, ponieważ uważam, że takie elementy, jak grafika (cienie, olbrzymie grafiki
nagłówkowe), są ostatnio nadużywane. Myślę, że to zaciemnia treść i prezentuje użytkownikom
o wiele za dużo informacji naraz. Oto moja propozycja: szablon Liście - idealny dla
minimalistów. Można go dowolnie modyfikować zgodnie z własnymi upodobaniami. Myślę, że
nadszedł czas na dodatkową lekcję łaciny. Jeśli chcesz, bym wykonał dla ciebie
indywidualny projekt, możesz skontaktować się ze mną pod adresem web@smallpark.org


24

Dlaczego lubię teksty przykładowe po łacinie?.


25

Aenean eros arcu, condimentum nec, dapibus ut, tincidunt sit amet, urna. Quisque
viverra, eros sed imperdiet iaculis, est risus facilisis quam, id malesuada arcu nulla
luctus urna. Nullam et est. Vestibulum velit sem, faucibus cursus, dapibus vestibulum,
pellentesque et, urna. Donec luctus. Donec lectus. Aliquam eget eros facilisis tortor
feugiat sollicitudin. Integer lobortis vulputate sapien. Sed iaculis erat ac nunc. href="#">Etiam eu enim. Mauris ipsum urna, rhoncus at, bibendum sit amet, euismod eget,
dolor. Mauris fermentum quam vitae ligula. Vestibulum in libero feugiat justo dictum
consectetuer. Vestibulum euismod purus eget elit. Nunc sed massa porta elit bibendum
posuere. Nunc pulvinar justo sit amet odio. In sed est. Phasellus ornare elementum nulla.
Nulla ipsum neque, cursus a, viverra a, imperdiet at, enim. Quisque facilisis, diam sed
accumsan suscipit, odio arcu hendrerit dolor, quis aliquet massa nulla nec sem.


26

Po prostu je lubiÄ™.


27

Proin sagittis leo in diam. Vestibulum vestibulum orci vel libero.
Cras molestie pede quis odio. Phasellus tempus dolor eu risus. Aenean tellus tortor,
dignissim sit amet, tempus eu, eleifend porttitor, ipsum. Fusce diam. Suspendisse sed nunc
quis odio aliquet feugiat. Pellentesque sapien. Phasellus sed lorem eu augue luctus
commodo. Nullam interdum convallis nunc. Fusce varius. Ut egestas. Fusce interdum iaculis
pede. Sed vehicula vestibulum odio. Donec id diam.


83
Modularyzacja witryny WWW
Rozdział 2.
2. Sprawdz, czy nie nastąpiła próba 5. Dodaj dowolną treść.
bezpośredniego dostępu do skryptu:

Witajcie na stronie
o szablonie Liście.


if (!defined('BASE_URL')) { {

Witajcie na stronie o szablonie
Liście - statycznym składającym się
Jest wiele elementów, które można sprawdzić
z 3 kolumn szablonie stworzonym za
w tym celu  na przykład czy ustawiono
pomocą arkusza stylów CSS i kodu XHTML.
zmienne $page lub $p. Gdyby jednak włączono
Szablon pozwala na właściwą
parametr register globals, a użytkownik
interpretację dowolnego powiększenia
lub zmniejszenia czcionki. Działa
spróbowałby wejść na stronę
prawidłowo w przeglądarkach Firefox,
main.inc.php?p=true, taki test nie powiódłby
Opera, Internet Explorer i Safari. Jest
się. W związku z tym lepiej sprawdzić,
prostszy od innych projektów, ponieważ
czy zdefiniowano stałą. Tworzy się ją w pliku
uważam, że takie elementy, jak grafika
(cienie, olbrzymie grafiki nagłówkowe),
konfiguracyjnym, który należy załadować
są ostatnio nadużywane. Myślę, że to
w głównym skrypcie w pierwszej kolejności,
zaciemnia treść i prezentuje
jeszcze przed załadowaniem modułu treści.
użytkownikom o wiele za dużo informacji
naraz. Oto moja propozycja: szablon
3. Przekieruj użytkownika.
Liście - idealny dla minimalistów.
Można go dowolnie modyfikować zgodnie
require_once ('../include/config.inc.php');
z własnymi upodobaniami. Myślę, że
$url = BASE_URL . 'index.php';
nadszedł czas na dodatkową lekcję
header ("Location: $url");
Aaciny. Jeśli chcesz, bym
exit ;
wykonał dla ciebie indywidualny
Użytkownika należy przekierować do strony projekt, możesz skontaktować się ze mną
pod adresem web@smallpark.org
głównej. Ponieważ pożądane jest


przekierowanie z użyciem bezwzględnego
adresu URL (co jest najbardziej niezawodne),
Można tu wprowadzić dowolną kombinację
trzeba włączyć plik konfiguracyjny i odczytać
HTML i PHP, tak jak na dowolnej innej
wartość BASE_URL.
stronie PHP. W tym kroku pominÄ…Å‚em
nieco treści, można ją jednak znalezć
4. Zakończ sekcję PHP.
w wersji skryptu dostępnej do pobrania.
} // Koniec instrukcji IF defined()
?>
84
Modularyzacja witryny WWW
Projektowanie aplikacji WWW
6. Zapisz plik jako main.inc.php, umieść
w katalogu dokumentów na serwerze WWW
(w folderze moduly  rysunek 2.2) i przetestuj
przez wywołanie skryptu index.php
w przeglÄ…darce WWW (rysunek 2.10).
Rysunek 2.10. Kompletna główna strona serwisu  modularna i zarządzana za pomocą szablonu
85
Modularyzacja witryny WWW
Rozdział 2.
Tworzenie modułu wyszukiwania
W ostatnim przykładzie utworzyłem główny
moduł treści. Był zaskakująco prosty, w związku
z czym, dla urozmaicenia, pokażę inny przykład.
W celu zademonstrowania modułu sterowanego
za pomocÄ… PHP, utworzÄ™ funkcjÄ™ wyszukiwania.
Pamiętajmy jednak, że bez rzeczywistej treści
i zaplecza w postaci bazy danych nie można
zaimplementować praktycznie działającej funkcji
wyszukiwania. Nie jest to jednak istotne. W tym
przykładzie skoncentrujemy się na pokazaniu,
w jaki sposób wykorzystać PHP do obsługi
formularzy w obrębie struktury modularnej.
Pewnie wielu Czytelników zaskoczy fakt,
jak nieskomplikowana jest to czynność.
Aby utworzyć moduł wyszukiwania:
1. Utwórz nowy skrypt PHP w edytorze tekstu
lub środowisku IDE (skrypt 2.6).
86
Modularyzacja witryny WWW
Projektowanie aplikacji WWW
Skrypt 2.6. Moduł wyszukiwania zwraca pewne wyniki. Zaprezentowano go w celu pokazania,
jak łatwo można obsługiwać formularze, nawet w przypadku modularnej struktury witryny
1 2
3 /*
4 * To jest moduł wyszukiwania.
5 * Ta strona jest dołączana przez skrypt index.php.
6 * Należy do niej przekazać zmienną $_GET['terms'].
7 */
8
9 // Przekierowanie w przypadku próby bezpośredniego dostępu:
10 if (!defined('BASE_URL')) {
11
12 // Potrzebna jest stała BASE_URL zdefiniowana w pliku konfiguracyjnym:
13 require_once ('../include/config.inc.php');
14
15 // Przekierowanie do strony głównej:
16 $url = BASE_URL . 'index.php?p=search';
17
18 // Czy przesłano kryteria wyszukiwania?
19 if (isset($_GET['terms'])) {
20 $url .= '&terms=' . urlencode($_GET['terms']);
21 }
22
23 header ("Location: $url");
24 exit;
25
26 } // Koniec instrukcji IF !defined().
27
28 // Wyświetlenie nagłówka:
29 echo '

Wyniki wyszukiwania

';
30
31 // Wyświetlenie wyników wyszukiwania,
32 // jeśli przesłano formularz.
33 if (isset($_GET['terms']) && ($_GET['terms'] != 'Szukaj...') ) {
34
35 // Wysłanie zapytania do bazy danych.
36 // Pobranie wyników.
37 // Wyświetlenie ich:
38 for ($i = 1; $i <= 10; $i++) {
39 echo << 40

Wyniki wyszukiwania #$i


41

To jest jakiÅ› opis. To jest jakiÅ› opis. To jest jakiÅ› opis. To jest jakiÅ› opis.

\n
42 EOT;
43 }
44
45 } else { // Informacja o sposobie użycia formularza wyszukiwania.
46 echo '

W celu wyszukiwania informacji w tej witrynie, należy użyć
formularza wyszukiwania wyświetlającego się w górnej części strony.

';
47 }
48 ?>
87
Modularyzacja witryny WWW
Rozdział 2.
2. Przekieruj użytkownika, jeśli podjął próbę
bezpośredniego dostępu do strony:
if (!defined('BASE_URL')) {
require_once
('../include/config.inc.php');
$url = BASE_URL . 'index.php?p=search';
Korzystanie ze szkieletów
if (isset($_GET['terms'])) {
programowych
$url .= '&terms=' .
urlencode($_GET['terms']);
Szkielety programowe (ang. framework)
}
sÄ… bibliotekami kodu majÄ…cymi na celu
header ("Location: $url");
ułatwienie projektowania aplikacji. Dla języka
exit ;
}
PHP dostępnych jest ponad 40 popularnych
szkieletów. Firma Zend  twórca
Większa część kodu w tym przykładzie jest
interpretera PHP  zainicjowała ostatnio
identyczna z kodem modułu main.inc.php. Są
dyskusję na temat własnej wersji szkieletu
jednak dwie zmiany. Po pierwsze, adres URL
(http://framework.zend.com).
przekierowania zmodyfikowano na BASE_URL
Zazwyczaj szkielety sÄ… systemami
plus index.php?p=search. Technikę tę można
modularnymi, podobnymi do tego,
zastosować dla dowolnego modułu. Dzięki temu
który opisano w niniejszym rozdziale,
za pośrednictwem skryptu index.php można
ale o znacznie większej skali. Argumenty
przekierować użytkownika na każdą stronę.
przemawiające za stosowaniem szkieletów
Po drugie, jeśli z jakiegoś powodu użytkownik
programowych sÄ… podobne do tych, jakich
dotarłby do tej strony podczas przesyłania
używa się, przekonując do korzystania
formularza, kryteria wyszukiwania wyświetliłyby
z technik programowania obiektowego
siÄ™ w adresie URL. W takiej sytuacji kryteria
lub pakietów PEAR: za ich pomocą można
wyszukiwania zostałyby przekazane do skryptu.
szybko stworzyć aplikacje, które mają
Dzięki temu bezpośredni dostęp pod adres URL
więcej funkcji i są bezpieczniejsze aniżeli
www.example.com/moduly/search.inc.php?ter
tworzone w tradycyjny sposób. Argumenty
ms=blah również jest poprawną operacją
przeciwko używaniu szkieletów również
wyszukiwania.
sÄ… podobne do tych dotyczÄ…cych
programowania obiektowego i PEAR:
3. Wyświetl nagłówek:
trzeba poświęcić czas, by nauczyć się ich
echo '

Wyniki wyszukiwania

';
stosowania, nie mówiąc już o opanowaniu
do perfekcji, a czasami trudno je dostosować
4. Sprawdz, czy zdefiniowano poprawne kryteria
do indywidualnych potrzeb aplikacji. Istnieje
wyszukiwania.
również prawdopodobieństwo, że witryny
if (isset($_GET['terms']) &&
zarządzane za pomocą szkieletów będą
($_GET['terms'] != 'Szukaj...') ) {
działały wolniej (ze względu na konieczność
dodatkowego przetwarzania).
Operacja wyszukiwania w bazie danych nastÄ…pi
tylko wtedy, gdy użytkownik przekaże kryteria
Ja nie należę do zwolenników szkieletów,
wyszukiwania w ramach adresu URL. W polu
ponieważ lubię tworzyć kod od początku.
wyszukiwania występuje domyślna wartość Są jednak tacy, którzy chętnie z nich
Szukaj& , zatem należy ją wykluczyć. korzystają. Z analizą i porównaniem często
używanych szkieletów aplikacji można się
zapoznać pod adresem wvw.phpit.net/
article/ten-different-php-frameworks/.
88
Modularyzacja witryny WWW
Projektowanie aplikacji WWW
5. Wyświetl wyniki wyszukiwania.
for ($i = 1; $i <= 10; $i++) {
echo <<

Wyniki wyszukiwania
#$i


To jest jakiÅ› opis. To jest jakiÅ› opis. To
jest jakiÅ› opis. To jest jakiÅ› opis.

\n
EOT;
}
Ponieważ nie mamy rzeczywistej bazy danych
do wyszukiwania, wykorzystałem pętlę for
w celu wyświetlenia dziesięciu wyników
wyszukiwania. W tym przykładzie użyłem
Rysunek 2.11. Bez przesłania kryteriów
składni heredoc zgodnie z opisem
wyszukiwania operacja wyszukiwania
zamieszczonym w rozdziale 1.,  Zaawansowane
nie powiedzie siÄ™
techniki programowania w PHP .
6. Zakończ stronę.
} else {
echo '

W celu
wyszukiwania informacji w tej witrynie,
należy użyć formularza wyszukiwania
wyświetlającego się w górnej części
strony.

';
}
?>
Ta część instrukcji warunkowej zostanie
wykonana, jeśli nie wprowadzono prawidłowych
kryteriów wyszukiwania (rysunek 2.11).
7. Zapisz plik jako search.inc.php, umieść go
Rysunek 2.12. Wprowadzenie dowolnych kryteriów
wyszukiwania spowoduje wyświetlenie w katalogu dokumentów serwera WWW
przykładowych wyników
(w folderze moduly) i przetestuj, próbując
przesłać formularz (rysunek 2.12).
89
Modularyzacja witryny WWW
Rozdział 2.
Operacje z buforem przeglÄ…darki
PrzeglÄ…darki WWW i serwery proxy (mechanizmy,
które dostawcy Internetu i inne firmy stosują w celu
poprawy wydajności sieci) zwykle buforują strony
WWW. Buforowanie strony polega na zapisaniu jej
zawartości (lub części, na przykład samej grafiki
bądz klipów wideo), a następnie  w przypadku
żądania strony  dostarczenia jej z bufora
zamiast z serwera.
Dla większości użytkowników nie stanowi
to problemu. W większości przypadków nie zdają
sobie sprawy, że otrzymują przestarzałą wersję
strony lub zapisanej na niej grafiki. Jeśli jednak
podczas tworzenia witryny zechcemy zmusić
przeglądarkę WWW (spójrzmy prawdzie w oczy:
większość użytkowników korzysta z przeglądarki
Internet Explorer), by rozpoznała zmiany
wprowadzone na stronie, dostrzeżemy ciemną
stronÄ™ buforowania. W przypadku dynamicznych
stron WWW sterowanych za pomocÄ… PHP chcemy
być pewni, że użytkownicy otrzymają najbardziej
aktualnÄ… wersjÄ™ strony.
Na buforowanie  zarówno w przeglądarkach
WWW, jak i na serwerach proxy  można wpływać
za pomocą funkcji języka PHP header(). Dostępne
są cztery typy nagłówków:
Last-Modified,
Expires,
Pragma,
Cache-Control.
Trzy pierwsze typy nagłówków są częścią standardu
HTTP 1.0. Dla nagłówka Last-Modified
wykorzystuje się wartość czasu UTC (ang. Universal
Time Coordinated). Jeśli system buforowania
stwierdzi, że wartość nagłówka Last-Modified
zawiera datę pózniejszą od daty strony w buforze,
pobiera nowszÄ… wersjÄ™ z serwera.
90
Operacje z buforem przeglÄ…darki
Projektowanie aplikacji WWW
Ustawienie Expires wykorzystuje siÄ™ jako wskaznik
czasu, po którym wersja strony umieszczona
w buforze nie powinna być używana (według
czasu GMT  ang. Greenwich Mean Time).
Ustawienie parametru Expires na wartość
z przeszłości wymusza pobranie strony z serwera
za każdym razem:
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
Dyrektywa Pragma służy jako deklaracja sposobu
obsługi strony. W celu zablokowania buforowania
strony należy użyć następującej instrukcji:
header("Pragma: no-cache");
Nagłówek Cache-Control dodano w wersji HTTP
1.1. Pozwala on na dokładniejszą kontrolę
buforowania (nagłówki HTTP 1.0 są również
dostępne). Dostępnych jest wiele ustawień
nagłówka Cache-Control (tabela 2.1).
Aby zablokować buforowanie strony przez wszystkie
systemy, można skorzystać z następujących
nagłówków:
header("Last-Modified: Thu, 9 Nov 2006 14:26:00
GMT"), // W tej chwili
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
// Data w przeszłości!
header("Pragma: no-cache");
header("Cache-Control: no-cache");
Tabela 2.1. Dyrektywy nagłówka Cache-Control
Dyrektywa Znaczenie
Choć jest to sposób powszechnie stosowany,
public Buforowanie dozwolone jest bardzo radykalny. Z całą pewnością, nie
wszędzie
dla każdego skryptu PHP trzeba blokować
private Buforowanie tylko przez
buforowanie. Nawet w najbardziej aktywnych
przeglÄ…darki
witrynach można buforować niektóre skrypty
no-cache Buforowanie zabronione
przez kilka minut (bardzo aktywne witryny
wszędzie
w ciągu minuty otrzymują wiele żądań  dzięki
must-revalidate Mechanizm buforowania musi
wersji w buforze serwer nie będzie zmuszony
sprawdzić, czy są dostępne
do obsługiwania ich wszystkich). W celu
nowsze wersje
zastosowania opisanych pojęć spróbujmy
proxy-revalidate Mechanizm buforowania
serwerów proxy musi zmodyfikować skrypt view_tasks.php (skrypt 1.3)
sprawdzić, czy są dostępne
z rozdziału 1.
nowsze wersje
max-age Maksymalny czas buforowania
treści, w sekundach
s-maxage Przesłania wartość parametru
max_age w przypadku
współużytkowanych buforów
91
Operacje z buforem przeglÄ…darki
Rozdział 2.
Aby zarządzać buforowaniem:
1. Otwórz skrypt view_tasks.php w edytorze Jak większość Czytelników z pewnością wie,
tekstu lub środowisku IDE (skrypt 2.7). funkcję header() można wywołać tylko
wtedy, gdy jeszcze niczego nie wysłano
2. Przed wysłaniem treści do przeglądarki WWW
do przeglÄ…darki. Dotyczy to tekstu,
dodaj otwierajÄ…cy znacznik PHP (skrypt 2.7).
kodu HTML, a nawet spacji.
Skrypt 2.7. W zmodyfikowanej wersji skryptu view_tasks.php (skrypt 1.3) wykorzystano funkcjÄ™ header()
do sterowania buforowaniem
1 2
3 // Nawiązanie połączenia z bazą danych.
4 $dbc = @mysqli_connect ('localhost', 'uzytkownik', 'haslo', 'test') OR die ('

Nie można
połączyć się z bazą danych!

');
5
6 // Pobranie najnowszych dat w postaci znaczników czasu:
7 $q = 'SELECT UNIX_TIMESTAMP(MAX(data_wprowadzenia)), UNIX_TIMESTAMP(MAX(data_ukonczenia))
FROM zadania';
8 $r = mysqli_query($dbc, $q);
9 list($max_a, $max_c) = mysqli_fetch_array($r, MYSQLI_NUM);
10
11 // Wyznaczenie znacznika czasu oznaczającego pózniejszą datę:
12 $max = ($max_a > $max_c) ? $max_a : $max_c;
13
14 // Utworzenie przedziału buforowania w sekundach:
15 $interval = 60 * 60 * 6; // 24 godziny
16
17 // Wysłanie nagłówka:
18 header ("Last-Modified: " . gmdate ('r', $max));
19 header ("Expires: " . gmdate ("r", ($max + $interval)));
20 header ("Cache-Control: max-age=$interval");
21 ?> 22 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
23
24
25
26 Przeglądanie zadań
27
28
29

Bieżąca lista zadań


30 31
32 /* Ten skrypt wyświetla wszystkie zdefiniowane zadania.
33 * Do wyświetlenia zadań w postaci zagnieżdżonych list
34 * wykorzystano funkcjÄ™ rekurencyjnÄ….
35 */
36
37 // Funkcja wyświetlająca listę.
38 // Pobiera jeden argument: tablicÄ™.
39 function make_list ($parent) {
40
41 // Potrzebna jest globalna tablica $tasks:
92
Operacje z buforem przeglÄ…darki
Projektowanie aplikacji WWW
Skrypt 2.7.  ciÄ…g dalszy
42 global $tasks;
43
44 // PoczÄ…tek uporzÄ…dkowanej listy:
45 echo '
    ';
    46
    47 // Przetwarzanie w pętli wszystkich tablic podrzędnych:
    48 foreach ($parent as $task_id => $todo) {
    49
    50 // Wyświetlenie elementu:
    51 echo "
  1. $todo";
    52
    53 // Sprawdzenie, czy z zadaniem są powiązane zadania podrzędne:
    54 if (isset($tasks[$task_id])) {
    55
    56 // Wywołanie funkcji:
    57 make_list($tasks[$task_id]);
    58
    59 }
    60
    61 // Wyświetlenie elementu:
    62 echo '
  2. ';
    63
    64 } // Koniec pętli FOREACH.
    65
    66 // Koniec uporzÄ…dkowanej listy:
    67 echo '
';
68
69 } // Koniec funkcji make_list().
70
71 // Pobranie wszystkich niezrealizowanych zadań:
72 $q = 'SELECT id_zadania, id_z_nadrzednego, zadanie FROM zadania WHERE data_ukonczenia=
"0000-00-00 00:00:00" ORDER BY id_z_nadrzednego, data_wprowadzenia ASC';
73 $r = mysqli_query($dbc, $q);
74
75 // Zainicjowanie tablicy:
76 $tasks = array();
77
78 while (list($task_id, $parent_id, $task) = mysqli_fetch_array($r, MYSQLI_NUM)) {
79
80 // Dodanie zadania do tablicy:
81 $tasks[$parent_id][$task_id] = $task;
82
83 }
84
85 // Instrukcje diagnostyczne:
86 //echo '
' . print_r($tasks,1) . '
';
87
88 // Przesłanie pierwszego elementu tablicy
89 // do funkcji make_list():
90 make_list($tasks[0]);
91
92 ?>
93
94
93
Operacje z buforem przeglÄ…darki
Rozdział 2.
3. Nawiąż połączenie z bazą danych.
$dbc = @mysqli_connect ('localhost',
'uzytkownik', 'haslo', 'test') OR die
('

Nie można połączyć się z bazą
danych!

');
Aby dokładnie określić datę ostatniej
Rysunek 2.13. Zapytanie zwraca pola typu
modyfikacji strony, skrypt wykona zapytanie TIMESTAMP w następującej postaci
do bazy danych. W tabeli zadania sÄ… dwie
kolumny zawierajÄ…ce daty i godziny:
data_wprowadzenia i data_ukonczenia.
Za każdym razem przy aktualizacji zawartości
strony te dwie wartości są ustawiane na bieżącą
datÄ™ i godzinÄ™ (nie ma opcji usuwania).
Rysunek 2.14. Wyniki zapytania w postaci
4. Pobierz ostatnie daty aktualizacji z tabeli.
wykorzystanej w skrypcie
$q = 'SELECT
UNIX_TIMESTAMP(MAX(data_wprowadzenia)),
UNIX_TIMESTAMP(MAX(data_ukonczenia)) FROM
zadania';
$r = mysqli_query($dbc, $q);
list($max_a, $max_c) = mysqli_fetch_array($r,
MYSQLI_NUM);
$max = ($max_a > $max_c) ? $max_a : $max_c;
Zapytanie zwraca największe wartości pól
data_wprowadzenia i data_ukonczenia.
Ponieważ zapytanie zwróci te wartości
w postaci trudnej do przetwarzania (rysunek
2.13), zastosowano funkcjÄ™ UNIX_TIMESTAMP
w celu przekształcenia ich na liczby typu
integer (rysunek 2.14). Następnie użyto
operatora trzyelementowego w celu przypisania
największej wartości (oznaczającej najbliższą
datÄ™) do zmiennej $max.
94
Operacje z buforem przeglÄ…darki
Projektowanie aplikacji WWW
5. Zdefiniuj sensowny przedział buforowania.
$interval = 60 * 60 * 6;
Znaczenie słowa  sensowny zależy od tego,
ilu użytkowników odwiedza stronę
(tzn. od obciążenia serwera) oraz jak często
jest aktualizowana. Dla potrzeb tego przykładu
użyłem wartości sześciu godzin (wartość czasu
trwania przedziału jest wyrażona w sekundach
 60 sekund×60×6).
6. Wyślij nagłówek Last-Modified.
header("Last-Modified: " . gmdate
('r', $max));
Rysunek 2.15. Strona WWW z mechanizmem
zarzÄ…dzania buforowaniem
Nagłówek ustawia datę modyfikacji skryptu
na wartość daty ostatniej aktualizacji bazy
danych. Opcja "r" gmdate() (oraz date())
zwracajÄ… datÄ™ sformatowanÄ… zgodnie
ze specyfikacjÄ… HTTP.
7. Ustaw nagłówek Expires.
header("Expires: " . gmdate ("r", ($max +
$interval));
Wartość daty ważności jest określona
jako bieżąca godzina, do której dodano
zdefiniowany przedział.
8. Ustaw nagłówek Cache-Control.
header("Cache-Control: max-age= $interval");
?>
Jest to odpowiednik nagłówka Expires według
specyfikacji HTTP 1.1. Zamiast przekazywania
wartości daty, ustawiamy wartość max-age
w sekundach.
9. Usuń połączenie z bazą danych, które było
w skrypcie w pierwotnej postaci.
OperacjÄ™ tÄ™ przeniesiono na poczÄ…tek skryptu
 do punktu 3.
10. Zapisz skrypt w pliku view_task.php, umieść
go w katalogu dokumentów serwera WWW
i przetestuj w przeglÄ…darce (rysunek 2.15).
95
Operacje z buforem przeglÄ…darki
Rozdział 2.
Wskazówki
Zwróćmy uwagę, że teoretycznie buforowanie
jest bardzo korzystne dla aplikacji  służy
do zminimalizowania liczby niepotrzebnych
żądań pobrania stron kierowanych do serwera.
W przypadku właściwego zarządzania
buforami są one doskonałym mechanizmem
zarówno dla serwera, jak i klienta.
Rysunek 2.16. Użycie cURL do przeglądania
nagłówków zwracanych przez stronę view_tasks.php
Jeśli w systemie zainstalowano bibliotekę
cURL, można uruchomić poniższe polecenie
w celu wyświetlenia nagłówków strony
Buforowanie po stronie serwera
(rysunek 2.16):
Istnieje alternatywny typ buforowania, który
curl --head
można wykorzystać w celu zarządzania
http://www.przyklad.com/strona.php
komunikacją pomiędzy klientem a serwerem.
Kiedy użytkownik zażąda skryptu PHP, serwer
Bibliotekę cURL omówiono w rozdziale 9.,
WWW wysyła zapytanie do modułu obsługi
 PHP w sieci .
PHP o odczytanie i przetworzenie kodu.
W buforach działających po stronie serwera
Jeśli w aplikacji wykorzystywane są sesje,
są zapisywane przetworzone wersje skryptów,
można dostosować buforowanie sesji
dzięki czemu serwer może je wysłać do
za pomocÄ… funkcji session_cache_limit().
użytkownika bez konieczności przetwarzania.
Więcej informacji można znalezć w
Buforowanie po stronie serwera może
podręczniku online.
w znaczny sposób poprawić wydajność
aplikacji, ale zazwyczaj wymaga większej
Buforowaniem stron można również sterować
kontroli nad serwerem niż posiada przeciętny
za pomocą znaczników META umieszczonych
użytkownik (czytaj: taki, który korzysta
w nagłówku HTML dokumentu. Metoda ta
ze współdzielonych usług hostingu).
w niektórych przeglądarkach może działać
Osoby, które chciałyby przeanalizować i być
nieco mniej niezawodnie w porównaniu
może także zaimplementować buforowanie
z wykorzystaniem funkcji header().
po stronie serwera, majÄ… do wyboru wiele
opcji. APC (ang. Alternative PHP Cache) jest
Wydajność aplikacji klient-serwer można
na tyle popularnym mechanizmem, że wchodzi
również poprawić  w przypadku bardziej
w skład repozytorium PECL
rozbudowanych skryptów  za pomocą
(http://pecl.php.net). System jest darmowy,
mechanizmu kompresji wyniku Zlib lub
ale jego instalacja jest dość złożona. Firma
funkcji ob_gzhandler(). Więcej informacji
Zend (www.zend.com) oferuje darmowy Zend
na temat obu technik można znalezć
Optimizer. Jego instalacja jest dosyć prosta,
w podręczniku online PHP.
ale należy pamiętać o jej aktualizacji w
przypadku aktualizacji PHP (system jest
dedykowany dla wersji).
Spośród opcji niewymagających instalacji
oprogramowania na serwerze wymienić można
jeszcze pakiety PEAR Cache oraz Cache_Lite.
Można również pokusić się o napisanie
własnego systemu buforowania, ale nie jest
to najbardziej ekonomiczne rozwiÄ…zanie
96
Operacje z buforem przeglÄ…darki


Wyszukiwarka

Podobne podstrony:
PHP Tworzenie stron WWW Szybki start phpszs
PHP5 Tworzenie?zpiecznych stron WWW php5ww
PHP5 Tworzenie stron WWW cwiczenia praktyczne
Tworzenie stron WWW Ćwiczenia praktyczne Wydanie III
PHP6 i MySQL 5 Dynamiczne strony WWW Szybki start ph6ms5
Tworzenie stron WWW we Flashu CS4 CS4 PL Projekty twfcs4
informatyka tworzenie stron www kurs wydanie iii radoslaw sokol ebook
04 tworzenie stron www
Tworzenie stron WWW z wykorzystaniem Ajaksa Projekty
Tworzenie stron www wyd 2

więcej podobnych podstron