ABC skryptów CGI

Wstecz Dalej

CGI i SSI

Jedną z większych wad skryptów CGI jest fakt, że nawet gdy faktycznie tylko niewielki fragment strony ulega zmianom, skrypt musi zawsze wygenerować całą stronę. Gdybyśmy np. chcieli opisany powyżej sposób podawania aktualnego czasu na serwerze wykorzystać w ramach większej strony WWW, cała treść strony musiałaby być wypisywana przez skrypt. Aby uniknąć tej niedogodności, twórcy CGI opracowali również inny, uzupełniający mechanizm - SSI (Server Side Includes), pozwalający umieszczać w zwykłym kodzie HTML "wstawki", które mogą być np. dynamicznie generowane przez skrypty CGI.

Wstawki takie, umieszczane w pliku HTML, mają postać:

     <!--#polecenie parametry -->
Z punktu widzenia języka HTML stanowią one zatem komentarz, co zabezpiecza przed ich wyświetleniem na ekranie w sytuacji, gdyby z jakiegoś powodu nie zostały one zinterpretowane przez serwer i wysłane do przeglądarki użytkownika. Podobnie bowiem jak w przypadku samych skryptów CGI, także i możliwość korzystania z SSI może być zablokowana w konfiguracji serwera i wymagać odblokowania przez administratora (są to dwie niezależne opcje w konfiguracji). Ponadto musimy poinformować serwer, które pliki zawierają wstawki - analizowanie każdego pliku HTML wpłynęłoby bardzo źle na wydajność serwera. Stąd też pliki zawierające wstawki SSI opatruje się zwykle innym rozszerzeniem nazwy niż zwykłe pliki HTML - standardowo jest to rozszerzenie .shtml (oczywiście także i to jest zależne od administratora). Każdy plik z takim rozszerzeniem jest przed jego wysłaniem do przeglądarki przeglądany przez serwer i wszystkie wstawki zamieniane są na teksty odpowiednie do użytego polecenia (por. tabela 3). Użytkownik otrzymuje już "czystą" stronę HTML bez żadnych śladów wstawek.

Polecenia dostępne we wstawkach SSI przedstawione zostały w tabeli 3. Spośród nich dwa najistotniejsze stanowią #include i #exec. Polecenie #include pozwala wstawiać w treść strony zawartość innych plików tekstowych - zawierających czysty tekst lub kod HTML (ale nie pełny dokument HTML, z sekcjami <HEAD> i <BODY>, lecz fragment, który z punktu widzenia składni HTML-a może być wstawiony w większą całość). Może ono być bardzo przydatne w sytuacji, gdy np. na naszych stronach WWW powtarzają się pewne stałe elementy - takie jak nagłówki, menu nawigacyjne i inne. Możemy wówczas każdy taki stały fragment umieścić w odrębnym pliku i włączać ten plik poleceniem #include w każdą stronę, która ma go zawierać. Podejście takie bardzo ułatwia zarządzanie dużym serwisem WWW - wystarczy np. zmienić zawartość jednego włączanego pliku, aby automatycznie zmienił się wygląd wszystkich stron w serwisie.

Z uwagi na temat niniejszego poradnika najbardziej interesuje nas włączanie w treść strony fragmentów dynamicznie generowanych przez skrypty CGI. W starszych wersjach serwerów WWW trzeba było używać do tego celu odrębnego polecenia #exec. W większości nowoczesnych serwerów można to robić również poleceniem #include z parametrem virtual=, tak więc polecenie #exec stało się mniej potrzebne.

Spróbujmy zatem zrealizować wypisywanie aktualnego czasu serwera z wykorzystaniem mechanizmu SSI. Tworzymy stronę (pamiętajmy, aby nadać jej rozszerzenie .shtml, lub inne wymagane na naszym serwerze dla plików z wstawkami SSI) o następującej treści:

     <html>
     <head><title>Moja strona</title>
     <meta http-equiv="Content-type" content="text/html; charset=iso-8859-2">
     </head>
     <body>
     <h1 align="center">Witam Cię na mojej stronie!</h1>
     <b>Dzisiaj jest <!--#exec cgi="zegar.cgi" -->.</b><p>
     ....
     .... (dalsza część strony)
     ....
     </body>
     </html>
oraz skrypt zegar.cgi, będący uproszczoną wersją skryptu z poprzedniego rozdziału:

     #!/usr/bin/perl
     @miesiace = ("stycznia", "lutego", "marca", "kwietnia", "maja",
                  "czerwca", "lipca", "sierpnia", "września",
                  "października", "listopada", "grudnia");
     @dni_tyg = ("niedziela", "poniedziałek", "wtorek", "środa",
                 "czwartek", "piątek", "sobota");

     print "Content-type: text/plain\n\n";

     ($sek,$min,$godz,$dzien,$mies,$rok,$dztyg) = localtime;

     print "$dni_tyg[$dztyg], $dzien $miesiace[$mies] ";
     print 1900+$rok,", godzina $godz:$min:$sek";
Zwróćmy uwagę, że typ danych dostarczanych przez skrypt został tu zmieniony na text/plain i usunięto informację o standardzie kodowania polskich liter. Nie ma to większego znaczenia, gdyż w przypadku dokumentu włączanego w treść strony przez SSI serwer i tak będzie określał typ danych na podstawie dokumentu nadrzędnego, a nie wstawki. Usunięto też wypisywanie całego kodu HTML strony - pozostała jedynie sama informacja o aktualnym czasie, nadająca się do wstawienia w dowolnym miejscu w treść strony. Skrypt ten uruchomiony z wiersza poleceń systemu operacyjnego wypisałby na swoje standardowe wyjście następujący wynik:

     Content/type: text/plain

     czwartek, 24 sierpnia 2000, godzina 17:03:24
natomiast włączony w treść strony przedstawionej powyżej da nam rezultat jak na rys.5.


Wstecz Dalej

Jarosław Rafa 2000. Tekst udostępniony na licencji Creative Commons (uznanie autorstwa - użycie niekomercyjne - bez utworów zależnych). Kliknij tutaj, aby dowiedzieć się, co to oznacza i co możesz z tym tekstem zrobić. W razie jakichkolwiek wątpliwości licencyjnych bądź w celu uzyskania zgody na rozpowszechnianie wykraczające poza warunki licencji proszę o kontakt e-mailem: raj@ap.krakow.pl.

Wersja HTML opracowana 11.10.2000.


Powrót do spisu treści Statystyka