Back-End

23 jan, 2013

Executando os scripts php-cgi por meio do CLI como um servidor web faria (falsificando-os)

Publicidade

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/