O co chodzi z tym CGI?

Pytanie niby banalne. CGI - Common Gateway Interface - wspólny interfejs bramowy. Sama nazwa dużo mówi. Wszystko wydaje się oczywiste. Ale czy na przykład skrypt PHP to CGI? Czasem czytam, że to technologia, czasem, że program, czasem, że funkcja serwera. Co więc to konkretnie oznacza?

O co chodzi z katalogiem cgi-bin? Do czego on służy? Co oznacza rozszerzenie .cgi?

Dlaczego prawie zawsze pisze się o CGI w powiązaniu z Perlem? Ciągle widzę tę parę - programowanie CGI w Perlu. Dlaczego nie w PHP, JSP czy ASP?

"Programowanie CGI w C" - to już brzmi dla mnie zupełnie niezrozumiale. Jeżeli uruchamiam skompilowany program EXE, to jak on komunikuje się z serwerem WWW?

  • CGI to interfejs określający sposób przekazywania danych między serwerem WWW a aplikacją, w obie strony. Opisuje w jaki sposób dane żądania są przekazywane w zmiennych środowiskowych (typ żądania, IP klienta), jak właściwe żądanie jest przekazywane przez standardowe wejście i jak odpowiedź jest przekazywana przez stanadardowe wyjście.

    http://hoohoo.ncsa.illinois.edu/cgi - specyfikacja CGI
    http://www.ietf.org/rfc/rfc3875.txt

    Niemal każdy serwer WWW można skonfigurować do uruchamiania programów jako CGI. Oznacza to, że serwer po odebraniu żądania definiuje pewne zmienne środowiskowe i uruchamia pewien program. Dane są przekazywane do programu przez STDIN, a zwracane do serwera WWW przez STDOUT. Zwracane dane to kompletna strona.

    Serwer WWW może w ten sposób uruchamiać zupełnie dowolne programy, o ile tylko zapewniają one właściwą obsługę przekazywanych standardowym wejściem parametrów. Można więc pisać w C, w Perlu, w VB czy choćby w Bashu, bo każdy język źródłowy plików wykonywalnych pozwala na pracę z danymi na standardowym wejściu i wyjściu.

    W przypadku PHP używa się najczęściej innej metody komunikacji skryptu z programem - mod_php. Choć PHP w dużym stopniu bazuje na specyfikacji CGI.

    Katalog cgi-bin i rozszerzenie cgi to wyłącznie konwencja. W konfiguracji serwera można wskazać dowolny plik wykonywalny w dowolnym katalogu.

    Powiązanie CGI i Perla wynika wyłącznie z tego, że oba zyskały popularność w podobnym okresie, a Perl dobrze się sprawdził jako język skryptów uruchamianych przez CGI. Teraz nawet i Perl można uruchamiać inaczej, przez mod_perl.

    Współcześnie istnieje wiele alternatyw dla CGI i uważa się tę metodę za mało wydajną i przestarzałą. Najprostszą alternatywą jest FastCGI - http://www.fastcgi.com/.

    Podstawowy problem z CGI to uruchamianie osobnego procesu dla każdego żądania.

  • CGI to protokół który pozwala serwerowi WWW delegować generowanie strony do aplikacji konsolowej. Może to być aplikacja napisana w C i skompilowana (stąd programowanie CGI w C), może być skrypt w Perlu, czy w dowolnym innym języku, dla którego istnieje interpreter skryptów. Może być nawet w Bashu jak ktoś się uprze ;-)

    Ogólnie to jest bardzo stara metoda, wolna (bo dla każdego requestu uruchamia się dodatkowy proces systemu operacyjnego) i kłopotliwa. Dzisiaj interpretery skryptów są wmontowywane bezpośrednio w serwer www w postaci modułów - ot, choćby mod_php - dlatego nie widujesz raczej pojęcia "programowanie CGI w PHP" - choć oczywiście da się to zrobić. Perl zaczął być używany znacznie wcześniej, kiedy CGI jeszcze królowało, stąd to pojęcie pojawia się częściej.

    EDIT - Szczegóły techniczne:

    • Katalog cgi-bin - zwyczajowy katalog, w którym przechowywane są skrypty i aplikacje CGI
    • Dane są przekazywane do programu za pomocą systemowych zmiennych środowiskowych (a nie parametrów wiersza poleceń)
    • w przypadku HTTP POST/PUT, dane są przekazywane przez standardowe wejście (stdin)
    • skrypt/program CGI zwraca serwerowi odpowiedź przez standardowe wyjście, razem z nagłówkami HTTP
    • rozwinięciem tej metody jest FastCGI - tutaj utrzymywany jest jeden długo działający proces, co pozwala na uniknąć obciążenia związanego z odpalaniem oddzielnego procesu za każdym razem - w tym przypadku dane są przekazywane między serwerem HTTP a procesem FastCGI za pomocą połączenia TCP lub socketów Unix.

  • Uzupełniając tylko. Perl pojawia się często w kontekście CGI bo najpopularniejszym zastosowaniem dla CGI jest obsługa formularzy. A przez formularz w znakomitej większości przypadków przesyła się tekst. A jeśli dlaej chodzi o przetwarzanie tekstu to trudno często znaleźć rozwiązanie wygodniejsze od perla. No i wychdozi jak wychodzi.

    Przy czym trzeba sobie uświadomić, że czasy CGI minęły, choć wciąż zdarzają się sytuacje kiedy prosty program gdzieś „pod spodem” okazuje się najprostszym i jednocześnie bardzo wygodnym rozwiązaniem.

  • CGI to jest właśnie sposób wykonywania skryptów, nie ważne w jakim języku.

Zaloguj się, aby dodać swoją odpowiedź