CGI é uma interface de gateway comum. Como o nome diz, é uma interface de gateway "comum" para tudo. É tão trivial e ingênuo do nome. Sinto que entendi isso e senti isso toda vez que encontrei essa palavra. Mas, francamente, eu não fiz. Ainda estou confuso.
Sou programador PHP com experiência em desenvolvimento web.
solicitação do usuário (cliente) para a página ---> servidor da web (-> interpretador PHP incorporado) ----> Script do lado do servidor (PHP) ---> MySQL Server.
Agora diga que meu script PHP pode obter resultados do servidor MySQL e do servidor MATLAB e de algum outro servidor.
Então, agora o PHP Script é o CGI? Porque a sua interface para o servidor web e todos os outros servidores? Eu não sei. Às vezes eles chamam CGI, uma tecnologia e outras vezes chamam CGI de um programa ou outro servidor.
O que exatamente é CGI?
Qual é o problema
/cgi-bin/*.cgi
? O que há com isso? Não sei para que serve essecgi-bin
diretório no servidor. Não sei por que eles têm extensões * .cgi.Por que Perl sempre atrapalha? CGI e Perl (idioma). Eu também não sei o que há com esses dois. Quase o tempo todo eu continuo ouvindo esses dois em combinação "CGI & Perl". Este livro é outro ótimo exemplo de programação CGI com Perl . Por que não "Programação CGI com PHP / JSP / ASP"? Eu nunca vi essas coisas.
A programação CGI em C me confunde bastante. " em c " ?? A sério?? Eu não sei o que dizer. Estou apenas confuso. " em c " ?? Isso muda tudo. O programa precisa ser compilado e executado. Isso muda completamente minha visão da programação na web. Quando eu compilar? Como o programa é executado (porque será um código de máquina, portanto, ele deve ser executado como um processo independente). Como ele se comunica com o servidor web? IPC? e interface com todos os servidores (no meu exemplo MATLAB e MySQL) usando programação de soquete? Estou perdido!!
As pessoas dizem que o CGI está obsoleto e não está mais em uso. É assim mesmo? Qual é a atualização mais recente?
Uma vez, encontrei uma situação em que tinha que dar acesso à solicitação HTTP PUT ao servidor da web (Apache HTTPD). É uma longa volta. Então, tanto quanto me lembro, foi o que fiz:
Editei o arquivo de configuração do Apache HTTPD para dizer ao servidor da web para passar todas as solicitações HTTP PUT para alguns
put.php
(eu tive que escrever esse script PHP)Implemente o put.php para lidar com a solicitação (salve o arquivo no local mencionado)
As pessoas disseram que eu escrevi um script CGI. Sério, eu não tinha ideia do que eles estavam falando.
- Eu realmente escrevi um script CGI?
Espero que você entenda qual é a minha confusão. (Porque eu mesmo não sei onde estou confuso). Peço a vocês que mantenham sua resposta o mais simples possível. Realmente não consigo entender nenhuma terminologia técnica sofisticada. Pelo menos não neste caso.
EDITAR:
Encontrei este incrível tutorial "A programação CGI é simples!" - Tutorial CGI , que explica os conceitos da maneira mais simples possível. Depois de ler este artigo, convém ler Introdução à programação CGI em C para complementar seu entendimento com exemplos de código reais. Também adicionei esses links a este tutorial no artigo da Wikipedia: http://en.wikipedia.org/wiki/Common_Gateway_Interface
Respostas:
CGI é uma interface que informa ao servidor da web como passar dados para e de um aplicativo. Mais especificamente, descreve como as informações da solicitação são transmitidas em variáveis de ambiente (como tipo de solicitação, endereço IP remoto), como o corpo da solicitação é transmitido por entrada padrão e como a resposta é transmitida por saída padrão. Você pode consultar a especificação CGI para obter detalhes.
Para usar sua imagem:
user (client) request for page ---> webserver ---[CGI]----> Server side Program ---> MySQL Server.
A maioria, se não todos, os servidores da Web podem ser configurados para executar um programa como um 'CGI'. Isso significa que o servidor da web, ao receber uma solicitação, encaminhará os dados para um programa específico, configurando algumas variáveis de ambiente e organizando os parâmetros por meio de entrada e saída padrão, para que o programa possa saber onde e o que procurar.
O principal benefício é que você pode executar QUALQUER código executável da Web, já que o servidor da Web e o programa sabem como o CGI funciona. É por isso que você pode escrever programas da Web em C ou Bash com um servidor da Web ativado por CGI comum. Isso e a maioria dos ambientes de programação podem facilmente usar entrada padrão, saída padrão e variáveis de ambiente.
No seu caso, você provavelmente usou outro meio de comunicação específico para PHP entre seus scripts e o servidor da Web, como você mencionou na sua pergunta, é um intérprete incorporado chamado mod_php.
Então, respondendo suas perguntas:
Veja acima.
Esse é o local tradicional dos programas cgi, muitos servidores da web vêm com esse diretório pré-configurado para executar todos os binários existentes como programas CGI. A extensão .cgi indica um executável que deve funcionar através do CGI.
Como o Perl é antigo (mais antigo que PHP, JSP e ASP, que já existia quando o CGI já era antigo, o Perl existia quando o CGI era novo) e se tornou famoso por ser uma linguagem muito boa para servir páginas dinâmicas via CGI. Atualmente existem outras alternativas para rodar o Perl em um servidor web, principalmente o mod_perl .
Você compila o executável uma vez, o servidor da web executa o programa e passa os dados na solicitação para o programa e gera a resposta recebida. O CGI especifica que uma instância do programa será iniciada por cada solicitação. É por isso que o CGI é ineficiente e meio obsoleto hoje em dia.
O CGI ainda é usado quando o desempenho não é primordial e é necessário um meio simples de executar o código. É ineficiente pelas razões declaradas anteriormente e existem meios mais modernos de executar qualquer programa em um ambiente da Web. Atualmente, o mais famoso é o FastCGI .
fonte
Server side Program
na sua figura está o meu script PHP. Então, eu nunca fiz nenhuma programação CGI? Porque nunca escrevi nada entre o servidor da web e meu script PHP. Droga!! isso me mata.Um meio para um servidor Web obter seus dados de um programa (em vez de, por exemplo, um arquivo).
Nada demais. É apenas uma convenção.
O servidor precisa saber o que fazer com o arquivo (por exemplo, trate-o como um programa para executar, em vez de algo para simplesmente servir). Ter uma extensão .html indica para usar um tipo de conteúdo de texto / html. Ter uma extensão .cgi diz para executá-lo como um programa.
Manter os executáveis em um diretório separado oferece proteção adicional contra a execução de arquivos incorretos e / ou a exibição de programas CGI como dados brutos, caso o servidor seja configurado incorretamente.
Não faz. Perl era grande e popular ao mesmo tempo que o CGI.
Não uso Perl CGI há anos. Eu estava usando o mod_perl por um longo tempo, e tendem a PSGI / Plack com FastCGI atualmente.
O CGI não é muito eficiente. Melhores métodos para conversar com programas de servidores da web surgiram na mesma época do PHP. JSP e ASP são métodos diferentes para conversar com programas.
É uma linguagem de programação, por que não?
Ele não precisa ser executado como um processo independente (você pode escrever os módulos do Apache em C), mas todo o conceito de CGI é que ele lança um processo externo.
STDIN / STDOUT e variáveis de ambiente - conforme definido na especificação CGI.
Usando os métodos que você gosta e é suportado.
O CGI é ineficiente, lento e simples. Raramente é usado, quando usado, é porque é simples. Se o desempenho não é grande coisa, a simplicidade vale muito.
1.1
fonte
CGI é uma especificação de interface entre um servidor web (servidor HTTP) e um programa executável de algum tipo que deve lidar com uma solicitação específica.
Ele descreve como determinadas propriedades dessa solicitação devem ser comunicadas ao ambiente desse programa e como o programa deve comunicar a resposta ao servidor e como o servidor deve "concluir" a resposta para formar uma resposta válida à solicitação HTTP original.
Durante algum tempo, o CGI foi um rascunho da IETF na Internet e, como tal, teve um prazo de validade. Ele expirou sem atualização, portanto não havia CGI 'padrão'. Agora é uma RFC informativa, mas, como tal, documenta a prática comum e não é um padrão em si. rfc3875.txt , rfc3875.html
Os programas que implementam uma interface CGI podem ser gravados em qualquer idioma executável na máquina de destino. Eles devem ser capazes de acessar variáveis de ambiente e, geralmente , entrada padrão e geram sua saída na saída padrão .
Linguagens compiladas como C eram comumente usadas, assim como linguagens de script como perl, geralmente usando bibliotecas para facilitar o acesso ao ambiente CGI.
Uma das grandes desvantagens do CGI é que um novo programa é gerado para cada solicitação, portanto, manter o estado entre as solicitações pode ser um grande problema de desempenho. O estado pode ser manipulado em cookies ou codificado em um URL, mas, se for grande demais, deverá ser armazenado em outro local e codificado a partir de informações de URL codificadas ou de um cookie. Cada chamada CGI precisaria recarregar o estado armazenado de uma loja em algum lugar.
Por esse motivo, e por uma interface bastante simples para solicitações e sessões, os ambientes melhor integrados entre servidores e aplicativos da Web são muito mais populares. Ambientes como uma implementação moderna de php com apache integram muito melhor o idioma de destino com o servidor web e fornecem acesso a objetos de solicitação e sessão que são necessários para atender com eficiência solicitações HTTP. Eles oferecem uma maneira muito mais fácil e rica de escrever 'programas' para lidar com solicitações HTTP.
Se você escreveu um script CGI depende da interpretação. Certamente fez o trabalho de um, mas é muito mais comum rodar o php como um módulo em que a interface entre o script e o servidor não é estritamente uma interface CGI.
fonte
O CGI é especificado na RFC 3875 , embora essa seja uma codificação "oficial" posterior do documento original da NCSA . Basicamente, o CGI define um protocolo para passar dados sobre uma solicitação HTTP de um servidor da web para um programa para processar - qualquer programa, em qualquer idioma. No momento em que a especificação foi escrita (1993), a maioria dos servidores da Web continha apenas páginas estáticas; os "aplicativos da Web" eram algo raro e novo; portanto, parecia natural mantê-los separados do conteúdo estático "normal", como em um
cgi-bin
diretório além do conteúdo estático e terminá-lo.cgi
.No momento, também não havia "linguagens de programação da web" dedicadas, como PHP, e C era a linguagem de programação portátil dominante - muitas pessoas escreviam seus scripts CGI em C. Mas Perl rapidamente se mostrou melhor para esse tipo de e CGI se tornou quase sinônimo de Perl por um tempo. Depois vieram os Java Servlets, PHP e muitos outros, que assumiram grande parte da participação de mercado da Perl.
fonte
Dê uma olhada no CGI na Wikipedia. CGI é um protocolo entre o servidor da web e um programa externo ou um script que manipula a entrada e gera a saída que é enviada ao navegador.
O CGI é simplesmente uma maneira de o servidor web e um programa se comunicar, nada mais, nada menos. Aqui, o servidor gerencia a conexão de rede e o protocolo HTTP e o programa manipula a entrada e gera a saída que é enviada ao navegador. O script CGI pode ser basicamente qualquer programa que possa ser executado pelo servidor da web e siga o protocolo CGI. Assim, um programa CGI pode ser implementado, por exemplo, em C. No entanto, isso é extremamente raro, pois C não é muito adequado para a tarefa.
/cgi-bin/*.cgi
é simplesmente um caminho em que as pessoas geralmente colocam seu script CGI. Normalmente, o servidor da Web é configurado por padrão para buscar scripts CGI desse caminho.um script CGI também pode ser implementado em PHP, mas nem todos os programas PHP são scripts CGI. Se o servidor da Web tiver incorporado o interpretador PHP (por exemplo, mod_php no Apache), a fase CGI será ignorada por um protocolo direto mais eficiente entre o servidor da Web e o intérprete.
A implementação ou não de um script CGI depende de como o script está sendo executado pelo servidor da web.
fonte
O CGI basicamente transmite a solicitação para qualquer intérprete que esteja configurado com o servidor da Web - pode ser Perl, Python, PHP, Ruby, C praticamente qualquer coisa. Perl foi o mais comum nos dias de hoje, é por isso que você costuma vê-lo em referência ao CGI.
O CGI não está morto. De fato, a maioria das grandes empresas de hospedagem executa PHP como CGI, em vez de mod_php, porque oferece configuração no nível do usuário e outras coisas, enquanto é mais lento que o mod_php. Ruby e Python também são normalmente executados como CGI. A principal diferença aqui é que um módulo de servidor é executado como parte do software real do servidor - onde, como no CGI, está totalmente fora do servidor O servidor apenas usa o módulo CGI para determinar como passar e receber dados para o intérprete externo.
fonte
O CGI é um mecanismo pelo qual um programa externo é chamado pelo servidor da web para manipular uma solicitação, com variáveis de ambiente e entrada padrão sendo usadas para alimentar os dados da solicitação ao programa. O idioma exato em que o programa externo está escrito não importa, embora seja mais fácil escrever programas CGI em alguns idiomas do que em outros.
Como os scripts CGI precisam de permissões de execução, o httpd, por padrão, apenas permite que programas CGI no
cgi-bin
diretório sejam executados para fins de segurança (possivelmente agora mal orientados).A maioria dos scripts PHP é executada no processo do servidor web via
mod_php
. Isto não é CGI.O CGI é lento, pois o programa (e o intérprete relacionado) deve ser iniciado por solicitação. Alternativas modernas são execução incorporada, usada pelo mod_php, e processos de execução longa, usados pelo FastCGI. Uma determinada linguagem pode ter sua própria maneira de implementar esses mecanismos, portanto, pergunte antes de recorrer ao CGI.
fonte
interpreter
se estou executando php com php-fpm?Talvez você queira saber o que não é CGI, e a resposta é um MÓDULO para o seu servidor da web (se eu suponho que você esteja executando o Apache). E É A GRANDE DIFERENÇA, porque as necessidades de CGI e um programa externo, thread, qualquer instancia para instanciar um servidor de aplicativos PERL, PHP, C, quando, quando você executa como um MÓDULO, esse programa é o servidor da Web (apache) per se.
Por tudo isso, existem muitos problemas de desempenho, segurança e portabilidade que entram em jogo. Mas é bom saber primeiro o que não é CGI, entender o que é.
fonte
Um exemplo da vida real: um banco de dados complicado que precisa ser exibido em um site. Como o banco de dados foi projetado em algum momento por volta de 1986 (!), Muitos dados foram compactados de maneiras diferentes para economizar espaço em disco.
À medida que o desenvolvimento prosseguia, os desenvolvedores não podiam mais resolver solicitações de dados complicadas apenas no SQL, por exemplo, porque os algoritmos de classificação eram incomuns.
Existem três soluções sensatas:
O CGI executa seu script na Solução # 3 e gera o efeito no navegador. Você tem a velocidade do programa compilado, a flexibilidade de uma linguagem melhor que o SQL e não precisa gravar plug-ins no servidor SQL. (Novamente, este é um exemplo específico para SQL e C)
fonte
Um script CGI é um programa de console / shell. No Windows, quando você usa uma janela "Prompt de Comando", executa programas de console. Quando um servidor da web executa um script CGI, ele fornece entrada para o programa console / shell usando variáveis de ambiente ou "entrada padrão". A entrada padrão é como digitar dados em um programa console / shell; no caso de um script CGI, o servidor da web digita. O script CGI grava os dados na "saída padrão" e essa saída é enviada ao cliente (o navegador da web) como uma página HTML. A saída padrão é como a saída que você vê em um programa console / shell, exceto pelo servidor da web que a lê e a envia.
Um script CGI pode ser executado a partir de um navegador. O URI normalmente inclui uma sequência de consultas que é fornecida ao script CGI. Se o método for "get", a sequência de consultas será fornecida ao script CGI em uma variável de ambiente chamada QUERY_STRING. Se o método for "post", a string de consulta será fornecida ao script CGI usando a entrada padrão (o script CGI lê a string de consulta da entrada padrão).
Um uso precoce de scripts CGI era processar formulários. No início do HTML, os formulários HTML geralmente tinham um atributo "action" e um botão designado como o botão "submit". Quando o botão enviar é pressionado, o URI especificado no atributo "ação" será enviado ao servidor com os dados do formulário enviados como uma sequência de consultas. Se a "ação" especificar um script CGI, o script CGI será executado e, em seguida, produzirá uma página HTML.
RFC 3875 "A interface comum de gateway (CGI)" define parcialmente o CGI usando C, como dizendo que as variáveis de ambiente "são acessadas pela rotina da biblioteca C, getenv () ou pela variável environment".
Se você estiver desenvolvendo um script CGI usando C / C ++ e usar o Microsoft Visual Studio para fazer isso, desenvolverá um programa de console.
fonte
Um CGI é um programa (ou uma API da Web) que você escreve e salva no site do servidor. CGI é um arquivo.
Este arquivo fica e aguarda no servidor Web. Quando o navegador do cliente envia uma solicitação ao servidor Web para executar seu arquivo CGI, o servidor Web executa seu arquivo CGI no site do servidor. As entradas para este programa CGI, se houver, são do navegador do cliente. As saídas deste programa CGI são enviadas para o navegador.
Qual idioma você usa para escrever um programa CGI? Outras postagens já mencionam c, java, php, perl, etc.
fonte
A idéia por trás do CGI é que um programa / script (seja Perl ou mesmo C) receba entrada via
STDIN
(os dados da solicitação) e emita dados viaSTDOUT
(eco,printf
instruções).A razão pela qual a maioria dos scripts PHP não se qualifica é que eles são executados no módulo PHP Apache.
fonte