CGI ist eine Common Gateway-Schnittstelle. Wie der Name schon sagt, ist es eine "gemeinsame" Gateway-Schnittstelle für alles. Es ist so trivial und naiv vom Namen. Ich habe das Gefühl, dass ich das verstanden habe und ich fühlte es jedes Mal, wenn ich auf dieses Wort stieß. Aber ehrlich gesagt habe ich nicht. Ich bin immer noch verwirrt.
Ich bin ein PHP-Programmierer mit Erfahrung in der Webentwicklung.
Benutzeranforderung (Client) für Seite ---> Webserver (-> eingebetteter PHP-Interpreter) ----> Serverseitiges (PHP) Skript ---> MySQL Server.
Angenommen, mein PHP-Skript kann Ergebnisse vom MySQL-Server, vom MATLAB-Server und von einem anderen Server abrufen.
Also, jetzt ist PHP Script das CGI? Weil seine Schnittstelle für den zwischen Webserver und allen anderen Servern? Ich weiß es nicht. Manchmal nennen sie CGI, eine Technologie und manchmal nennen sie CGI ein Programm oder einen anderen Server.
Was genau ist CGI?
Was ist die große Sache
/cgi-bin/*.cgi
? Was ist damit los? Ich weiß nicht, wofür diesescgi-bin
Verzeichnis auf dem Server ist. Ich weiß nicht, warum sie * .cgi-Erweiterungen haben.Warum kommt Perl immer in die Quere? CGI & Perl (Sprache). Ich weiß auch nicht, was mit diesen beiden los ist. Fast die ganze Zeit höre ich diese beiden in Kombination "CGI & Perl". Dieses Buch ist ein weiteres großartiges Beispiel für die CGI-Programmierung mit Perl . Warum nicht "CGI-Programmierung mit PHP / JSP / ASP"? Ich habe solche Dinge nie gesehen.
CGI-Programmierung in C verwirrt mich sehr. " in C " ?? Ernsthaft?? Ich weiß nicht was ich sagen soll. Ich bin nur verwirrt. " in C " ?? Das ändert alles. Das Programm muss kompiliert und ausgeführt werden. Dies ändert meine Sicht der Webprogrammierung völlig. Wann kompiliere ich? Wie wird das Programm ausgeführt (da es sich um einen Maschinencode handelt und daher als unabhängiger Prozess ausgeführt werden muss)? Wie kommuniziert es mit dem Webserver? IPC? und Schnittstelle mit allen Servern (in meinem Beispiel MATLAB & MySQL) über Socket-Programmierung? Ich bin verloren!!
Die Leute sagen, dass CGI veraltet ist und nicht mehr verwendet wird. Ist das so? Was ist das neueste Update?
Einmal stieß ich auf eine Situation, in der ich HTTP-PUT-Anforderungszugriff auf den Webserver (Apache HTTPD) gewähren musste. Es ist ein langer Rücken. Soweit ich mich erinnere, habe ich Folgendes getan:
Die Konfigurationsdatei von Apache HTTPD wurde bearbeitet, um den Webserver anzuweisen, alle HTTP-PUT-Anforderungen an einige zu übergeben
put.php
(ich musste dieses PHP-Skript schreiben).Implementieren Sie put.php, um die Anforderung zu bearbeiten (speichern Sie die Datei an dem angegebenen Speicherort).
Die Leute sagten, ich hätte ein CGI-Skript geschrieben. Im Ernst, ich hatte keine Ahnung, wovon sie sprachen.
- Habe ich wirklich CGI Script geschrieben?
Ich hoffe du hast verstanden, was meine Verwirrung ist. (Weil ich selbst nicht weiß, wo ich verwirrt bin). Ich bitte euch, eure Antwort so einfach wie möglich zu halten. Ich kann wirklich keine ausgefallene technische Terminologie verstehen. Zumindest nicht in diesem Fall.
BEARBEITEN:
Ich fand dieses erstaunliche Tutorial "CGI-Programmierung ist einfach!" - CGI-Tutorial , das die Konzepte auf einfachste Weise erklärt. Nach dem Lesen dieses Artikels möchten Sie möglicherweise Erste Schritte mit der CGI-Programmierung in C lesen , um Ihr Verständnis durch tatsächliche Codebeispiele zu ergänzen. Ich habe diese Links zu diesem Tutorial auch zum Wikipedia-Artikel hinzugefügt: http://en.wikipedia.org/wiki/Common_Gateway_Interface
Antworten:
CGI ist eine Schnittstelle, die dem Webserver mitteilt, wie Daten an und von einer Anwendung übergeben werden sollen. Insbesondere wird beschrieben, wie Anforderungsinformationen in Umgebungsvariablen (wie Anfragetyp, Remote-IP-Adresse) übergeben werden, wie der Anforderungshauptteil über die Standardeingabe übergeben wird und wie die Antwort über die Standardausgabe ausgegeben wird. Einzelheiten finden Sie in der CGI-Spezifikation .
So verwenden Sie Ihr Bild:
user (client) request for page ---> webserver ---[CGI]----> Server side Program ---> MySQL Server.
Die meisten, wenn nicht alle Webserver können so konfiguriert werden, dass ein Programm als 'CGI' ausgeführt wird. Dies bedeutet, dass der Webserver nach Erhalt einer Anforderung die Daten an ein bestimmtes Programm weiterleitet, einige Umgebungsvariablen festlegt und die Parameter über die Standardeingabe und die Standardausgabe zusammenstellt, damit das Programm weiß, wo und wonach gesucht werden muss.
Der Hauptvorteil besteht darin, dass Sie JEDEN ausführbaren Code aus dem Web ausführen können, da sowohl der Webserver als auch das Programm wissen, wie CGI funktioniert. Aus diesem Grund können Sie Webprogramme in C oder Bash mit einem normalen CGI-fähigen Webserver schreiben. Das und das, dass die meisten Programmierumgebungen problemlos Standardeingabe-, Standardausgabe- und Umgebungsvariablen verwenden können.
In Ihrem Fall haben Sie höchstwahrscheinlich ein anderes, PHP-spezifisches Kommunikationsmittel zwischen Ihren Skripten und dem Webserver verwendet. Dies ist, wie Sie in Ihrer Frage gut erwähnen, ein eingebetteter Interpreter namens mod_php.
Beantworten Sie also Ihre Fragen:
Siehe oben.
Dies ist der traditionelle Ort für CGI-Programme. Viele Webserver verfügen über ein vorkonfiguriertes Verzeichnis, in dem alle Binärdateien als CGI-Programme ausgeführt werden. Die Erweiterung .cgi bezeichnet eine ausführbare Datei, von der erwartet wird, dass sie über das CGI funktioniert.
Da Perl uralt ist (älter als PHP, JSP und ASP, die alle entstanden sind, als CGI bereits alt war, existierte Perl, als CGI neu war) und ziemlich berühmt wurde, weil es eine sehr gute Sprache ist, um dynamische Webseiten über CGI zu bedienen. Heutzutage gibt es andere Alternativen, um Perl auf einem Webserver auszuführen, hauptsächlich mod_perl .
Sie kompilieren die ausführbare Datei einmal, der Webserver führt das Programm aus und übergibt die Daten in der Anforderung an das Programm und gibt die empfangene Antwort aus. CGI gibt an, dass pro Anforderung eine Programminstanz gestartet wird. Aus diesem Grund ist CGI heutzutage ineffizient und veraltet.
CGI wird immer noch verwendet, wenn die Leistung nicht an erster Stelle steht und ein einfaches Mittel zum Ausführen von Code erforderlich ist. Es ist aus den zuvor genannten Gründen ineffizient und es gibt modernere Mittel, um ein Programm in einer Webumgebung auszuführen. Derzeit ist FastCGI das bekannteste .
quelle
Server side Program
in Ihrer Figur ist mein PHP-Skript. Also habe ich noch nie CGI programmiert? Weil ich nie etwas geschrieben habe, das zwischen dem Webserver und meinem PHP-Skript liegt. Verdammt!! das bringt mich umEin Mittel für einen Webserver, um seine Daten von einem Programm abzurufen (anstelle von beispielsweise einer Datei).
Keine große Sache. Es ist nur eine Konvention.
Der Server muss wissen, was mit der Datei zu tun ist (dh sie muss als ein Programm behandelt werden, das ausgeführt werden soll, anstatt als etwas, das einfach bereitgestellt werden soll). Mit der Erweiterung .html wird ein Text- / HTML-Inhaltstyp verwendet. Mit einer .cgi-Erweiterung wird es angewiesen, es als Programm auszuführen.
Das Speichern von ausführbaren Dateien in einem separaten Verzeichnis bietet zusätzlichen Schutz vor der Ausführung falscher Dateien und / oder der Bereitstellung von CGI-Programmen als Rohdaten für den Fall, dass der Server falsch konfiguriert wird.
Das tut es nicht. Perl war zur gleichen Zeit wie CGI einfach groß und beliebt.
Ich habe Perl CGI seit Jahren nicht mehr verwendet. Ich habe mod_perl lange Zeit verwendet und tendiere heutzutage zu PSGI / Plack mit FastCGI.
CGI ist nicht sehr effizient. Etwa zur gleichen Zeit wie PHP gab es bessere Methoden für die Kommunikation mit Programmen von Webservern. JSP und ASP sind verschiedene Methoden für die Kommunikation mit Programmen.
Es ist eine Programmiersprache, warum nicht?
Es muss nicht als unabhängiger Prozess ausgeführt werden (Sie können Apache-Module in C schreiben), aber das gesamte Konzept von CGI besteht darin, dass ein externer Prozess gestartet wird.
STDIN / STDOUT und Umgebungsvariablen - wie in der CGI-Spezifikation definiert.
Verwenden Sie beliebige Methoden, die Ihnen gefallen und unterstützt werden.
CGI ist ineffizient, langsam und einfach. Es wird selten verwendet, wenn es verwendet wird, weil es einfach ist. Wenn Leistung keine große Sache ist, ist Einfachheit viel wert.
1.1
quelle
CGI ist eine Schnittstellenspezifikation zwischen einem Webserver (HTTP-Server) und einem ausführbaren Programm eines Typs, der eine bestimmte Anforderung verarbeiten soll.
Es wird beschrieben, wie bestimmte Eigenschaften dieser Anforderung an die Umgebung dieses Programms übermittelt werden sollen und wie das Programm die Antwort an den Server zurücksenden soll und wie der Server die Antwort "vervollständigen" soll, um eine gültige Antwort auf die ursprüngliche HTTP-Anforderung zu bilden.
Für eine Weile war CGI ein IETF-Internetentwurf und hatte als solcher ein Ablaufdatum. Es ist ohne Update abgelaufen, daher gab es keinen CGI-Standard. Es ist jetzt ein informativer RFC, aber als solcher dokumentiert es gängige Praxis und ist selbst kein Standard. rfc3875.txt , rfc3875.html
Programme, die eine CGI-Schnittstelle implementieren, können in jeder Sprache geschrieben werden, die auf dem Zielcomputer ausgeführt werden kann. Sie müssen in der Lage sein, auf Umgebungsvariablen und normalerweise auf Standardeingaben zuzugreifen, und sie generieren ihre Ausgabe auf Standardausgaben .
Kompilierte Sprachen wie C wurden häufig verwendet, ebenso wie Skriptsprachen wie Perl, wobei häufig Bibliotheken verwendet wurden, um den Zugriff auf die CGI-Umgebung zu erleichtern.
Einer der großen Nachteile von CGI besteht darin, dass für jede Anforderung ein neues Programm erstellt wird, sodass das Aufrechterhalten des Status zwischen Anforderungen ein großes Leistungsproblem darstellen kann. Der Status kann in Cookies behandelt oder in einer URL codiert werden. Wenn er jedoch zu groß wird, muss er an einer anderen Stelle gespeichert und anhand verschlüsselter URL-Informationen oder eines Cookies verschlüsselt werden. Jeder CGI-Aufruf müsste dann den gespeicherten Status aus einem Geschäft irgendwo neu laden.
Aus diesem Grund und für eine sehr einfache Schnittstelle zu Anforderungen und Sitzungen sind besser integrierte Umgebungen zwischen Webservern und Anwendungen viel beliebter. Umgebungen wie eine moderne PHP-Implementierung mit Apache integrieren die Zielsprache viel besser in den Webserver und bieten Zugriff auf Anforderungs- und Sitzungsobjekte, die zur effizienten Bearbeitung von http-Anforderungen erforderlich sind. Sie bieten eine viel einfachere und umfassendere Möglichkeit, "Programme" für die Verarbeitung von HTTP-Anforderungen zu schreiben.
Ob Sie ein CGI-Skript geschrieben haben, hängt eher von der Interpretation ab. Es hat sicherlich die Arbeit von einem gemacht, aber es ist viel üblicher, PHP als Modul auszuführen, bei dem die Schnittstelle zwischen dem Skript und dem Server nicht ausschließlich eine CGI-Schnittstelle ist.
quelle
Das CGI ist in RFC 3875 spezifiziert , obwohl dies eine spätere "offizielle" Kodifizierung des ursprünglichen NCSA-Dokuments ist . Grundsätzlich definiert CGI ein Protokoll zum Übergeben von Daten über eine HTTP-Anforderung von einem Webserver an ein zu verarbeitendes Programm - jedes Programm in jeder Sprache. Zum Zeitpunkt der Erstellung der Spezifikation (1993) enthielten die meisten Webserver nur statische Seiten. "Web-Apps" waren eine seltene und neue Sache, daher schien es naheliegend, sie von den "normalen" statischen Inhalten fernzuhalten, wie z
cgi-bin
Verzeichnis abgesehen von den statischen Inhalten, und sie enden in.cgi
.Zu dieser Zeit gab es hier auch keine dedizierten "Web-Programmiersprachen" wie PHP, und C war die dominierende tragbare Programmiersprache - so viele Leute schrieben ihre CGI-Skripte in C. Aber Perl erwies sich schnell als besser geeignet für diese Art von und CGI wurde für eine Weile fast zum Synonym für Perl. Dann kamen Java-Servlets, PHP und einige andere und übernahmen große Teile des Perl-Marktanteils.
quelle
Schauen Sie sich CGI in Wikipedia an. CGI ist ein Protokoll zwischen dem Webserver und einem externen Programm oder einem Skript, das die Eingabe verarbeitet und eine Ausgabe generiert, die an den Browser gesendet wird.
CGI ist eine einfache Möglichkeit für Webserver und ein Programm, nicht mehr und nicht weniger zu kommunizieren. Hier verwaltet der Server die Netzwerkverbindung und das HTTP-Protokoll und das Programm verarbeitet die Eingabe und generiert die Ausgabe, die an den Browser gesendet wird. CGI-Skript kann grundsätzlich jedes Programm sein, das vom Webserver ausgeführt werden kann und dem CGI-Protokoll folgt. So kann ein CGI-Programm beispielsweise in C implementiert werden. Dies ist jedoch äußerst selten, da C für die Aufgabe nicht sehr gut geeignet ist.
/cgi-bin/*.cgi
ist einfach ein Weg, auf dem Leute üblicherweise ihr CGI-Skript ablegen. Webserver sind normalerweise standardmäßig so konfiguriert, dass CGI-Skripte von diesem Pfad abgerufen werden.Ein CGI-Skript kann auch in PHP implementiert werden, aber alle PHP-Programme sind keine CGI-Skripte. Wenn der Webserver einen eingebetteten PHP-Interpreter hat (z. B. mod_php in Apache), wird die CGI-Phase durch ein effizienteres direktes Protokoll zwischen dem Webserver und dem Interpreter übersprungen.
Ob Sie ein CGI-Skript implementiert haben oder nicht, hängt davon ab, wie Ihr Skript vom Webserver ausgeführt wird.
quelle
CGI leitet die Anforderung im Wesentlichen an jeden Interpreter weiter, der mit dem Webserver konfiguriert ist. Dies können so ziemlich alles Perl, Python, PHP, Ruby, C sein. Perl war damals die häufigste, weshalb man es oft in Bezug auf CGI sieht.
CGI ist nicht tot. Tatsächlich führen die meisten großen Hosting-Unternehmen PHP als CGI im Gegensatz zu mod_php aus, da es eine Konfiguration auf Benutzerebene und einige andere Dinge bietet, während es langsamer als mod_php ist. Ruby und Python werden normalerweise auch als CGI ausgeführt. Der Hauptunterschied besteht darin, dass ein Servermodul als Teil der eigentlichen Serversoftware ausgeführt wird - wobei es wie bei CGI vollständig außerhalb des Servers liegt. Der Server verwendet lediglich das CGI-Modul, um zu bestimmen, wie Daten an den externen Interpreter übergeben und empfangen werden.
quelle
CGI ist ein Mechanismus, bei dem ein externes Programm vom Webserver aufgerufen wird, um eine Anforderung zu verarbeiten, wobei Umgebungsvariablen und Standardeingaben verwendet werden, um die Anforderungsdaten dem Programm zuzuführen. Die genaue Sprache, in der das externe Programm geschrieben ist, spielt keine Rolle, obwohl es einfacher ist, CGI-Programme in einigen Sprachen als in anderen zu schreiben.
Da CGI-Skripte Ausführungsberechtigungen benötigen, können mit httpd standardmäßig nur CGI-Programme im
cgi-bin
Verzeichnis zu (möglicherweise jetzt fehlgeleiteten) Sicherheitszwecken ausgeführt werden.Die meisten PHP-Skripte werden im Webserver über ausgeführt
mod_php
. Dies ist kein CGI.CGI ist langsam, da das Programm (und der zugehörige Interpreter) pro Anforderung gestartet werden müssen. Moderne Alternativen sind eingebettete Ausführung, die von mod_php verwendet wird, und lang laufende Prozesse, die von FastCGI verwendet werden. Eine bestimmte Sprache hat möglicherweise ihre eigene Art, diese Mechanismen zu implementieren. Fragen Sie daher unbedingt nach, bevor Sie auf CGI zurückgreifen.
quelle
interpreter
wenn ich php mit php-fpm laufen lasse?Sie möchten vielleicht wissen, was nicht CGI ist, und die Antwort ist ein MODUL für Ihren Webserver (wenn Sie vermutlich Apache ausführen). UND DAS IST DER GROSSE UNTERSCHIED, da CGI ein externes Programm und einen Thread benötigt, um einen PERL-, PHP-, C-App-Server zu instanziieren. Wenn Sie als MODUL ausgeführt werden, ist dieses Programm per se der Webserver (Apache).
Aus diesem Grund spielen viele Probleme in Bezug auf Leistung, Sicherheit und Portabilität eine Rolle. Aber es ist gut zu wissen, was nicht CGI ist, um zu verstehen, was es ist.
quelle
Ein Beispiel aus der Praxis: Eine komplizierte Datenbank, die auf einer Website angezeigt werden muss. Da die Datenbank irgendwo um 1986 (!) Entworfen wurde, wurden viele Daten auf unterschiedliche Weise gepackt, um Speicherplatz zu sparen.
Im Verlauf der Entwicklung konnten die Entwickler komplizierte Datenanforderungen nicht mehr nur in SQL lösen, beispielsweise weil die Sortieralgorithmen ungewöhnlich waren.
Es gibt drei sinnvolle Lösungen:
CGI führt Ihr Skript in Lösung 3 aus und gibt den Effekt an den Browser aus. Sie haben die Geschwindigkeit des kompilierten Programms, die Flexibilität einer Sprache, die besser als SQL ist, und müssen keine Plugins auf den SQL Server schreiben. (Auch dies ist ein spezifisches Beispiel für SQL und C)
quelle
Ein CGI-Skript ist ein Konsolen- / Shell-Programm. Wenn Sie in Windows ein Eingabeaufforderungsfenster verwenden, führen Sie Konsolenprogramme aus. Wenn ein Webserver ein CGI-Skript ausführt, liefert er Eingaben in das Konsolen- / Shell-Programm unter Verwendung von Umgebungsvariablen oder "Standardeingaben". Die Standardeingabe ist wie das Eingeben von Daten in ein Konsolen- / Shell-Programm. Im Fall eines CGI-Skripts führt der Webserver die Eingabe durch. Das CGI-Skript schreibt Daten in die "Standardausgabe" und diese Ausgabe wird als HTML-Seite an den Client (den Webbrowser) gesendet. Die Standardausgabe entspricht der Ausgabe, die Sie in einem Konsolen- / Shell-Programm sehen, außer dass der Webserver sie liest und sendet.
Ein CGI-Skript kann über einen Browser ausgeführt werden. Der URI enthält normalerweise eine Abfragezeichenfolge, die dem CGI-Skript bereitgestellt wird. Wenn die Methode "get" lautet, wird die Abfragezeichenfolge dem CGI-Skript in einer Umgebungsvariablen namens QUERY_STRING bereitgestellt. Wenn die Methode "post" ist, wird die Abfragezeichenfolge dem CGI-Skript unter Verwendung der Standardeingabe bereitgestellt (das CGI-Skript liest die Abfragezeichenfolge aus der Standardeingabe).
Eine frühe Verwendung von CGI-Skripten war die Verarbeitung von Formularen. Zu Beginn von HTML hatten HTML-Formulare normalerweise ein "Aktions" -Attribut und eine Schaltfläche, die als "Senden" -Schaltfläche bezeichnet wurde. Wenn die Schaltfläche "Senden" gedrückt wird, wird der im Attribut "Aktion" angegebene URI mit den Daten aus dem als Abfragezeichenfolge gesendeten Formular an den Server gesendet. Wenn die "Aktion" ein CGI-Skript angibt, wird das CGI-Skript ausgeführt und es wird eine HTML-Seite erstellt.
RFC 3875 "Die Common Gateway-Schnittstelle (CGI)" definiert CGI teilweise mit C, indem gesagt wird, dass auf Umgebungsvariablen "über die C-Bibliotheksroutine getenv () oder variable Umgebung zugegriffen wird".
Wenn Sie ein CGI-Skript mit C / C ++ entwickeln und dazu Microsoft Visual Studio verwenden, entwickeln Sie ein Konsolenprogramm.
quelle
Ein CGI ist ein Programm (oder eine Web-API), das Sie schreiben und auf der Webserver-Site speichern. CGI ist eine Datei.
Diese Datei befindet sich und wartet auf dem Webserver. Wenn der Client-Browser eine Anforderung an den Webserver sendet, um Ihre CGI-Datei auszuführen, führt der Webserver Ihre CGI-Datei auf der Server-Site aus. Die Eingaben für dieses CGI-Programm, falls vorhanden, stammen vom Client-Browser. Die Ausgaben dieses CGI-Programms werden an den Browser gesendet.
Mit welcher Sprache schreiben Sie ein CGI-Programm? Andere Beiträge erwähnen bereits c, Java, PHP, Perl usw.
quelle
Die Idee hinter CGI ist, dass ein Programm / Skript (ob Perl oder sogar C) Eingaben über
STDIN
(die Anforderungsdaten ) empfängt und Daten überSTDOUT
(Echo,printf
Anweisungen) ausgibt .Der Grund, warum die meisten PHP- Skripte nicht qualifiziert sind, ist, dass sie unter dem PHP- Apache-Modul ausgeführt werden.
quelle