signification - script cgi exemple




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

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

Je suis un programmeur PHP avec une expérience de développement web.

utilisateur (client) demande de page ---> serveur web (-> interpréteur PHP embarqué) ----> côté serveur (PHP) Script ---> serveur MySQL.

Maintenant, dis que mon script PHP peut récupérer les résultats du serveur MySQL et du serveur MATLAB et d'autres serveurs.

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

  • Qu'est-ce que CGI exactement?

  • Quel est le gros problème avec /cgi-bin/*.cgi ? Qu'est-ce qui se passe 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 vient toujours dans le chemin. CGI & Perl (langage). Je ne sais pas non plus ce qui se passe avec ces deux-là. Presque tout le temps je continue d'entendre ces deux en combinaison "CGI & Perl". Ce livre est un autre excellent exemple de programmation CGI avec Perl . Pourquoi pas "Programmation CGI avec PHP / JSP / ASP"? Je n'ai jamais vu de telles choses.

  • Programmation CGI en C , me confond beaucoup. " en C " ?? Sérieusement?? Je ne sais pas quoi dire. Je suis juste 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 est-ce que je compile? Comment le programme est exécuté (parce que ce sera un code machine, il doit donc s'exécuter comme un processus indépendant). Comment communique-t-il avec le serveur Web? IPC? et l'interfaçage avec tous les serveurs (dans mon exemple MATLAB & MySQL) en utilisant la programmation 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 l'accès à la requête HTTP PUT au serveur web (HTTPD Apache). C'est un long dos. Donc, autant que je m'en souvienne, c'est ce que j'ai fait:

  1. Editer le fichier de configuration d'Apache HTTPD pour dire au serveur web de passer toutes les requêtes HTTP PUT à put.php (j'ai dû écrire ce script PHP)

  2. Implémenter put.php pour gérer la requête (sauvegarder le fichier à l'endroit mentionné)

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

  • Ai-je vraiment écrit CGI Script?

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

MODIFIER:

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


Qu'est-ce que CGI exactement?

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

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

Pas de gros problème. 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 quelque chose à servir simplement). 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 le traitement de programmes CGI en tant que données brutes au cas où le serveur serait mal configuré.

Pourquoi Perl vient toujours dans le chemin.

Ce n'est pas le cas. 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 tend vers PSGI / Plack avec FastCGI ces jours-ci.

Ce livre est un autre excellent 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.

Programmation CGI en C cela me rend très confus. en C ?? Sérieusement??

C'est un langage de programmation, pourquoi pas?

Quand est-ce que je compile?

  1. Ecrire le code
  2. Compiler
  3. URL d'accès
  4. Webserver exécute le programme

Comment le programme est exécuté (parce que ce sera un code machine, il doit donc s'exécuter comme un processus indépendant).

Il ne doit pas s'exécuter en tant que processus indépendant (vous pouvez écrire des modules Apache en C), mais tout le concept de CGI est qu'il lance 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 l'interfaçage 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 dépréciée. 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 la performance n'est pas un gros problème, alors la simplicité vaut beaucoup.

Quelle est sa dernière mise à jour?

1.1


CGI est une interface qui indique au serveur Web comment transmettre des données depuis et vers une application. Plus précisément, il décrit comment les informations de requête sont passées dans les variables d'environnement (type de requête, adresse IP distante), comment le corps de la requête est transmis via l'entrée standard et comment la réponse est transmise via la sortie standard. Vous pouvez vous référer à la 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 sinon tous les serveurs web peuvent être configurés pour exécuter un programme en tant que 'CGI'. Cela signifie que le serveur web, à la réception d'une requête, transmettra les données à un programme spécifique, définissant certaines variables d'environnement et rassemblant les paramètres via une entrée standard et une sortie standard afin que le programme puisse savoir où et quoi rechercher.

Le principal avantage est que vous pouvez exécuter n'importe quel code exécutable sur le Web, étant donné que le serveur Web et le programme savent comment fonctionne CGI. C'est pourquoi vous pouvez écrire des programmes web en C ou Bash avec un serveur web compatible CGI. Cela, et que la plupart des environnements de programmation peuvent facilement utiliser l'entrée standard, la sortie standard et les variables d'environnement.

Dans votre cas vous en avez probablement utilisé un autre, spécifique à PHP, moyen de communication entre vos scripts et le serveur web, ceci, comme vous le dites bien dans votre question, est un interpréteur embarqué appelé mod_php.

Donc, répondant à vos questions:

Qu'est-ce que CGI exactement?

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 viennent avec ce répertoire pré configuré pour y exécuter tous les binaires en tant que programmes CGI. L'extension .cgi indique un exécutable qui devrait fonctionner via le CGI.

Pourquoi Perl vient toujours dans le chemin. CGI & Perl (langage). Je ne sais pas non plus quoi de ces deux. Presque tout le temps je continue d'entendre ces deux en combinaison "CGI & Perl". Ce livre est un autre excellent 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 qui étaient tous là quand 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 dynamiques via le CGI. De nos jours, il existe d'autres alternatives pour exécuter Perl dans un serveur web, principalement mod_perl .

Programmation CGI en C cela me rend très confus. en C ?? Sérieusement?? Je ne sais pas quoi dire. Je suis juste confus. "En C" ?? Cela change tout: le programme doit être compilé et exécuté Cela change complètement mon point de vue de la programmation web Quand dois-je compiler Comment le programme est-il exécuté? code machine, il doit donc s'exécuter comme un processus indépendant.) Comment communique-t-il avec le serveur web? IPC? et s'interface avec tous les serveurs (dans mon exemple MATLAB & MySQL) en utilisant la programmation socket?

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

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 un simple moyen d'exécution du code est requis. Il est inefficace pour les raisons énoncé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 .


CGI passe essentiellement la requête à n'importe quel interpréteur configuré avec le serveur web - Cela peut être n'importe quel type de Perl, Python, PHP, Ruby, C. Perl était le retour le plus commun dans la journée, c'est pourquoi vous le voyez souvent en référence à CGI.

CGI n'est pas mort. En fait, la plupart des grandes sociétés d'hébergement exécutent PHP en tant que CGI par opposition à mod_php car il offre une configuration au niveau de l'utilisateur et d'autres choses alors qu'il est plus lent que mod_php. Ruby et Python sont généralement exécutés en tant que CGI. La principale différence réside dans le fait qu'un module serveur fait partie du logiciel serveur réel - où, comme avec CGI, il est totalement en dehors du serveur. Le serveur utilise simplement le module CGI pour déterminer comment transmettre et recevoir des données à l'interpréteur externe.


Jetez un oeil à http://en.wikipedia.org/wiki/Common_Gateway_Interface dans 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 une sortie qui est envoyée au navigateur.

CGI est simplement un moyen pour un serveur web et un programme de communication, rien de plus, rien de moins. Ici, le serveur gère la connexion réseau et le protocole HTTP et le programme gère l'entrée et génère la sortie qui est envoyée au navigateur. Le script CGI peut être essentiellement n'importe quel programme qui peut être exécuté par le serveur Web et suit le protocole CGI. Ainsi, un programme CGI peut être implémenté, 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 généralement leur script CGI. Les serveurs Web sont généralement configurés par défaut pour récupérer les scripts CGI à partir de ce chemin.

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

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


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

À cette époque, il n'y avait 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 s'est rapidement avéré être un meilleur choix pour ce genre de chose, et CGI est devenu presque synonyme de Perl pendant un certain temps. Ensuite, il y a eu Java Servlets, PHP et beaucoup d'autres et a pris une grande part de la part de marché de Perl.


Le CGI est un mécanisme par lequel un serveur externe appelle un programme externe pour traiter une demande, avec des variables d'environnement et une entrée standard utilisées pour envoyer les données de demande au programme. La langue exacte dans laquelle le programme externe est écrit n'a pas d'importance, bien qu'il soit plus facile d'écrire des programmes CGI dans certaines langues que dans d'autres.

Étant donné que les scripts CGI ont besoin d'autorisations d'exécution, httpd par défaut permet uniquement aux programmes CGI du répertoire cgi-bin d'être exécutés à des fins de sécurité (probablement erronées).

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

Le CGI est lent car le programme (et l'interprète associé) doit être démarré par requête. 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 façon de mettre en œuvre ces mécanismes, alors assurez-vous de demander autour avant de recourir à CGI.


Un exemple concret: une base de données compliquée qui doit être affichée sur un site web. Depuis que la base de données a été conçue quelque part autour de 1986 (!), Beaucoup de données ont été empaquetées de différentes manières d'économiser sur l'espace disque.

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

Il y a trois solutions raisonnables:

  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 au moteur de base de données - mais l'administrateur n'était pas prêt à autoriser le code étranger à fonctionner sur son serveur, ou
  3. vous pouvez traiter les données dans un programme (C, Perl, etc.) et sortir le code HTML. Le programme lui-même va dans / cgi-bin, et est appelé par le serveur web (par exemple Apache) directement, pas via PHP.

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


Un script CGI est un programme console / shell. Dans 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 fournit une entrée au programme console / shell en utilisant des variables d'environnement ou une "entrée standard". L'entrée standard est comme saisir 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 "sortie standard" et cette sortie est envoyée au client (le navigateur Web) sous la forme d'une page HTML. La sortie standard est semblable à la sortie que vous voyez dans un programme console / shell, sauf que le serveur Web la lit et l'envoie.

Un script CGI peut être exécuté à partir d'un navigateur. L'URI inclut 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 en utilisant l'entrée standard (le script CGI lit la chaîne de requête à partir de l'entrée standard).

Une utilisation précoce des scripts CGI consistait à traiter les formulaires. Au début du HTML, les formulaires HTML avaient généralement un attribut "action" et un bouton désigné comme le bouton "submit". Lorsque le bouton de soumission est enfoncé, l'URI spécifié dans l'attribut "action" est envoyé au serveur avec les données du formulaire envoyées en tant que chaîne de requête. Si l '"action" spécifie un script CGI, alors le script CGI sera exécuté et produira une page HTML.

RFC 3875 "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 la bibliothèque C getenv () ou variable environ".

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