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.
1 | $ cd /path/to/your/docroot |
2 | $ 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.
1 | $ cd /path/to/your/docroot |
2 | $ 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.
1 | $ cd /path/to/your/docroot |
2 | $ 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.
1 | $ cd /path/to/your/docroot |
2 | $ 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.
1 | $ cd /path/to/your/docroot |
2 | $ 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 de Mattias Geniar, publicado originalmente no iMasters.