Óðîêè ïî PHP: Èíòåðôåéñ CGI |
Òåðìèí CGI (Common Gateway Interface — Îáùèé øëþçîâîé èíòåðôåéñ) îáîçíà÷àåò íàáîð ñîãëàøåíèé, êîòîðûå äîëæíû ñîáëþäàòüñÿ Web-ñåðâåðàìè ïðè âûïîëíåíèè èìè ðàçëè÷íûõ Web-ïðèëîæåíèé. Ôàêòè÷åñêè, äî íåäàâíåãî âðåìåíè âñå Web-ïðîãðàììèðîâàíèå ïðåäñòàâëÿëî ñîáîé ïðîãðàììèðîâàíèå CGI-ïðèëîæåíèé.  ïîñëåäíåå âðåìÿ ñèòóàöèÿ èçìåíèëàñü. È õîòÿ CGI âñå åùå îñòàåòñÿ íåãëàñíûì ñòàíäàðòîì äëÿ Web-ïðèëîæåíèé, ìåõàíèçì ðàáîòû CGI-ïðîãðàìì íåñêîëüêî îáíîâèëñÿ.
Ïðåäïîëîæèì, âû íàáèðàåòå â âàøåì áðàóçåðå http://www.server.com/path/pict.gif
Ïîñëå ââåäåííîãî âàìè http-çàïðîñà ñåðâåð îòñûëàåò âàì çàïðîøåííóþ êàðòèíêó ôîðìàòà GIF (êîíå÷íî, åñëè îíà äîñòóïíà ïî óêàçàííîìó àäðåñó). Îäíàêî ñêàçàòü, ÷òî âû çàïðîñèëè èìåííî êàðòèíêó íåëüçÿ. Ïî÷åìó? Äåëî â òîì, ÷òî ôàéë pict.gif ìîæåò íå áûòü êàðòèíêîé è äàæå âîîáùå íå ñóùåñòâîâàòü. Óäèâëåíû? À ýòî íè ÷òî èíîå, êàê ïðîÿâëåíèå CGI. Âî-ïåðâûõ ôàéë pict.gif è ïóòü /path/ ìîãóò íå ñóùåñòâîâàòü, ïîñêîëüêó àäìèíèñòðàòîð web-ñåðâåðà ìîæåò íàñòðîèòü àëèàñû (ïñåâäîíèìû) äëÿ äàííîãî îáúåêòà íà ñåðâåðå. Âî-âòîðûõ, ôàéë pict.gif ìîæåò ñôîðìèðîâàòü CGI-ïðîãðàììà "íà ëåòó", ïåðåäàâ â áðàóçåð ãîòîâóþ êàðòèíêó â ôîðìàòå GIF. Âîò èìåííî â òàêîì ñëó÷àå áûëè èñïîëüçîâàíû ñðåäñòâà CGI. Äàííûé ìåõàíèçì àáñîëþòíî íåçàìåòåí äëÿ ïîëüçîâàòåëÿ ðåñóðñà, êîòîðîìó âñå ðàâíî, êàêèì îáðàçîì â åãî áðàóçåðå ïîÿâèëàñü êàðòèíêà - áðàóçåð ïåðåäàë ôàéë èëè ôàéë ïåðåäàëà ïðîãðàììà. Ïîäîáíûì îáðàçîì ìîæíî ïåðåäàâàòü è html-äîêóìåíòû, â òàêîì ñëó÷àå îíè ìîãóò ôîðìèðîâàòüñÿ ïðîãðàììîé äèíàìè÷åñêè è ïåðåäàâàòüñÿ áðàóçåðàì ïîëüçîâàòåëåé â îòâåò íà èõ çàïðîñû.
Ïîñëåäíèé ïóíêò îñîáåííî âïå÷àòëÿþù. Åñëè âû ïðîíèêëèñü åãî èäååé, çíà÷èò, âû ïîíÿëè â îáùèõ ÷åðòàõ, ÷òî òàêîå CGI. Êàê ðàç CGI îáåñïå÷èâàåò âñå òî, ÷òî âûãëÿäèò òàê ïðîçðà÷íî äëÿ ïîëüçîâàòåëÿ. Òðàäèöèîííî ïðîãðàììû, ðàáîòàþùèå â ñîîòâåòñòâèè ñ ñîãëàøåíèÿìè CGI, íàçûâàþò ñöåíàðèÿìè — ñêîðåå âñåãî èç-çà òîãî, ÷òî â áîëüøèíñòâå ñëó÷àåâ èõ ïèøóò íà ÿçûêàõ-èíòåðïðåòàòîðàõ (íàïðèìåð, íà PHP èëè Perl ).
Òàêèì îáðàçîì, ìû ìîæåì ïîëüçîâàòüñÿ ìîùíûì ìåõàíèçìîì, êîòîðûé ïîçâîëÿåò íàì ôîðìèðîâàòü äîêóìåíòû "íà ëåòó".
Íàïðèìåð, íàì íóæíî, ÷òîáû â êàêîì-òî äîêóìåíòå ïðîñòàâëÿëèñü òåêóùàÿ äàòà è âðåìÿ. Ðàçóìååòñÿ, ìû íå ìîæåì çàðàíåå ïðîïèñàòü èõ â äîêóìåíòå — âåäü â çàâèñèìîñòè îò òîãî, êîãäà îí áóäåò çàãðóæåí ïîëüçîâàòåëåì, ýòà äàòà äîëæíà ìåíÿòüñÿ. Çàòî ìû ìîæåì íàïèñàòü ñöåíàðèé (ñêðèïò), êîòîðûé âû÷èñëèò äàòó, âñòàâèò åå â äîêóìåíò è çàòåì ïåðåäàñò åãî ïîëüçîâàòåëþ! Îäíàêî â ïîñòðîåííîé íàìè ìîäåëè íå õâàòàåò îäíîãî çâåíà. Äåéñòâèòåëüíî, ïðåäïîëîæèì, íàì íóæíî, ÷òîáû âðåìÿ â íàøåé ñòðàíèöå ïðîñòàâëÿëîñü íà îñíîâå ÷àñîâîãî ïîÿñà ïîëüçîâàòåëÿ. Íî êàê ñöåíàðèé óçíàåò, êàêîé ÷àñîâîé ïîÿñ ó ðåãèîíà, â êîòîðîì æèâåò ýòîò ÷åëîâåê (èëè êàêóþ-íèáóäü äðóãóþ èíôîðìàöèþ, êîòîðóþ ìîæåò ïðåäîñòàâèòü ïîëüçîâàòåëü)? Âèäèìî, äîëæåí áûòü êàêîé-òî ìåõàíèçì, êîòîðûé ïîçâîëèò ïîëüçîâàòåëþ íå òîëüêî ïîëó÷àòü, íî òàêæå è ïåðåäàâàòü èíôîðìàöèþ ñåðâåðó (â äàííîì ñëó÷àå, íàïðèìåð, ïîïðàâêó âðåìåíè â ÷àñàõ îòíîñèòåëüíî Ìîñêâû). Ýòî òàêæå îáåñïå÷èâàåò CGI.
Âçàèìîäåéñòâèå ñåðâåðà ñ áðàóçåðîì
×òî â äåéòñâèòåëüíîñòè ïðîèñõîäèò, êîãäà ìû ââîäèò êàêîé-ëèáî URL â àäðåñíóþ ñòðîêó áðàóçåðà? Áðàóçåð èçâëåêàåò èç URL ïðîòîêîë (http) è àäðåñ web-ñåðâåðà. Äàëåå áðàóçåð îáðàùàåòñÿ ê ñåðâåðó ñ HTTP-çàïðîñîì, â êîòîðîì óêàçàíî, ÷òî íåîáõîäèìî ïîëó÷èòü äîêóìåíò /path/somefile.html. Ñåðâåð ïðîñìàòðèâàåò ñîäåðæèìîå êàòàëîãà, è åñëè íàõîäèò äîêóìåíò somefile.html, òî âîçâðàùàåò åãî áðàóçåðó â îáûêíîâåííîì òåêñòîâîì âèäå. Êðîìå òåêñòà ñåðâåð òàêæå âîçâðàùàåò òèï äîêóìåíòà (ôîðìàò). Íàïðèìåð, åñëè web-ñåðâåð ñîîáùàåò, ÷òî ôàéë somefile.html ÿâëÿåòñÿ òåêñòîì, òî â îêíå áðàóçåðà ìû óâèäèì HTML-êîä. Íî îáû÷íî ñåðâåð ñîîáùàåò áðàóçåðó, ÷òî somefile.html ÿâëÿåòñÿ ãèïåðòåêñòîâûì äîêóìåíòîì (html), ïîýòîìó ìû óâèäèì íîðìàëüíóþ html-ñòðàíèöó. Åñëè çàïðàøèâàåìûé áðàóçåðîì äîêóìåíò íå áóäåò íàéäåí, òî ñåðâåð îòïðàâèò íàì ñîîáùåíèå îá îøèáêå.
Ïðåäíàçíà÷åíèå èíòåðôåéñà CGI
Èíòåðôåéñ CGI âûïîëíÿåò ôóíêöèè øëþçà ìåæäó ðàçëè÷íûìè ïðîãðàììàìè, óñòàíîâëåííûìè íà web-ñåðâåðå, è áðàóçåðàìè ïîëüçîâàòåëåé. Êîãäà áðàóçåð çàïðàøèâàåò îïðåäåëåííûé ðåñóðñ, web-ñåðâåð çàïóñêàåò ïðîãðàììó, êîòîðàÿ óæå âîçâðàùàåò ðåçóëüòàò â áðàóçåð ïîëüçîâàòåëÿ. Èñïîëüçîâàíèå CGI-ïðîãðàìì òðåáóåòñÿ, êîãäà íåîáõîäèìî â áðàóçåðå ïîëüçîâàòåëÿ îòîáðàçèòü ñòðàíèöó, ñôîðìèðîâàííóþ íà îñíîâå êàêèõ-ëèáî äåéñòâèé ïîëüçîâàòåëÿ. Íàïðèìåð, âû ââåëè â ôîðìó êàêèå-ëèáî äàííûå, à íà èõ îñíîâå ôîðìèðóåòñÿ ïîñûëàåìàÿ âàì ñòðàíèöà. CGI-ïðîãðàììà ìîæåò òàêæå îïðåäåëèòü IP-àäðåñ âàùåãî êîìïüþòåðà â ñåòè, è íà îñíîâå åãî îïðåäåëèòü âàøó ñòðàíó, â èòîãå ïåðåäàâ âàì html-äîêóìåíò íà âàøåì ðîäíîì ÿçûêå!
Ìåõàíèçì CGI ïåðåíàïðàâëÿåò âûâîä ïðîãðàììû íà web-ñåðâåð, à òîò, â ñâîþ î÷åðåäü, â áðàóçåð ïîëüçîâàòåëÿ. Ñ òî÷êè çðåíèÿ ïðîãðàììû íåò íè÷åãî íåîáû÷íîãî - îíà ëèøü âûâîäèò èíôîðìàöèþ. Àáñîëþòíî ëþáàÿ ïðîãðàììà íå ìîæåò áûòü CGI-ïðãðàììîé, ïîòîìó ÷òî ïåðåä ñâîèì âûâîäîì îíà äîëæíà âûâåñòè îïðåäåëåííûå çàãîëîâêè ñåðâåðà - óêàçàòü õîòÿ áû òèï âûâîäèìîé èíôîðìàöèè. Íàïðèìåð, åñëè ìû õîòèì âûâåñòè êàðòèíêó, ìû äîëæíû îòïðàâèòü çàãîëîâîê Content-type: image/gif. Åñëè CGI-ïðîãðàììå íóæíî ïåðåäàòü ïàðàìåòðû, òî äåëàåòñÿ ýòî î÷åíü ïðîñòî - êàê è â ñëó÷àå ñ îáû÷íîé ïðîãðàììîé. Íàïðèìåð, íàì íóæíî ïåðåäàòü ñòðîêó çàïðîñà name=Ivan&email=ivan@ivanov.com ñöåíàðèþ cgi.exe. Äëÿ ýòîãî íåîáõîäèìî âûçâàòü ïðîãðàììó cgi.exe ñ óêàçàííîé ñòðîêîé çàïðîñà: cgi.exe name=Ivan&email=ivan@ivanov.com.
Ðàçäåëÿþò ïàðàìåòðû ñ ïîìîùüþ ñèìâîëà &. Âèäåëè êîãäà-íèáóäü íà ñòðàíèöå íåñêîëüêî ïîëåé ââîäà è ïåðåêëþ÷àòåëåé, à ïîä íèìè êíîïêó "Îòïðàâèòü"? Ýòî è åñòü ôîðìà, ñ åå ïîìîùüþ
ìîæíî àâòîìàòèçèðîâàòü ïðîöåññ ïåðåäà÷è äàííûõ ñöåíàðèþ. Ðàçóìååòñÿ, ñöåíàðèé îïÿòü æå äîëæåí àäåêâàòíî ñðåàãèðîâàòü íà ýòè ïàðàìåòðû: ïðîâåñòè ðàçáîð ñòðîêè, ñîçäàòü ïåðåìåííûå è.ò.ä. Ñëåäóåò îáðàòèòü âíèìàíèå íà òî, ÷òî âñå ýòè äåéñòâèÿ ïðèäåòñÿ ïðîãðàììèðîâàòü âðó÷íóþ, åñëè ìû õîòèì âîñïîëüçîâàòüñÿ ÿçûêîì Ñè. PHP ðàçáèðàåò ïàðàìåòðû ñòðîêè çàïðîñà ñàìîñòîÿòåëüíî.
Òàê âîò, òàêîé ñïîñîá ïîñûëêè ïàðàìåòðîâ ñöåíàðèþ (êîãäà äàííûå ïîìåùàþòñÿ â êîìàíäíóþ ñòðîêó URL) íàçûâàåòñÿ ìåòîäîì GET. Ôàêòè÷åñêè, äàæå åñëè íå ïåðåäàåòñÿ íèêàêèõ ïàðàìåòðîâ (íàïðèìåð, ïðè çàãðóçêå ñòàòè÷åñêîé ñòðàíèöû), âñå ðàâíî ïðèìåíÿåòñÿ ìåòîä GET. Îäíàêî, ñóùåñòâóåò åùå îäèí ðàñïðîñòðàíåííûé ñïîñîá — ïåðåäà÷à ïåðàìåòðîâ çàïðîñà ìåòîäîì POST. Ìåòîäû ïåðåäà÷è çàïðîñîâ ìû ðàññìîòðèì íèæå.
Åñëè ïðîãðàììà ïðåäíàçíà÷åíà äëÿ CGI, òî íóæíî ïîçàáîòèòüñÿ î âçàèìîäåéñòâèè ñ ñåðâåðîì. Ïðîñòåéøåå âçàèìîäåéñòâèå çàêëþ÷àåòñÿ â òîì, ÷òî ïðîãðàììèñò äîëæåí çíàòü èíôîðìàöèþ î ñåðâåðå. Äàííàÿ èíôîðìàöèÿ ïåðåäàåòñÿ ñ ïîìîùüþ ïåðåìåííûõ îêðóæåíèÿ.
Âîò òàê ïðèìåðíî è ðàáîòàåò ìåõàíèçì CGI.
Ñïîñîáû ñîçäàíèÿ CGI-ñöåíàðèåâ (ñêðèïòîâ)
CGI-ïðîãðàììû ÷àñòî íàïèñàíû íà êàêîì-íèáóäü èíòåðïðåòèðóåìîì ÿçûêå (PHP, Perl, Bash, Phyton è äð.) Òàêæå ìîæíî íàïèñàòü ïðîãðàììó íà êîìïèëèðóåìîì ÿçûêå, íàïðèìåð C, êîòîðûé è áóäåò îáðàáàòûâàòü äàííûå ïîëüçîâàòåëÿ. Ïðèâåäåì ïðèìåð CGI-ïðîãðàììû íà C:
#include <time.h> // Íóæíà äëÿ èíèöèàëèçàöèè ôóíêöèè rand()
#include <stdio.h> // Âêëþ÷àåì ïîääåðæêó ôóíêöèé ââîäà/âûâîäà
#include <stdlib.h> // À ýòî — äëÿ ïîääåðæêè ôóíêöèè rand()
// Ãëàâíàÿ ôóíêöèÿ. Èìåííî îíà è çàïóñêàåòñÿ ïðè ñòàðòå ñöåíàðèÿ.
void main(void) {
// èíèöèàëèçèðóåì ãåíåðàòîð ñëó÷àéíûõ ÷èñåë
int Num; time_t t; srand(time(&t));
// â Num çàïèñûâàåòñÿ ñëó÷àéíîå ÷èñëî îò 0 äî 9
Num = rand()%10;
// äàëåå âûâîäèì çàãîëîâêè îòâåòà. Òèï — html-äîêóìåíò
printf("Content-type: text/html\n");
// çàïðåò êýøèðîâàíèÿ
printf("Pragma: no-cache\n");
// ïóñòîé çàãîëîâîê
printf("\n");
// âûâîäèì òåêñò äîêóìåíòà — åãî ìû óâèäèì â áðàóçåðå
printf("<html><body>");
printf("<h1>Çäðàâñòâóéòå!</h1>");
printf("Ñëó÷àéíîå ÷èñëî â äèàïàçîíå 0-9: %d",Num);
printf("</body></html>");
}
Òåïåðü ìû ìîæåì îòêîìïèëèðîâàòü äàííóþ ïðîãðàììó â èñïîëíÿåìûé (äâîè÷íûé) ôàéë cgi.exe è îáðàùàòüñÿ ê íåìó, êàê ê CGI-ñöåíàðèþ.
Äàëåå ìû, íàêîíåö, ðàññìîòðèì ìåòîäû ïåðåäà÷è çàïðîñîâ.
PHP.SU| Ðóáðèêè: | Ïîëåçíîå Óðîêè ïî PHP |
| Êîììåíòèðîâàòü | « Ïðåä. çàïèñü — Ê äíåâíèêó — Ñëåä. çàïèñü » | Ñòðàíèöû: [1] [Íîâûå] |