Back-End

23 jun, 2014

Depurando requisições HTTP via CLI

Publicidade

Você é administrador de sistema. Você ama CLI. Você usa PHP. É claro que você consegue solucionar problemas de aplicativos PHP que normalmente são executados por meio de um servidor HTTP via CLI, certo? Bem, tenho boas notícias: você consegue – com algumas ressalvas. Este artigo é a continuação de outro que escrevi para um blog em 2012 intitulado “Executando scripts php-cgi via CLI como um servidor web faria (falsificando-os)”. Se você consegue executar seus aplicativos PHP via CLI, pode usar ferramentas como strace para depurar comportamento do aplicativo PHP.

TL;DR: pode-se falsificar praticamente qualquer solicitação HTTP, definindo as variáveis de ambiente corretas antes de chamar o binário PHP.

Primeiro, as ressalvas.

  • Suas configurações de PHP podem ser alteradas de sobrescritos no servidor web (Apache/PHP-FPM daemon) e o binário PHP que você executar via CLI pode não tem uma representação correta como binário PHP(-FPM) usado através desse servidor HTTP – então verifique suas configurações de PHP;
  • Você não usará o cache APC enquanto estiver executando o PHP através de CLI, nem o opcode, nem o cache de chave/valor de APC;
  • Suas variáveis de ambiente $_SERVER serão diferentes do que via um servidor web HTTP. Lembre-se disso se seu aplicativo depende dele.

Agora, mãos à obra.

Aplicativo da web básico

Se você tiver um aplicativo PHP simples, provavelmente conseguirá executá-lo simplesmente via CLI.

$ cd /path/to/your/docroot
$ php index.php

A saída pode ser (mas não necessariamente) a mesma que seria se ele fosse chamado via web.

Usando variáveis de ambiente para determinar dev/staging/prod

Assim como você pode especificar variáveis de ambiente no Nginx ou no Apache para permitir que seu código use configurações/usuários/senhas diferentes, elas também podem ser utilizadas via CLI. Se seu aplicativo depende de uma variável de ambiente chamada “APPLICATION_ENV” para distinguir os ambientes, você pode adicioná-la à sua requisição.

$ cd /path/to/your/docroot
$ APPLICATION_ENV=development php index.php

Framework que usa rotas

Se estiver usando um framework com controlador de roteamento para mapear o URI diretamente para o arquivo index.php, você pode adicionar variáveis de ambiente para fazer o aplicativo PHP pensar que você está solicitando um URI específico.

$ cd /path/to/your/docroot
$ REQUEST_URI=/your-test-page php index.php

Aplicativo PHP multidomínio

Se estiver executando seu aplicativo de PHP como aplicativo multisite, ou seja, se seu conteúdo e comportamento de código variam de acordo o hostname utilizado na solicitação, você também pode passá-los para frente como variáveis de ambiente.

$ cd /path/to/your/docroot
$ SERVER_NAME=www.yoursite.tld HTTP_HOST=www.yoursite.tld REQUEST_URI=/your-test-page php index.php

Enviando solicitações POST em CLI

O método HTTP é apenas uma variável de ambiente – por isso é mutável.

$ cd /path/to/your/docroot
$ REQUEST_METHOD=POST CONTENT_TYPE=application/www-form-urlencoded REQUEST_URI=/your-test-page php index.php

Conclusão

A execução desses comandos PHP via CLI lhe permite solucionar problemas de aplicativos mais facilmente, já que agora você consegue reproduzir solicitações HTTP específicas sob demanda. O principal benefício é a capacidade de anexar um depurador (como gdb ou strace) para esse processo. Você pode ver todas as chamadas de sistema de nível inferior, bem como todo o tráfego de rede (como consultas ao MySQL, solicitações de memcached, tráfego MongoDB, …) à medida que seu aplicativo as envia e recebe.

***

Artigo traduzido com autorização do autor. Publicado originalmente em http://mattiasgeniar.be/2014/04/22/debugging-http-requests-to-php-via-the-cli/