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 tencgi-bin
katalog 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:
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)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
Odpowiedzi:
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:
Patrz wyżej.
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.
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 .
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.
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 .
źródło
Server side Program
na 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.Sposób, w jaki serwer WWW może pobrać dane z programu (zamiast na przykład pliku).
Nie ma sprawy. To tylko konwencja.
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.
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.
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.
To jest język programowania, dlaczego nie?
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.
STDIN / STDOUT i zmienne środowiskowe - zgodnie ze specyfikacją CGI.
Używając dowolnych metod, które lubisz i są obsługiwane.
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.
1.1
źródło
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.
źródło
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-bin
katalog 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.
źródło
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/*.cgi
to 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.
źródło
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.
źródło
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-bin
katalogu 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.
źródło
interpreter
PHP z php-fpm?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.
źródło
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:
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)
źródło
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.
źródło
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.
źródło
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 przezSTDOUT
(echo,printf
instrukcje).Powodem, dla którego większość skryptów PHP się nie kwalifikuje jest to, że są uruchamiane w module PHP Apache.
źródło