Was ist Common Gateway Interface (CGI)?

745

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 dieses cgi-binVerzeichnis 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:

  1. 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).

  2. 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

Krallen
quelle
9
Ich habe CGI bereits in Cobol geschrieben gesehen. Kein Kiding!
Luc M
@ Luc M. Interessiert. Welches CGI meinst du (vorausgesetzt, es gibt einen Raycaster in LINQ ...)?
Joe
15
@claws: Leute, hauptsächlich der alten Schule, nennen JEDEN Code, unabhängig von der tatsächlichen Ausführungsmethode, der über den Webserver ausgeführt wird, als CGI. Was Sie tatsächlich geschrieben haben, ist ein PHP-Skript, das möglicherweise über das CGI-Protokoll ausgeführt wird oder nicht. Ihre Verwirrung scheint auf die ambivalente Bedeutung von CGI zurückzuführen zu sein, einem Protokoll zum Ausführen von Code und dem Code, der über das Protokoll ausgeführt wird (das später verallgemeinert wurde, um jeden im Internet ausgeführten Code zu bedeuten)
Vinko Vrsalovic
1
Mitte der 90er Jahre schrieb ich ein paar CGI-Skripte in HyperCard
Neal Davis
@ Joe Ich habe die Benachrichtigung nie erhalten und heute, als ich diesen Beitrag noch einmal las, habe ich Ihre Frage gesehen. Die CGIs wurden auf OpenVMS als unabhängige ausführbare Dateien geschrieben (kein Framework oder Anwendungen von Drittanbietern ...)
Luc M

Antworten:

427

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:

Was genau ist CGI?

Siehe oben.

Was ist die große Sache mit /cgi-bin/*.cgi? Was ist damit los? Ich weiß nicht, wofür dieses CGI-Bin-Verzeichnis auf dem Server ist. Ich weiß nicht, warum sie * .cgi-Erweiterungen haben.

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.

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 CGI-Programmierung mit Perl. Warum nicht "CGI-Programmierung mit PHP / JSP / ASP"? Ich habe solche Dinge nie gesehen.

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 .

CGI-Programmierung in C das verwirrt mich sehr. in C ?? Ernsthaft?? Ich weiß nicht was ich sagen soll. Ich bin nur verwirrt. In C? Dies ändert alles. Das Programm muss kompiliert und ausgeführt werden. Dies ändert meine Sicht auf die Webprogrammierung vollständig. Wann kompiliere ich? Wie wird das Programm ausgeführt (weil es ein sein wird?) Maschinencode, daher muss er als unabhängiger Prozess ausgeführt werden. Wie kommuniziert er mit dem Webserver? IPC? und der Schnittstelle zu allen Servern (in meinem Beispiel MATLAB & MySQL) über Socket-Programmierung? Ich bin verloren !!

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.

Sie sagen, dass CGI veraltet ist. Es wird nicht mehr verwendet. Ist es so? Was ist das neueste Update?

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 .

Vinko Vrsalovic
quelle
24
Insbesondere wird beschrieben, wie Anforderungsinformationen in Umgebungsvariablen (wie Anfragetyp, Remote-IP-Adresse) übergeben werden, wie der erforderliche Text über die Standardeingabe übergeben wird und wie die Antwort über die Standardausgabe ausgegeben wird. Weitere Informationen finden Sie in der CGI-Spezifikation ( hoohoo.ncsa.illinois.edu/cgi ).
daf
3
Angenommen, Server side Programin 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 um
Krallen
4
PHP basiert immer noch stark auf dem CGI-Protokoll, der größte Teil des Inhalts von $ _SERVER stammt direkt aus der CGI-Spezifikation. Und "CGI-Programmierung" bedeutete immer, dass das Programm die Anforderung verarbeitete, nicht die Implementierung des Protokolls selbst. Wenn Sie einem Pionier der Webprogrammierung aus dem Jahr 1993 erklären würden, was Sie mit PHP machen, würde er es als eine fortgeschrittene (wenn auch möglicherweise schwache) Form der CGI-Programmierung betrachten.
Michael Borgwardt
5
@ Michael: Aber wenn über mod_php ausgeführt wird, ist CGI überhaupt nicht (auch wenn es darauf basiert). Und ich stimme zu, dass CGI sowohl auf das Protokoll als auch auf die über es ausgeführten Skripte verweist.
Vinko Vrsalovic
2
@Vinko Vrsalovic: Wenn CGI eine Schnittstelle für Perl, C oder andere Sprachen ist, die auf dem Webserver ausgeführt werden soll, als welche Schnittstelle wird von PHP zur Ausführung in Apache verwendet ???????? und fällt PHP unter die CGI-Spezifikationen?
Hardik
63

Was genau ist CGI?

Ein Mittel für einen Webserver, um seine Daten von einem Programm abzurufen (anstelle von beispielsweise einer Datei).

Was ist die große Sache mit /cgi-bin/*.cgi?

Keine große Sache. Es ist nur eine Konvention.

Ich weiß nicht, wofür dieses CGI-Bin-Verzeichnis auf dem Server ist. Ich weiß nicht, warum sie * .cgi-Erweiterungen haben.

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.

Warum kommt Perl immer in die Quere?

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.

Dieses Buch ist ein weiteres großartiges Beispiel für CGI-Programmierung mit Perl. Warum nicht "CGI-Programmierung mit PHP / JSP / ASP"?

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.

CGI-Programmierung in C das verwirrt mich sehr. in C ?? Ernsthaft??

Es ist eine Programmiersprache, warum nicht?

Wann kompiliere ich?

  1. Code schreiben
  2. Kompilieren
  3. Zugriffs-URL
  4. Webserver führt Programm aus

Wie wird das Programm ausgeführt (da es sich um einen Maschinencode handelt und daher als unabhängiger Prozess ausgeführt werden muss)?

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.

Wie kommuniziert es mit dem Webserver? IPC?

STDIN / STDOUT und Umgebungsvariablen - wie in der CGI-Spezifikation definiert.

und Schnittstelle mit allen Servern (in meinem Beispiel MATLAB & MySQL) über Socket-Programmierung?

Verwenden Sie beliebige Methoden, die Ihnen gefallen und unterstützt werden.

Sie sagen, dass CGI abgeschrieben wird. Es wird nicht mehr verwendet. Ist es so?

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.

Was ist das neueste Update?

1.1

QUentin
quelle
1. Code schreiben 2. Kompilieren 3. Zugriff auf URL 4. Webserver führt Programm aus. || Aber woher weiß der Webserver, wo Sie das kompilierte ausführbare Programm platzieren? Woher weiß es, welches ausführbare Programm (unter allen) ausgeführt werden soll?
Pacerier
@Pacerier - Genauso wie es weiß, welche statische Datei an den Client gesendet werden soll, wenn eine statische Datei angefordert wird.
Quentin
41

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.

CB Bailey
quelle
1
Mühe. Ich fing an, dies zu schreiben, als es keine anderen Antworten gab, wurde aber so genannt. Jetzt geht es um # 8 in der Liste. Ich habe nicht den Willen, es jetzt zu löschen, ich werde zurückkommen und es später löschen.
CB Bailey
6
Hey .. Bitte lösche es nicht. Es sagt einige Dinge klarer. Ich fand es hilfreich. Vielleicht finden es auch andere so. :)
Krallen
1
OK, ich lasse es für ein bisschen. Es wäre wahrscheinlich gut, wenn jemand „bessere“ Passagen in eine der umfassenderen Antworten integrieren würde. Dann hätten wir vielleicht eine endgültigere Antwort bekommen.
CB Bailey
18

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-binVerzeichnis 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.

Michael Borgwardt
quelle
Warum ist PHP eine "dedizierte Web-Programmiersprache"? PHP ist eine allgemeine Zwecksprache , die bereits für UI-Apps verwendet wird.
Pacerier
@Pacerier: Es wurde als Programmiersprache zum Generieren von Webseiten entwickelt, und dafür verwenden 99,9% der Benutzer es. Es ist sogar in seinem Namen . Alles andere zu behaupten ist nur sinnlos, die Haare zu spalten. Wenn Sie es für UI-Apps, wissenschaftliches Rechnen oder eingebettete Programmierung verwenden, seien Sie glücklich, niemand sagt, dass Sie das nicht dürfen.
Michael Borgwardt
13

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/*.cgiist 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.

Juha Syrjälä
quelle
12

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.

prodigitalson
quelle
2
Nicht Downvoting, aber die meisten Python-Web-Installationen, die ich gesehen habe, wo auf mod_wsgi oder mod_python.
ChristopheD
So verwenden die meisten Leute den Begriff CGI-Skript, aber es ist nicht ganz das, was der Begriff bedeutet.
Reinierpost
Sie sagen Interpreter, aber C wird selten interpretiert und kompilierte Programme wie C kompilierte Programme können für CGI verwendet werden.
user34660
11

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-binVerzeichnis 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.

Ignacio Vazquez-Abrams
quelle
@Ignacio Vazquez-Abrams: Wenn die CGI-Schnittstelle einen neuen Prozess erstellt, wird jedes Mal, wenn sie eine Anforderung für die CGI-Ressource erhält, der Ausführungsunterschied zwischen CGI und mod_php ermittelt ??????? ist CGI und mod_php sind gleich ???? oder ist es möglich PHP-Skripte zu schreiben, die unter CGI Interface laufen, nicht unter mod_php ???
Hardik
@Hardik: mod_php wird als Teil von HTTPd ausgeführt, das für seine eigenen Prozesse verantwortlich ist.
Ignacio Vazquez-Abrams
Was ist das "externe Programm"? Ist es ein Interpreter, wenn ich PHP mit PHP-Fpm laufen lasse?
Slier
@slier: Es ist ein beliebiges Programm, das nicht der Webserver ist.
Ignacio Vazquez-Abrams
@ IgnacioVazquez-Abrams also ist es sicher anzunehmen, dass es ein interpreterwenn ich php mit php-fpm laufen lasse?
Slier
7

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.

denica
quelle
7

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:

  1. schnell und schmutzig: senden Sie die nicht gespeicherten Daten an PHP, sortieren Sie sie dort. Offensichtlich eine sehr teure Lösung, da dies jedes Mal wiederholt wird, wenn die Seite aufgerufen wird
  2. Schreiben Sie ein Plugin in das Datenbankmodul. Der Administrator war jedoch nicht bereit, die Ausführung von Fremdcode auf seinem Server zuzulassen
  3. Sie können die Daten in einem Programm (C, Perl usw.) verarbeiten und HTML ausgeben. Das Programm selbst geht in / cgi-bin und wird vom Webserver (z. B. Apache) direkt aufgerufen, nicht über PHP.

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)

Michał Leon
quelle
1
Die beste Antwort für mich, ich habe es verstanden.
Daniel Katz
7

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.

user34660
quelle
Ein "CGI-Skript" ist ein weit gefasster Begriff und kann auch ausführbare Dateien enthalten.
71GA
6

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.

Loc Pham
quelle
4

Die Idee hinter CGI ist, dass ein Programm / Skript (ob Perl oder sogar C) Eingaben über STDIN(die Anforderungsdaten ) empfängt und Daten über STDOUT(Echo, printfAnweisungen) ausgibt .

Der Grund, warum die meisten PHP- Skripte nicht qualifiziert sind, ist, dass sie unter dem PHP- Apache-Modul ausgeführt werden.

Nathan Osman
quelle