web-dev-qa-db-fra.com

Qu'est-ce que l'interface CGI (Common Gateway Interface)?

CGI est une interface de passerelle commune. Comme son nom l'indique, il s'agit d'une interface de passerelle "commune" pour tout. C'est tellement trivial et naïf du nom. Je sens que j'ai compris cela et je l'ai ressenti chaque fois que j'ai rencontré cette Parole. Mais franchement, je ne l'ai pas fait. Je suis encore confus.

Je suis un PHP programmeur expérimenté en développement Web.

demande de l'utilisateur (client) pour la page ---> serveur Web (-> interpréteur PHP incorporé) ----> Script côté serveur (PHP) ---> Serveur MySQL.

Dites maintenant que mon script PHP peut récupérer les résultats du serveur MySQL, du serveur MATLAB et de tout autre serveur.

Donc, maintenant PHP Script est le CGI? Parce que son interface pour le serveur Web et tous les autres serveurs? Je ne sais pas. Parfois, ils appellent CGI, une technologie et d'autres fois, ils appellent CGI un programme ou un autre serveur.

  • Qu'est-ce que CGI?

  • Quel est le gros problème avec /cgi-bin/*.cgi? Quoi de neuf avec ça? Je ne sais pas à quoi sert ce répertoire cgi-bin sur le serveur. Je ne sais pas pourquoi ils ont des extensions * .cgi.

  • Pourquoi Perl intervient-il toujours? CGI & Perl (langue). Je ne sais pas non plus ce qui se passe avec ces deux-là. Presque tout le temps, j'entends souvent ces deux combinaisons "CGI & Perl". Ce livre est un autre excellent exemple Programmation CGI avec Perl . Pourquoi pas "Programmation CGI avec PHP/JSP/ASP"? Je n'ai jamais vu de telles choses.

  • La programmation CGI en C me confond beaucoup. " en C " ?? Sérieusement?? Je ne sais pas quoi dire. Je suis juste confuse. " en C " ?? Cela change tout. Le programme doit être compilé et exécuté. Cela change complètement ma vision de la programmation Web. Quand est-ce que je compile? Comment le programme est-il exécuté (puisqu'il s'agira d'un code machine, il doit donc être exécuté en tant que processus indépendant). Comment communique-t-il avec le serveur Web? IPC? et interfacer avec tous les serveurs (dans mon exemple MATLAB & MySQL) en utilisant la programmation de socket? Je suis perdu!!

  • Les gens disent que CGI est obsolète et n'est plus utilisé. Est-ce vrai? Quelle est la dernière mise à jour?

Une fois, je me suis retrouvé dans une situation où je devais donner à une requête HTTP PUT l'accès au serveur Web (Apache HTTPD). C'est un long dos. Donc, autant que je m'en souvienne, voici ce que j'ai fait:

  1. Edité le fichier de configuration d'Apache HTTPD pour indiquer au serveur Web de transmettre toutes les requêtes HTTP PUT à un certain put.php (je devais écrire ce script PHP)

  2. Implémentez put.php pour gérer la requête (enregistrez le fichier à l'emplacement mentionné)

Les gens ont dit que j'avais écrit un script CGI. Sérieusement, je n'avais aucune idée de ce dont ils parlaient.

  • Ai-je vraiment écrit le script CGI?

J'espère que vous avez compris ce que ma confusion est. (Parce que moi-même je ne sais pas où je suis confus). Je vous demande de garder votre réponse aussi simple que possible. Je ne peux vraiment pas comprendre une terminologie technique sophistiquée. Du moins pas dans ce cas.

EDIT:

J'ai trouvé ce tutoriel incroyable "La programmation CGI est simple!" - Tutoriel CGI , qui explique les concepts de la manière la plus simple . Après avoir lu cet article, vous voudrez peut-être lire Mise en route de la programmation CGI en C pour compléter votre compréhension avec des exemples de code réels. J'ai également ajouté ces liens à ce tutoriel dans l'article de Wikipedia: http://en.wikipedia.org/wiki/Common_Gateway_Interface

723
claws

CGI est une interface qui indique au serveur Web comment transmettre des données depuis et vers une application. Plus spécifiquement, il décrit comment les informations de requête sont transmises dans les variables d'environnement (telles que le type de requête, l'adresse IP distante), comment le corps de la requête est transmis via une entrée standard et comment la réponse est transmise via une sortie standard. Vous pouvez vous référer au spécification CGI pour plus de détails.

Pour utiliser votre image:

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

La plupart des serveurs Web, sinon tous, peuvent être configurés pour exécuter un programme en tant que "CGI". Cela signifie que le serveur Web, lors de la réception d'une demande, transmettra les données à un programme spécifique, définissant des variables d'environnement et organisant les paramètres via l'entrée standard et la sortie standard afin que le programme sache où et ce qu'il faut rechercher.

Le principal avantage est que vous pouvez exécuter TOUT code exécutable à partir du Web, étant donné que le serveur Web et le programme connaissent le fonctionnement de CGI. C'est pourquoi vous pouvez écrire des programmes Web en C ou en Bash avec un serveur Web compatible CGI standard. Cela, et que la plupart des environnements de programmation peuvent facilement utiliser des variables d’entrée, de sortie standard et d’environnement.

Dans votre cas, vous avez probablement utilisé un autre moyen de communication, spécifique à PHP, entre vos scripts et le serveur Web. Il s'agit, comme vous l'avez bien indiqué dans votre question, d'un interpréteur intégré appelé mod_php.

Alors, répondant à vos questions:

Qu'est-ce que CGI?

Voir au dessus.

Quel est le gros problème avec /cgi-bin/*.cgi? Quoi de neuf avec ça? Je ne sais pas à quoi sert ce répertoire cgi-bin sur le serveur. Je ne sais pas pourquoi ils ont des extensions * .cgi.

C’est l’endroit traditionnel pour les programmes cgi. De nombreux serveurs Web sont livrés avec ce répertoire pré configuré pour y exécuter tous les fichiers binaires en tant que programmes CGI. L'extension .cgi désigne un exécutable censé fonctionner via le CGI.

Pourquoi Perl intervient-il toujours? CGI & Perl (langue). Je ne sais pas non plus ce qui se passe avec ces deux-là. Presque tout le temps, j'entends souvent ces deux combinaisons "CGI & Perl". Ce livre est un autre bon exemple de programmation CGI avec Perl Pourquoi pas "Programmation CGI avec PHP/JSP/ASP". Je n'ai jamais vu de telles choses.

Parce que Perl est ancien (plus ancien que PHP, JSP et ASP, tous nés lorsque CGI était déjà vieux, Perl existait quand CGI était nouveau) et est devenu assez célèbre pour être un très bon langage pour servir des pages Web dynamiques. via le CGI. De nos jours, il existe d'autres alternatives pour exécuter Perl sur un serveur Web, principalement mod_Perl .

La programmation CGI en C me confond beaucoup. en C ?? Sérieusement?? Je ne sais pas quoi dire. "Je suis simplement confus." En C "?? Cela change tout. Le programme doit être compilé et exécuté. Cela change complètement ma vision de la programmation Web. Quand dois-je compiler? Comment le programme est-il exécuté (car ce sera un Comment la communication avec le serveur Web (IPC) et l’interfaçage avec tous les serveurs (dans mon exemple MATLAB & MySQL) à l’aide de la programmation par socket? Je suis perdue !!

Vous compilez l'exécutable une fois, le serveur Web exécute le programme, transmet les données de la requête au programme et génère la réponse reçue. CGI spécifie qu'une instance de programme sera lancée pour chaque demande. C'est pourquoi CGI est inefficace et en quelque sorte obsolète.

Ils disent que CGI est obsolète. Ce n'est plus en usage. Est-ce vrai? Quelle est sa dernière mise à jour?

CGI est toujours utilisé lorsque les performances ne sont pas primordiales et qu'un moyen simple d'exécution de code est requis. Il est inefficace pour les raisons indiquées précédemment et il existe des moyens plus modernes d'exécuter n'importe quel programme dans un environnement Web. Actuellement, le plus célèbre est FastCGI .

417
Vinko Vrsalovic

Qu'est-ce que CGI?

Un moyen pour un serveur Web d'extraire ses données d'un programme (au lieu d'un fichier, par exemple).

Quel est le gros problème avec /cgi-bin/*.cgi?

Pas grand chose. C'est juste une convention.

Je ne sais pas à quoi sert ce répertoire cgi-bin sur le serveur. Je ne sais pas pourquoi ils ont des extensions * .cgi.

Le serveur doit savoir quoi faire avec le fichier (c’est-à-dire le traiter comme un programme à exécuter au lieu de servir simplement à servir). Avoir une extension .html lui dit d’utiliser un type de contenu text/html. Avoir une extension .cgi lui dit de l'exécuter en tant que programme.

Conserver les exécutables dans un répertoire séparé offre une protection supplémentaire contre l'exécution de fichiers incorrects et/ou la transmission de programmes bruts aux programmes CGI en tant que données brutes au cas où le serveur serait mal configuré.

Pourquoi Perl intervient-il toujours?.

Ce n'est pas. Perl était juste gros et populaire en même temps que CGI.

Je n'ai pas utilisé Perl CGI depuis des années. J'utilisais mod_Perl depuis longtemps et je suis plutôt orienté vers PSGI/Plack avec FastCGI.

Ce livre est un autre bon exemple de programmation CGI avec Perl Pourquoi pas "Programmation CGI avec PHP/JSP/ASP".

CGI n'est pas très efficace. De meilleures méthodes pour parler aux programmes des serveurs Web sont apparues à peu près au même moment que PHP. JSP et ASP sont différentes méthodes pour parler aux programmes.

La programmation CGI en C me confond beaucoup. en C ?? Sérieusement??

C'est un langage de programmation, pourquoi pas?

Quand est-ce que je compile?

  1. Écrire le code
  2. Compiler
  3. URL d'accès
  4. Le programme web tourne

Comment le programme est-il exécuté (puisqu'il s'agira d'un code machine, il doit donc être exécuté en tant que processus indépendant).

Il n'est pas nécessaire qu'il s'exécute en tant que processus indépendant (vous pouvez écrire des modules Apache en C), mais le concept de CGI est de lancer un processus externe.

Comment communique-t-il avec le serveur Web? IPC?

STDIN/STDOUT et variables d’environnement - telles que définies dans la spécification CGI.

et interfacer avec tous les serveurs (dans mon exemple MATLAB & MySQL) en utilisant la programmation de socket?

En utilisant toutes les méthodes que vous aimez et sont pris en charge.

Ils disent que CGI est amorti. Ce n'est plus en usage. Est-ce vrai?

CGI est inefficace, lent et simple. Il est rarement utilisé, quand il est utilisé, c'est parce que c'est simple. Si les performances ne sont pas un gros problème, la simplicité vaut beaucoup.

Quelle est sa dernière mise à jour?

1.1

63
Quentin

CGI est une spécification d'interface entre un serveur Web (serveur HTTP) et un programme exécutable d'un certain type destiné à traiter une requête particulière.

Il décrit comment certaines propriétés de cette requête doivent être communiquées à l'environnement de ce programme et comment le programme doit renvoyer la réponse au serveur et comment le serveur doit "compléter" la réponse pour former une réponse valide à la requête HTTP d'origine.

Pendant un certain temps, CGI était un brouillon Internet de l'IETF et, en tant que tel, avait une date d'expiration. Il a expiré sans mise à jour, il n'y avait donc pas de "norme" CGI. C'est maintenant un RFC informatif, mais en tant que tel, il est une pratique courante et n'est pas une norme en soi. rfc3875.txt , rfc3875.html

Les programmes implémentant une interface CGI peuvent être écrits dans n’importe quel langage exécutable sur la machine cible. Ils doivent pouvoir accéder aux variables d'environnement et généralement à l'entrée standard et ils générer leur sortie sur la sortie standard .

Les langages compilés tels que C étaient couramment utilisés, tout comme les langages de script tels que Perl, utilisant souvent des bibliothèques pour faciliter l'accès à l'environnement CGI.

L'un des gros inconvénients de CGI est qu'un nouveau programme est créé pour chaque demande. Le maintien de l'état entre les demandes peut donc être un problème de performances majeur. L'état peut être géré dans des cookies ou encodé dans une URL, mais s'il devient trop volumineux, il doit être stocké ailleurs et indexé à partir d'informations d'URL encodées ou d'un cookie. Chaque invocation CGI devrait alors recharger l'état stocké à partir d'un magasin quelque part.

Pour cette raison, et pour une interface extrêmement simple pour les requêtes et les sessions, les environnements mieux intégrés entre les serveurs Web et les applications sont beaucoup plus populaires. Des environnements tels qu'une implémentation php moderne avec Apache intègrent beaucoup mieux le langage cible avec le serveur Web et fournissent un accès aux objets de requête et de session nécessaires pour répondre efficacement aux requêtes http. Ils offrent un moyen beaucoup plus facile et plus riche d’écrire des "programmes" pour traiter les requêtes HTTP.

Que vous écriviez un script CGI ou non dépendait de l'interprétation. Cela a certainement fait le travail d'un, mais il est beaucoup plus habituel d'exécuter php en tant que module où l'interface entre le script et le serveur n'est pas strictement une interface CGI.

41
CB Bailey

Le CGI est spécifié dans RFC 3875 , bien qu'il s'agisse d'une codification "officielle" ultérieure de l'original document NCSA . Fondamentalement, CGI définit un protocole pour transmettre des données relatives à une requête HTTP d’un serveur Web à un programme à traiter - n’importe quel programme, dans n’importe quelle langue. Au moment de la rédaction de la spécification (1993), la plupart des serveurs Web ne contenaient que des pages statiques, les "applications Web" étant une chose rare et nouvelle, il semblait donc naturel de les séparer du contenu statique "normal", comme dans un cgi-bin répertoire en dehors du contenu statique et se terminant par .cgi.

À cette époque, il n'existait pas non plus de "langages de programmation Web" comme PHP, et C était le langage de programmation portable dominant - tant de gens écrivaient leurs scripts CGI en C. Mais Perl se révéla rapidement mieux adapté à ce genre de et CGI est devenu presque synonyme de Perl pendant un moment. Puis il y a eu Java Servlets, PHP et bien d'autres, qui ont repris une part importante de la part de marché de Perl.

18
Michael Borgwardt

Regardez CGI sur Wikipedia. CGI est un protocole entre le serveur Web et un programme externe ou un script qui gère l'entrée et génère la sortie qui est envoyée au navigateur.

CGI est simplement un moyen pour un serveur Web et un programme de communiquer, rien de plus, rien de moins. Ici, le serveur gère la connexion réseau et le protocole HTTP, tandis que le programme gère les entrées et génère les sorties envoyées au navigateur. Le script CGI peut être essentiellement tout programme pouvant être exécuté par le serveur Web et respectant le protocole CGI. Ainsi, un programme CGI peut être mis en œuvre, par exemple en C. Cependant, cela est extrêmement rare, car C n'est pas très bien adapté à la tâche.

/cgi-bin/*.cgi est simplement un chemin où les gens mettent leur script CGI. Les serveurs Web sont généralement configurés par défaut pour extraire les scripts CGI de ce chemin.

un script CGI peut également être implémenté en PHP, mais tous les programmes PHP ne sont pas des scripts CGI. Si le serveur Web intègre un interpréteur PHP (par exemple, mod_php dans Apache), la phase CGI est ignorée par un protocole direct plus efficace entre le serveur Web et l'interpréteur.

Que vous ayez ou non implémenté un script CGI dépend de la manière dont votre script est exécuté par le serveur Web.

13
Juha Syrjälä

CGI transmet essentiellement la requête à l’interprète n’importe lequel configuré avec le serveur Web - il s’agit peut-être de Perl, Python, PHP, Ruby, C, etc. Perl était le plus courant à l'époque, c'est pourquoi vous le voyez souvent en référence à CGI.

CGI n'est pas mort. En fait, la plupart des grandes entreprises d’hébergement utilisent PHP en tant que CGI, par opposition à mod_php, car il offre une configuration au niveau utilisateur ainsi que d’autres fonctionnalités, bien qu’il soit plus lent que mod_php. Ruby et Python sont également généralement exécutés en tant que CGI. La principale différence est qu’un module de serveur s’exécute dans le cadre du logiciel de serveur lui-même - comme avec CGI, il est totalement à l’extérieur du serveur. Le serveur utilise simplement le module CGI pour déterminer comment transmettre et recevoir des données à l’interprète externe.

12
prodigitalson

CGI est un mécanisme par lequel un programme externe est appelé par le serveur Web afin de traiter une demande. Des variables d'environnement et une entrée standard sont utilisées pour transmettre les données de la demande au programme. La langue exacte dans laquelle le programme externe est écrit n'a pas d'importance, même s'il est plus facile d'écrire des programmes CGI dans certaines langues que dans d'autres.

Étant donné que les scripts CGI nécessitent des autorisations d'exécution, httpd par défaut n'autorise que les programmes CGI du répertoire cgi-bin soient exécutés à des fins de sécurité (peut-être maintenant erronées).

La plupart des scripts PHP s'exécutent dans le processus du serveur Web via mod_php. Ce n'est pas CGI.

CGI est lent car le programme (et l'interprète associé) doivent être démarrés à la demande. Les alternatives modernes sont l'exécution intégrée, utilisée par mod_php, et les processus de longue durée, utilisés par FastCGI. Une langue donnée peut avoir sa propre manière de mettre en œuvre ces mécanismes, alors assurez-vous de demander autour avant de recourir à CGI.

11

Un exemple concret: une base de données complexe qui doit être affichée sur un site Web. Depuis que la base de données a été conçue vers 1986 (!), De nombreuses données ont été stockées de différentes manières pour économiser de l’espace disque.

Au fur et à mesure du développement, les développeurs ne pouvaient plus résoudre des requêtes de données complexes en SQL uniquement, par exemple parce que les algorithmes de tri étaient inhabituels.

Il existe trois solutions judicieuses:

  1. rapide et sale: envoyez les données non sauvegardées à PHP, triez-les là. De toute évidence, une solution très coûteuse, car cela serait répété chaque fois que la page est appelée
  2. écrire un plugin dans le moteur de base de données - mais l'administrateur n'était pas prêt à autoriser l'exécution de code étranger sur son serveur, ou
  3. vous pouvez traiter les données dans un programme (C, Perl, etc.) et générer du code HTML. Le programme lui-même va dans/cgi-bin et est appelé directement par le serveur Web (Apache, par exemple) et non par PHP.

CGI exécute votre script dans la solution n ° 3 et envoie l'effet au navigateur. Vous avez la rapidité du programme compilé, la flexibilité d'un langage mieux que SQL et vous n'avez pas besoin d'écrire des plugins sur le serveur SQL. (Encore une fois, ceci est un exemple spécifique à SQL et C)

7
Michał Leon

Un script CGI est un programme console/shell. Sous Windows, lorsque vous utilisez une fenêtre "Invite de commandes", vous exécutez des programmes de console. Lorsqu'un serveur Web exécute un script CGI, il entre dans le programme console/shell à l'aide de variables d'environnement ou "entrée standard". L'entrée standard revient à taper des données dans un programme console/shell. dans le cas d'un script CGI, le serveur Web effectue la saisie. Le script CGI écrit les données sur la "sortie standard" et cette sortie est envoyée au client (le navigateur Web) sous forme de page HTML. La sortie standard ressemble à la sortie que vous voyez dans un programme console/Shell, excepté que le serveur Web la lit et l'envoie.

Un script CGI peut être exécuté à partir d'un navigateur. L'URI comprend généralement une chaîne de requête fournie au script CGI. Si la méthode est "get", la chaîne de requête est fournie au script CGI dans une variable d'environnement appelée QUERY_STRING. Si la méthode est "post", la chaîne de requête est fournie au script CGI à l'aide de l'entrée standard (le script CGI lit la chaîne de requête à partir de l'entrée standard).

Une des premières utilisations des scripts CGI était de traiter les formulaires. Au début de HTML, les formulaires HTML avaient généralement un attribut "action" et un bouton désigné par le bouton "soumettre". Lorsque le bouton d'envoi est enfoncé, l'URI spécifié dans l'attribut "action" est envoyé au serveur avec les données du formulaire envoyées sous forme de chaîne de requête. Si "l'action" spécifie un script CGI, celui-ci sera exécuté et produira une page HTML.

La RFC 3875 "La Common Gateway Interface (CGI)" définit partiellement CGI en utilisant C, comme en disant que les variables d'environnement "sont accessibles par la routine de bibliothèque C getenv () ou la variable environ".

Si vous développez un script CGI en utilisant C/C++ et utilisez Microsoft Visual Studio pour le faire, vous développerez un programme de console.

7
user34660

Vous voulez peut-être savoir ce qui n’est pas CGI, et la réponse est un MODULE pour votre serveur Web (si je suppose que vous utilisez Apache). ET C’EST LA GRANDE DIFERENCE, parce que CGI a besoin d’un programme externe, d’un thread, quel qu’il soit, pour instancier un serveur d’applications Perl, PHP, C où, lorsque vous exécutez en tant que MODULE, ce programme est le serveur Web proprement dit (Apache).

À cause de tout cela, de nombreux problèmes de performances, de sécurité et de portabilité entrent en jeu. Mais il est bon de savoir d'abord ce que CGI n'est pas, de comprendre ce que c'est.

7
denica

Un CGI est un programme (ou une API Web) que vous écrivez et sauvegardez sur le site Web Server. CGI est un fichier.

Ce fichier siège et attend sur le serveur Web. Lorsque le navigateur client envoie une demande au serveur Web pour exécuter votre fichier CGI, celui-ci exécute votre fichier CGI sur le site du serveur. Les entrées pour ce programme CGI, le cas échéant, proviennent du navigateur client. Les sorties de ce programme CGI sont envoyées au navigateur.

Quelle langue utilisez-vous pour écrire un programme CGI? D'autres articles mentionnent déjà c, Java, php, Perl, etc.

6
Loc Pham

L'idée sous-jacente à CGI est qu'un programme/script (que ce soit Perl ou même C) reçoive une entrée via STDIN (les données de la demande) et génère des données via STDOUT (instructions echo, printf). La plupart des scripts php ne sont pas éligibles, car ils sont exécutés sous le module Apache PHP.

4
Nathan Osman