Co to jest Common Gateway Interface (CGI)?

745

CGI to wspólny interfejs bramy. Jak sama nazwa wskazuje, jest to „wspólny” interfejs bramy do wszystkiego. Nazwa jest tak banalna i naiwna. Czuję, że to zrozumiałem i czułem to za każdym razem, gdy napotkałem to słowo. Ale szczerze mówiąc, nie zrobiłem tego. Wciąż jestem zdezorientowany.

Jestem programistą PHP z doświadczeniem w tworzeniu stron internetowych.

żądanie użytkownika (klienta) dotyczące strony ---> serwer WWW (-> osadzony interpreter PHP) ----> skrypt po stronie serwera (PHP) ---> serwer MySQL.

Powiedzmy teraz, że mój skrypt PHP może pobierać wyniki z serwera MySQL i serwera MATLAB i niektórych innych serwerów.

Więc teraz skrypt PHP to CGI? Ponieważ jego interfejs między serwerem WWW a wszystkimi innymi serwerami? Nie wiem Czasami nazywają CGI, technologię, a innym razem nazywają CGI programem lub innym serwerem.

  • Czym dokładnie jest CGI?

  • O co chodzi /cgi-bin/*.cgi? O co chodzi? Nie wiem do czego służy ten cgi-binkatalog na serwerze. Nie wiem, dlaczego mają rozszerzenia * .cgi.

  • Dlaczego Perl zawsze przeszkadza. CGI i Perl (język). Nie wiem też, co jest z tymi dwoma. Prawie cały czas słyszę te dwie kombinacje „CGI i Perl”. Ta książka to kolejny świetny przykład programowania CGI w Perlu . Dlaczego nie „Programowanie CGI za pomocą PHP / JSP / ASP”? Nigdy nie widziałem takich rzeczy.

  • Programowanie CGI w C bardzo mnie dezorientuje. „ w C ” ?? Poważnie?? Nie wiem co powiedzieć. Jestem tylko zmieszany. „ w C ” ?? To zmienia wszystko. Program musi zostać skompilowany i wykonany. To całkowicie zmienia mój pogląd na programowanie sieciowe. Kiedy kompiluję? Jak program jest wykonywany (ponieważ będzie to kod maszynowy, więc musi być wykonywany jako niezależny proces). Jak komunikuje się z serwerem WWW? IPC? i współpraca ze wszystkimi serwerami (w moim przykładzie MATLAB i MySQL) za pomocą programowania gniazd? Zgubiłem się!!

  • Ludzie mówią, że CGI jest przestarzałe i nie jest już używane. Czy tak jest Jaka jest najnowsza aktualizacja?

Raz spotkałem się z sytuacją, w której musiałem przyznać dostęp do żądania HTTP PUT do serwera WWW (Apache HTTPD). To długi powrót. O ile pamiętam, to właśnie zrobiłem:

  1. Edytowałem plik konfiguracyjny Apache HTTPD, aby serwer WWW przekazał wszystkim żądania HTTP PUT do niektórych put.php(musiałem napisać ten skrypt PHP)

  2. Zaimplementuj put.php, aby obsłużyć żądanie (zapisz plik w wymienionej lokalizacji)

Ludzie mówili, że napisałem skrypt CGI. Poważnie, nie miałem pojęcia, o czym rozmawiają.

  • Czy naprawdę napisałem skrypt CGI?

Mam nadzieję, że zrozumiałeś moje zamieszanie. (Ponieważ sam nie wiem, gdzie jestem zdezorientowany). Proszę was, abyście jak najprostsi udzielili odpowiedzi. Naprawdę nie rozumiem żadnej wymyślnej terminologii technicznej. Przynajmniej nie w tym przypadku.

EDYTOWAĆ:

Znalazłem ten niesamowity samouczek „Programowanie w CGI jest proste!” - Tutorial CGI , który wyjaśnia pojęcia w najprostszy możliwy sposób. Po przeczytaniu tego artykułu możesz przeczytać Pierwsze kroki z programowaniem CGI w C, aby uzupełnić swoje zrozumienie rzeczywistymi przykładami kodu. Dodałem również te linki do tego samouczka do artykułu Wikipedii: http://en.wikipedia.org/wiki/Common_Gateway_Interface

pazury
źródło
9
Widziałem już CGI napisane w Cobolu. Bez kajaków!
Luc M
@Luc M. Zainteresowany. Które CGI masz na myśli (biorąc pod uwagę, że w LINQ istnieje raycaster)?
Joe
15
@claws: Ludzie, głównie oldschoolowi, będą wywoływać DOWOLNY kod, niezależnie od faktycznej metody wykonania, wykonanej za pośrednictwem serwera WWW, CGI. To, co tak naprawdę napisałeś, to skrypt PHP, który może, ale nie musi, zostać wykonany za pomocą protokołu CGI. Twoje zamieszanie wydaje się wynikać z ambiwalentnego znaczenia CGI, protokołu do wykonywania kodu i kodu, który jest wykonywany za pomocą protokołu (który później został uogólniony na dowolny kod wykonywany w Internecie)
Vinko Vrsalovic
1
W połowie lat 90. napisałem kilka skryptów CGI w HyperCard
Neal Davis
@ Joe Nigdy nie otrzymałem powiadomienia i dzisiaj, czytając ponownie ten post, zobaczyłem twoje pytanie. CGI zostały napisane w OpenVMS jako niezależne pliki wykonywalne (bez udziału frameworka lub aplikacji stron trzecich ...)
Luc M

Odpowiedzi:

427

CGI to interfejs, który informuje serwer WWW, jak przekazywać dane do i z aplikacji. Mówiąc dokładniej, opisuje sposób przekazywania informacji o żądaniach w zmiennych środowiskowych (takich jak typ żądania, zdalny adres IP), sposób przekazywania treści żądania za pomocą standardowego wejścia oraz sposób przekazywania odpowiedzi za pośrednictwem standardowego wyjścia. Szczegółowe informacje można znaleźć w specyfikacji CGI .

Aby użyć swojego obrazu:

user (client) request for page ---> webserver ---[CGI]----> Server side Program ---> MySQL Server.

Większość, jeśli nie wszystkie, serwery WWW można skonfigurować do uruchamiania programu jako „CGI”. Oznacza to, że serwer WWW po otrzymaniu żądania prześle dane do określonego programu, ustawiając niektóre zmienne środowiskowe i zestawiając parametry przez standardowe wejście i standardowe wyjście, aby program mógł wiedzieć, gdzie i czego szukać.

Główną zaletą jest to, że możesz uruchomić KAŻDY kod wykonywalny z sieci, biorąc pod uwagę, że zarówno serwer WWW, jak i program wiedzą, jak działa CGI. Dlatego możesz pisać programy internetowe w języku C lub Bash za pomocą zwykłego serwera z obsługą CGI. To i że większość środowisk programowania może łatwo używać standardowych zmiennych wejściowych, standardowych danych wyjściowych i zmiennych środowiskowych.

W twoim przypadku najprawdopodobniej użyłeś innego, specyficznego dla PHP, środka komunikacji między swoimi skryptami a serwerem internetowym, jak wspomniałeś w swoim pytaniu, jest to wbudowany interpreter o nazwie mod_php.

Odpowiadając na pytania:

Czym dokładnie jest CGI?

Patrz wyżej.

O co chodzi z /cgi-bin/*.cgi? Co z tym? Nie wiem do czego służy ten katalog cgi-bin na serwerze. Nie wiem, dlaczego mają rozszerzenia * .cgi.

Jest to tradycyjne miejsce dla programów cgi, wiele serwerów ma ten katalog wstępnie skonfigurowany do uruchamiania wszystkich plików binarnych jako programów CGI. Rozszerzenie .cgi oznacza plik wykonywalny, który powinien działać za pośrednictwem CGI.

Dlaczego Perl zawsze przeszkadza. CGI i Perl (język). Nie wiem też, co jest z tymi dwoma. Prawie cały czas słyszę te dwie kombinacje „CGI i Perl”. Ta książka jest kolejnym doskonałym przykładem programowania CGI w Perlu. Dlaczego nie „Programowanie CGI w PHP / JSP / ASP”. Nigdy nie widziałem takich rzeczy.

Ponieważ Perl jest starożytny (starszy niż PHP, JSP i ASP, które powstały, gdy CGI był już stary, Perl istniał, gdy CGI był nowy) i stał się dość znany z tego, że jest bardzo dobrym językiem do obsługi dynamicznych stron internetowych za pośrednictwem CGI. Obecnie istnieją inne alternatywy dla uruchamiania Perla na serwerze WWW, głównie mod_perl .

Programowanie CGI w C bardzo mnie to myli. w C ?? Poważnie?? Nie wiem co powiedzieć. Jestem po prostu zdezorientowany. "W C" ?? To zmienia wszystko. Program musi zostać skompilowany i wykonany. To całkowicie zmienia moje spojrzenie na programowanie sieciowe. Kiedy kompiluję? W jaki sposób program zostanie wykonany (ponieważ będzie to kod maszynowy, więc musi zostać wykonany jako niezależny proces) .Jak komunikuje się z serwerem WWW? IPC? i współpracuje ze wszystkimi serwerami (w moim przykładzie MATLAB i MySQL) za pomocą programowania gniazd? Zgubiłem się !!

Raz skompilujesz plik wykonywalny, serwer wykonuje program i przekazuje dane z żądania do programu i wysyła otrzymaną odpowiedź. CGI określa, że ​​na każde żądanie zostanie uruchomiona jedna instancja programu. Właśnie dlatego CGI jest obecnie nieefektywne i trochę przestarzałe.

Mówią, że CGI jest przestarzałe. Nie jest już używany. Czy tak jest Jaka jest jego najnowsza aktualizacja?

Interfejs CGI jest nadal używany, gdy wydajność nie jest najważniejsza i wymagany jest prosty sposób wykonania kodu. Jest to nieefektywne z wcześniej podanych powodów i istnieją bardziej nowoczesne sposoby wykonywania dowolnego programu w środowisku sieciowym. Obecnie najbardziej znanym jest FastCGI .

Vinko Vrsalovic
źródło
24
Mówiąc dokładniej, opisuje, w jaki sposób informacje o żądaniach są przekazywane w zmiennych środowiskowych (takich jak typ żądania, zdalny adres IP), w jaki sposób treść żądania jest przekazywana za pomocą standardowego wejścia oraz w jaki sposób odpowiedź jest przekazywana za pośrednictwem standardowego wyjścia. Szczegółowe informacje można znaleźć w specyfikacji CGI ( hoohoo.ncsa.illinois.edu/cgi ).
daf
3
Zakładam, że Server side Programna twoim rysunku jest mój skrypt PHP. Więc nigdy nie programowałem w CGI? Ponieważ nigdy nie napisałem niczego, co wchodzi pomiędzy serwerem WWW a moim skryptem PHP. Cholera!! to mnie zabija.
pazury
4
PHP w dalszym ciągu opiera się w dużej mierze na protokole CGI, większość zawartości $ _SERVER pochodzi bezpośrednio ze specyfikacji CGI. „Programowanie CGI” zawsze oznaczało, że program przetwarza żądanie, a nie implementację samego protokołu. Gdybyś wyjaśnił, co robisz z PHP, pionierowi programowania internetowego z 1993 roku, uznałby to za zaawansowaną (choć prawdopodobnie słabą) formę programowania CGI.
Michael Borgwardt,
5
@Michael: Ale podczas uruchamiania przez mod_php wcale nie jest CGI (nawet jeśli jest na nim oparty). Zgadzam się, że CGI odnosi się zarówno do protokołu, jak i skryptów wykonywanych za jego pośrednictwem.
Vinko Vrsalovic
2
@ Vinko Vrsalovic: jeśli CGI jest interfejsem dla Perla, C lub innych języków do uruchamiania na serwerze sieciowym, niż który interfejs jest używany przez PHP do uruchamiania w Apache ???????? i czy PHP jest objęty specyfikacją CGI?
hardik
63

Czym dokładnie jest CGI?

Sposób, w jaki serwer WWW może pobrać dane z programu (zamiast na przykład pliku).

O co chodzi z /cgi-bin/*.cgi?

Nie ma sprawy. To tylko konwencja.

Nie wiem do czego służy ten katalog cgi-bin na serwerze. Nie wiem, dlaczego mają rozszerzenia * .cgi.

Serwer musi wiedzieć, co zrobić z plikiem (tzn. Traktować go jako program do wykonania zamiast czegoś po prostu służyć). Posiadanie rozszerzenia .html nakazuje użycie typu zawartości text / html. Posiadanie rozszerzenia .cgi nakazuje uruchomienie go jako programu.

Przechowywanie plików wykonywalnych w osobnym katalogu zapewnia dodatkową ochronę przed wykonywaniem niepoprawnych plików i / lub udostępnianiem programów CGI jako surowych danych na wypadek błędnej konfiguracji serwera.

Dlaczego Perl zawsze przeszkadza.

Tak nie jest. Perl był po prostu duży i popularny w tym samym czasie, co CGI.

Nie korzystam z Perl CGI od lat. Używałem mod_perl przez długi czas i ostatnio mam tendencję do PSGI / Plack z FastCGI.

Ta książka jest kolejnym doskonałym przykładem programowania CGI w Perlu. Dlaczego nie „Programowanie CGI w PHP / JSP / ASP”.

CGI nie jest bardzo wydajny. Lepsze metody komunikowania się z programami z serwerów sieciowych pojawiły się mniej więcej w tym samym czasie co PHP. JSP i ASP to różne metody komunikowania się z programami.

Programowanie CGI w C bardzo mnie to myli. w C ?? Poważnie??

To jest język programowania, dlaczego nie?

Kiedy kompiluję?

  1. Napisz kod
  2. Skompilować
  3. Access URL
  4. Serwer WWW uruchamia program

Jak program jest wykonywany (ponieważ będzie to kod maszynowy, więc musi być wykonywany jako niezależny proces).

Nie musi być wykonywany jako niezależny proces (możesz napisać moduły Apache w C), ale cała koncepcja CGI polega na tym, że uruchamia proces zewnętrzny.

Jak komunikuje się z serwerem WWW? IPC?

STDIN / STDOUT i zmienne środowiskowe - zgodnie ze specyfikacją CGI.

i współpraca ze wszystkimi serwerami (w moim przykładzie MATLAB i MySQL) za pomocą programowania gniazd?

Używając dowolnych metod, które lubisz i są obsługiwane.

Mówią, że CGI jest amortyzowane. Nie jest już używany. Czy tak jest

CGI jest nieefektywny, wolny i prosty. Jest rzadko używany, gdy jest używany, dzieje się tak, ponieważ jest prosty. Jeśli wydajność nie jest wielkim problemem, to prostota jest bardzo warta.

Jaka jest jego najnowsza aktualizacja?

1.1

Quentin
źródło
1. Napisz kod 2. Kompiluj 3. Uzyskaj dostęp do adresu URL 4. Serwer WWW uruchamia program. || Ale skąd serwer internetowy wie, gdzie umieszczasz skompilowany program wykonywalny? Skąd ma wiedzieć, który program wykonywalny (wśród nich wszystkich) uruchomić?
Pacerier,
@Pacerier - Taki sam sposób, w jaki wie, który plik statyczny wysyła do klienta, jeśli żądany jest plik statyczny.
Quentin,
41

CGI to specyfikacja interfejsu między serwerem WWW (serwerem HTTP) a programem wykonywalnym pewnego typu, który ma obsłużyć określone żądanie.

Opisuje, w jaki sposób niektóre właściwości tego żądania powinny być przekazywane do środowiska tego programu oraz w jaki sposób program powinien przekazać odpowiedź z powrotem do serwera oraz w jaki sposób serwer powinien „uzupełnić” odpowiedź, aby utworzyć prawidłową odpowiedź na pierwotne żądanie HTTP.

Przez pewien czas CGI był wersją roboczą IETF Internet Draft i jako taki miał datę ważności. Wygasł bez aktualizacji, więc nie było „standardu” CGI. Jest to obecnie informacyjny RFC, ale jako taki dokumentuje powszechną praktykę i sam w sobie nie jest standardem. rfc3875.txt , rfc3875.html

Programy implementujące interfejs CGI można pisać w dowolnym języku uruchamianym na komputerze docelowym. Muszą mieć dostęp do zmiennych środowiskowych i zwykle standardowych danych wejściowych i generują dane wyjściowe na standardowym wyjściu .

Języki kompilowane, takie jak C, były powszechnie używane, podobnie jak języki skryptowe, takie jak Perl, często używając bibliotek, aby ułatwić dostęp do środowiska CGI.

Jedną z dużych wad CGI jest to, że dla każdego żądania pojawia się nowy program, więc utrzymanie stanu między żądaniami może być poważnym problemem z wydajnością. Stan może być obsługiwany w plikach cookie lub zakodowany w adresie URL, ale jeśli będzie zbyt duży, musi być przechowywany w innym miejscu i wpisany na podstawie zakodowanych informacji o adresie URL lub pliku cookie. Każde wywołanie CGI musiałoby wówczas ponownie załadować stan przechowywany z jakiegoś sklepu.

Z tego powodu oraz ze względu na bardzo prosty interfejs do żądań i sesji, lepiej zintegrowane środowiska między serwerami internetowymi a aplikacjami są znacznie bardziej popularne. Środowiska takie jak nowoczesna implementacja php z Apache znacznie lepiej integrują język docelowy z serwerem WWW i zapewniają dostęp do obiektów żądań i sesji potrzebnych do wydajnej obsługi żądań HTTP. Oferują one znacznie łatwiejszy i bogatszy sposób pisania „programów” do obsługi żądań HTTP.

To, czy napisałeś skrypt CGI, zależy raczej od interpretacji. Z pewnością wykonał zadanie jednego, ale znacznie częściej uruchamia się php jako moduł, w którym interfejs między skryptem a serwerem nie jest ściśle interfejsem CGI.

CB Bailey
źródło
1
Zawracać głowę. Zacząłem pisać, gdy nie było innych odpowiedzi, ale zostałem powołany. Teraz chodzi o numer 8 na liście. Nie mam ochoty go teraz usuwać, wrócę i usunę go później.
CB Bailey,
6
Hej .. Proszę go nie usuwać. Mówi pewne rzeczy w bardziej przejrzysty sposób. Uznałem to za pomocne. Być może inni też to uznają. :)
pazury
1
OK, zostawię to na chwilę. Prawdopodobnie dobrze by było, gdyby ktoś zintegrował jakieś „lepsze” fragmenty z jedną z pełniejszych odpowiedzi. Wtedy moglibyśmy otrzymać bardziej ostateczną odpowiedź.
CB Bailey,
18

CGI jest określony w RFC 3875 , choć jest to późniejsza „oficjalna” kodyfikacja oryginalnego dokumentu NCSA . Zasadniczo CGI definiuje protokół do przekazywania danych o żądaniu HTTP z serwera WWW do programu do przetworzenia - dowolnego programu, w dowolnym języku. W momencie pisania specyfikacji (1993) większość serwerów zawierała tylko strony statyczne, „aplikacje internetowe” były rzadką i nową rzeczą, więc naturalnie wydawało się, że należy je odróżniać od „normalnej” zawartości statycznej, np. cgi-binkatalog oprócz zawartości statycznej, a ich zakończenie .cgi.

W tym czasie nie było też dedykowanych „języków programowania WWW”, takich jak PHP, a C był dominującym przenośnym językiem programowania - tak wiele osób pisało swoje skrypty CGI w C. Jednak Perl szybko okazał się lepiej przystosowany do tego rodzaju i CGI na jakiś czas stała się niemal synonimem Perla. Potem pojawiły się serwlety Java, PHP i wiele innych, które przejęły dużą część udziału Perla w rynku.

Michael Borgwardt
źródło
Dlaczego PHP jest „dedykowanym językiem programowania WWW”? PHP jest językiem o ogólnym przeznaczeniu i ludzie używają go również w aplikacjach interfejsu użytkownika.
Pacerier
@Pacerier: został zaprojektowany jako język programowania do generowania stron internetowych i do tego używa go 99,9% użytkowników. Jest nawet w nazwie . Żądanie czegokolwiek innego jest po prostu bezcelowym rozdwajaniem włosów. Jeśli używasz go do aplikacji interfejsu użytkownika, obliczeń naukowych lub programowania wbudowanego, dobrze, bądź szczęśliwy, nikt nie mówi, że nie możesz.
Michael Borgwardt,
13

Zobacz CGI w Wikipedii. CGI to protokół między serwerem WWW a programem zewnętrznym lub skryptem, który obsługuje dane wejściowe i generuje dane wyjściowe wysyłane do przeglądarki.

CGI to po prostu sposób na komunikację między serwerem internetowym a programem, nic więcej, nic więcej. Tutaj serwer zarządza połączeniem sieciowym i protokołem HTTP, a program obsługuje dane wejściowe i generuje dane wyjściowe wysyłane do przeglądarki. Skrypt CGI może być w zasadzie dowolnym programem, który może być uruchomiony przez serwer WWW i działa zgodnie z protokołem CGI. W ten sposób program CGI może zostać zaimplementowany, na przykład w C. Jednak jest to niezwykle rzadkie, ponieważ C nie jest zbyt dobrze przystosowane do tego zadania.

/cgi-bin/*.cgito po prostu ścieżka, na której ludzie często umieszczają swój skrypt CGI. Serwer WWW jest zazwyczaj domyślnie skonfigurowany do pobierania skryptów CGI z tej ścieżki.

skrypt CGI może być zaimplementowany również w PHP, ale wszystkie programy PHP nie są skryptami CGI. Jeśli serwer WWW ma wbudowany interpreter PHP (np. Mod_php w Apache), wówczas faza CGI jest pomijana przez bardziej wydajny bezpośredni protokół między serwerem internetowym a tłumaczem.

To, czy zaimplementowałeś skrypt CGI, zależy od tego, w jaki sposób skrypt jest wykonywany przez serwer WWW.

Juha Syrjälä
źródło
12

CGI zasadniczo przekazuje żądanie do dowolnego interpretera skonfigurowanego z serwerem WWW - może to być Perl, Python, PHP, Ruby, C prawie wszystko. Perl był najczęściej w tym dniu, dlatego często widzisz go w odniesieniu do CGI.

CGI nie jest martwy. W rzeczywistości większość dużych firm hostingowych używa PHP jako CGI w przeciwieństwie do mod_php, ponieważ oferuje konfigurację na poziomie użytkownika i kilka innych rzeczy, podczas gdy jest wolniejszy niż mod_php. Ruby i Python są zwykle uruchamiane jako CGI. kluczową różnicą tutaj jest to, że moduł serwera działa jako część rzeczywistego oprogramowania serwera - gdzie, podobnie jak w przypadku CGI, jest on całkowicie poza serwerem. Serwer po prostu używa modułu CGI, aby określić, jak przekazywać i odbierać dane do zewnętrznego tłumacza.

prodigitalon
źródło
2
Nie downvoting, ale większość instalacji Pythona widziałem gdzie na mod_wsgi lub mod_python.
ChristopheD
Tak większość ludzi używa terminu CGI, ale nie do końca to oznacza.
reinierpost
Mówisz, że interpreter, ale C rzadko jest interpretowany, a skompilowane programy, takie jak skompilowane programy C, mogą być używane do CGI.
user34660,
11

CGI to mechanizm, za pomocą którego serwer WWW wywołuje zewnętrzny program w celu obsługi żądania, przy czym zmienne środowiskowe i standardowe dane wejściowe są wykorzystywane do dostarczania danych żądania do programu. Dokładny język, w którym napisany jest program zewnętrzny, nie ma znaczenia, chociaż łatwiej jest pisać programy CGI w niektórych językach niż w innych.

Ponieważ skrypty CGI wymagają uprawnień do wykonywania, httpd domyślnie zezwala tylko na uruchamianie programów CGI w cgi-binkatalogu w celu (prawdopodobnie teraz błędnego) zabezpieczenia.

Większość skryptów PHP działa w procesie serwera WWW za pośrednictwem mod_php. To nie jest CGI.

Interfejs CGI działa wolno, ponieważ program (i powiązany z nim tłumacz) musi zostać uruchomiony na żądanie. Współczesnymi alternatywami są wbudowane wykonywanie, używane przez mod_php, oraz procesy długotrwałe, używane przez FastCGI. Dany język może mieć własny sposób implementacji tych mechanizmów, więc pamiętaj, aby zapytać przed skorzystaniem z CGI.

Ignacio Vazquez-Abrams
źródło
@Ignacio Vazquez-Abrams: jeśli interfejs CGI tworzy nowy proces, za każdym razem, gdy otrzymuje żądanie zasobu CGI, niż jaka jest różnica w wykonywaniu między CGI a mod_php ??????? czy CGI i mod_php są takie same ???? czy jest możliwe pisanie skryptów PHP działających pod interfejsem CGI, a nie pod mod_php ???
hardik
@Hardik: mod_php działa jako część HTTPd, który jest odpowiedzialny za swoje własne procesy.
Ignacio Vazquez-Abrams
czym jest ten „program zewnętrzny”? czy to jest tłumacz, jeśli uruchamiam php z php-fpm?
płasko
@slier: To dowolny program, który nie jest serwerem WWW.
Ignacio Vazquez-Abrams
@ IgnacioVazquez-Abrams, więc czy można bezpiecznie założyć, że jest to aplikacja dla interpreterPHP z php-fpm?
płasko
7

Być może chcesz wiedzieć, co nie jest CGI, a odpowiedzią jest MODUŁ dla twojego serwera WWW (jeśli podejrzewam, że jesteś uruchomiony Apache). I TO WIELKA RÓŻNICA, ponieważ CGI potrzebuje i zewnętrznego programu, wątku, cokolwiek, aby utworzyć instancję serwera aplikacji PERL, PHP, C, gdzie gdy uruchamiasz jako MODUŁ, ten program jest serwerem sieciowym (apache) per se.

Z tego powodu pojawia się wiele problemów związanych z wydajnością, bezpieczeństwem i przenośnością. Ale dobrze jest wiedzieć, co nie jest CGI, aby zrozumieć, co to jest.

denica
źródło
7

Przykład z życia: skomplikowana baza danych, którą należy wyświetlić na stronie internetowej. Ponieważ baza danych została zaprojektowana gdzieś około 1986 roku (!), Wiele danych zostało spakowanych na różne sposoby, aby zaoszczędzić miejsce na dysku.

W miarę rozwoju deweloperzy nie mogli już rozwiązywać skomplikowanych żądań danych w samym SQL, na przykład ponieważ algorytmy sortowania były niezwykłe.

Istnieją trzy rozsądne rozwiązania:

  1. szybkie i brudne: wyślij niezapisane dane do PHP, posortuj je tam. Oczywiście bardzo drogie rozwiązanie, ponieważ powtarzałoby się to przy każdym wywołaniu strony
  2. napisać wtyczkę do silnika bazy danych - ale administrator nie był gotowy, aby zezwolić na uruchomienie obcego kodu na swoim serwerze, lub
  3. możesz przetwarzać dane w programie (C, Perl itp.) i wysyłać HTML. Sam program przechodzi do / cgi-bin i jest wywoływany bezpośrednio przez serwer WWW (np. Apache), a nie przez PHP.

CGI uruchamia skrypt w rozwiązaniu nr 3 i przekazuje efekt do przeglądarki. Masz szybkość skompilowanego programu, elastyczność języka lepszą niż SQL i nie musisz pisać wtyczek na serwerze SQL. (Ponownie jest to przykład specyficzny dla SQL i C)

Michał Leon
źródło
1
Najlepsza odpowiedź dla mnie, mam ją.
Daniel Katz
7

Skrypt CGI to program konsoli / powłoki. W systemie Windows, gdy używasz okna „Wiersz polecenia”, uruchamiasz programy konsoli. Gdy serwer WWW wykonuje skrypt CGI, dostarcza danych wejściowych do programu konsoli / powłoki przy użyciu zmiennych środowiskowych lub „standardowego wejścia”. Standardowe wprowadzanie jest jak wpisywanie danych do programu konsoli / powłoki; w przypadku skryptu CGI serwer WWW pisze. Skrypt CGI zapisuje dane na „standardowym wyjściu” i dane te są wysyłane do klienta (przeglądarki internetowej) jako strona HTML. Standardowe dane wyjściowe są podobne do danych wyjściowych wyświetlanych w programie konsoli / powłoki, tyle że serwer WWW odczytuje je i wysyła.

Skrypt CGI można uruchomić z przeglądarki. Identyfikator URI zazwyczaj zawiera ciąg zapytania dostarczany do skryptu CGI. Jeśli metodą jest „get”, ciąg zapytania jest dostarczany do skryptu CGI w zmiennej środowiskowej o nazwie QUERY_STRING. Jeśli metodą jest „post”, ciąg zapytania jest dostarczany do skryptu CGI przy użyciu standardowego wejścia (skrypt CGI odczytuje ciąg zapytania ze standardowego wejścia).

Wczesne użycie skryptów CGI polegało na przetwarzaniu formularzy. Na początku HTML formularze HTML zazwyczaj miały atrybut „akcji” i przycisk oznaczony jako przycisk „prześlij”. Po naciśnięciu przycisku wysyłania identyfikator URI określony w atrybucie „action” zostanie wysłany na serwer z danymi z formularza przesłanymi jako ciąg zapytania. Jeśli „akcja” określa skrypt CGI, skrypt CGI zostanie wykonany, a następnie wygeneruje stronę HTML.

RFC 3875 „Interfejs Common Gateway Interface (CGI)” częściowo definiuje CGI za pomocą C, tak jak w powiedzeniu, że do zmiennych środowiskowych „można uzyskać dostęp do procedury biblioteki C getenv () lub zmiennej environment”.

Jeśli tworzysz skrypt CGI przy użyciu C / C ++ i używasz do tego Microsoft Visual Studio, to opracowałbyś program konsoli.

użytkownik34660
źródło
„Skrypt CGI” jest szerokim pojęciem i może również obejmować pliki wykonywalne.
71GA
6

CGI to program (lub interfejs API sieci Web), który piszesz i zapisujesz na stronie serwera sieci Web. CGI to plik.

Ten plik znajduje się i czeka na serwerze sieci Web. Gdy przeglądarka klienta wysyła do serwera WWW żądanie wykonania pliku CGI, serwer WWW uruchamia plik CGI na stronie serwera. Dane wejściowe dla tego programu CGI, jeśli istnieją, pochodzą z przeglądarki klienta. Dane wyjściowe tego programu CGI są wysyłane do przeglądarki.

W jakim języku piszesz program CGI? Inne posty już wspominają o c, java, php, perl itp.

Loc Pham
źródło
4

Idea CGI polega na tym, że program / skrypt (czy to Perl, czy nawet C) odbiera dane wejściowe przez STDIN(dane żądania) i wysyła dane przez STDOUT(echo, printfinstrukcje).

Powodem, dla którego większość skryptów PHP się nie kwalifikuje jest to, że są uruchamiane w module PHP Apache.

Nathan Osman
źródło