Normalmente, você não executa os scripts php-cgi pela linha de comando. Afinal, eles são uma Common Gateway Interface utilizada por servidores web (como o Apache) para executar scripts PHP. No entanto, para fins de depuração, pode ser útil ser capaz de executar esses scripts php-cgi por meio da sua linha de comando em vez de chamá-los diretamente pelo seu navegador.
A maneira como o Apache (ou qualquer outro servidor web) passa uma solicitação para um CGI é criando variáveis de ambiente que depois descrevem o pedido. Nelas você vai encontrar comumente a URL que está sendo solicitada, o caminho para o script etc.
Se você está acostumado à execução de scripts via CLI, você normalmente usa o comando ‘php’ e dá o nome do script como um argumento (tipo ‘php mydir/script.php’). Isso funciona bem para php-cgi, mas o problema começa quando você está executando aplicativos via Zend Framework e confia na engine de rotas para mapear as URLs certas para o código PHP. Se você acabou de executar php-cgi, seria algo mais ou menos assim:
$ php-cgi htdocs/index.php X-Powered-By: PHP/5.3.13 Content-type: text/html <HTML>...
Então, fica complicado quando você realmente quer fazer um pedido para ‘http://site.tld/nl/page’, uma vez que você não pode simplesmente chamar o script PHP, já que a URL é um fator importante. Mas é aí que entram as variáveis de ambiente.
Para traduzir o seu pedido para um pedido válido CGI, chame-o desta forma:
$ REDIRECT_STATUS=200 REQUEST_METHOD=GET SCRIPT_FILENAME=htdocs/index.php SCRIPT_NAME=/index.php PATH_INFO=/ SERVER_NAME=site.tld SERVER_PROTOCOL=HTTP/1.1 REQUEST_URI=/nl/page HTTP_HOST=site.tld /usr/bin/php-cgi X-Powered-By: PHP/5.3.13 Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-type: text/html <HTML>...
No exemplo acima, algumas variáveis de ambiente importantes entram em cena, e são separadas por espaços. Após as variáveis de ambiente, o caminho completo para o binário php-cgi é incluído (você pode descobrir isso com o comando ‘which php-cgi’ no CLI).
- REDIRECT_STATUS=200: é importante porque a maioria do php-cgi é compilada com proteção extra que não vai funcionar sem essa variável.
- REQUEST_METHOD=GET: o método HTTP que você está usando, para simulação de solicitações POST, você pode, claro, mudar.
- SCRIPT_FILENAME=htdocs/index.php: precisa do caminho para o script que irá processar o seu pedido. Para aplicativos Zend Framework, ele será provavelmente public/index.php.
- SCRIPT_NAME=/index.php: o caminho relativo completo para o script de acordo com o “document root”.
- PATH_INFO=/
- SERVER_NAME=site.tld: não é realmente relevante neste exemplo.
- SERVER_PROTOCOL=HTTP/1.1: qual protocolo HTTP você quer suportar, pode ser ou HTTP/1.0 ou HTTP/1.1.
- REQUEST_URI=/nl/page: a URL que um navegador que normalmente chama aciona o roteamento de projetos no Zend Framework.
- HTTP_HOST=site.tld: o nome de domínio da URL que você deseja; no exemplo ‘http://site.tld/nl/page’, isso seria site.tld, o FQDN.
Ao chamar o script como descrito, você pode desencadear “solicitações HTTP” através da CLI por pré-preenchimento das variáveis de ambiente. O exemplo listado alguns parágrafos acima é o equivalente CLI de navegação para ‘http://site.tld/nl/page’ através de um servidor web que passa ao longo da solicitação para php-cgi.
***
Texto original disponível em http://mattiasgeniar.be/2012/06/29/running-php-cgi-scripts-via-the-cli-as-a-webserver-would-by-faking-them/