Em resumo: A PHP CLI (Command Line Interface) é a variante do PHP para a linha de comandos. Executa scripts sem servidor web, por exemplo para tarefas cron, Composer ou tarefas de manutenção. Tem valores por defeito próprios, muitas vezes um php.ini próprio e, por vezes, até uma versão diferente da do site. Por isso, php -v não é uma prova fiável de que o site está corrigido após o PHP2Shell.
O que é a PHP CLI?
O manual do PHP refere duas áreas principais de utilização do PHP: scripts para sites e scripts na linha de comandos. Para estes últimos existe uma SAPI própria com o nome cli. Não precisa de servidor web nem de navegador, apenas do interpretador PHP. Segundo o manual, é particularmente adequada para tarefas que correm regularmente através do cron no Linux ou do agendador de tarefas no Windows.
Exemplos típicos no dia a dia empresarial: importações noturnas na loja, envio de newsletters, limpeza de caches, atualizações via Composer ou as ferramentas de linha de comandos de CMS como o WP-CLI ou a consola do Symfony. No Windows, o ficheiro chama-se php.exe e a variante CGI php-cgi.exe.
Ao contrário do PHP-FPM, a CLI não é um serviço. Cada chamada inicia um processo novo, volta a ler a configuração, segundo o manual, e termina quando o script acaba. Por isso, um reinício após uma atualização não é necessário. Exceções são os processos de longa duração iniciados via CLI, como workers de filas de frameworks ou daemons sob systemd ou Supervisor. Correm durante dias com o interpretador carregado uma só vez e têm de ser reiniciados após uma atualização do PHP tal como os workers web.
Para a gerência e a direção de projeto, isto significa: também as tarefas em segundo plano pertencem ao inventário e a cada plano de atualização.
Como se distingue a CLI da versão web?
Segundo o manual, a CLI sobrescreve algumas definições de forma fixa. Não podem ser alteradas através do php.ini, apenas em tempo de execução com ini_set():
| Diretiva | Valor na CLI | Justificação segundo o manual |
|---|---|---|
html_errors |
desligado | as etiquetas HTML atrapalham no terminal |
implicit_flush |
ligado | as saídas devem aparecer de imediato |
max_execution_time |
0 (ilimitado) | os scripts de linha de comandos correm muitas vezes durante muito tempo |
register_argc_argv |
ligado | os scripts recebem sempre $argc e $argv |
output_buffering |
desligado | fixado, as funções de buffer continuam utilizáveis |
max_input_time |
desligado | a CLI não conhece GET, POST nem uploads |
Outra diferença: a CLI não muda para a pasta do script. Quem chama php -f ordner/skript.php a partir de /tmp continua a trabalhar em /tmp. Os caminhos relativos em tarefas cron são, por isso, uma fonte frequente de erros.
Um pequeno script que só deve correr na linha de comandos:
<?php
if (PHP_SAPI !== 'cli') {
http_response_code(403);
exit('Nur für die Kommandozeile.');
}
$tage = (int) ($argv[1] ?? 30);
$grenze = time() - $tage * 86400;
$alt = 0;
foreach (glob(__DIR__ . '/cache/*.tmp') ?: [] as $datei) {
if (filemtime($datei) < $grenze) { $alt++; }
}
fwrite(STDOUT, "Dateien älter als $tage Tage: $alt\n");
A verificação de PHP_SAPI impede que um script de manutenção seja acionado através do navegador, caso fique por engano na pasta web. O manual aconselha expressamente verificar a SAPI desta forma, em vez de confiar na existência de $argv.
As opções mais importantes da PHP CLI
As opções seguintes provêm do resumo de opções do manual do PHP e são particularmente úteis para administradores:
php -vmostra o número de versão da CLI.php --inimostra que ficheiros de configuração são carregados.php -mlista os módulos compilados e carregados.php -ichamaphpinfo()e emite o resultado como texto.php -l datei.phpverifica apenas a sintaxe (lint). Desde o PHP 8.3 também para vários ficheiros de uma vez.php -r 'code'executa código diretamente, sem<?php.php -d name=wertdefine uma definição INI para esta chamada.php -nignora por completo o php.ini.php --ri namemostra a configuração de uma extensão.
php --ini
php -m | grep -i -E "opcache|sodium|pdo"
php --ri session | grep upload_progress
php -l src/Controller.php src/Model.php
O servidor integrado: apenas para desenvolvimento
Com php -S localhost:8000, a CLI inicia um pequeno servidor web. O exemplo de saída no manual indica o PHP 5.4.0 como ponto de partida. O manual é inequívoco: o servidor serve para o desenvolvimento, não é um servidor web completo e não deve correr em redes públicas nem em produção. Se estiver a correr num servidor de forma permanente e acessível do exterior, é uma constatação que deve eliminar.
CLI, cron e segurança depois do PHP2Shell
Os comunicados conhecidos sobre o PHP2Shell referem PHP-FPM, mod_php, php-cgi, FrankenPHP e LiteSpeed como modos de operação afetados. A CLI não processa pedidos vindos da rede. Para a segurança é, ainda assim, importante em três aspetos:
- Prova errada:
php -vmostra a versão da CLI. O site pode usar outra versão, e os backports das distribuições muitas vezes não alteram o número apresentado. Como comprovar corretamente o estado está em Verificar a versão do PHP e o nível de patches e no artigo Porque é que o php -v mostra o mesmo número. - Persistência através do cron: Depois de uma intrusão, os atacantes gostam de usar tarefas cron que iniciam regularmente um script PHP. Indicações para a pesquisa dá-as Reconhecer tarefas cron ocultas como porta traseira.
- Mesmo pacote: A CLI costuma vir da mesma fonte de pacotes que o PHP-FPM e faz parte da atualização.
Como ajuda concretamente a PHP SOS?
- Comparar versões: Comparamos o estado da CLI e da web e comprovamos que versão o seu site realmente entrega.
- Verificar tarefas cron: Listamos todas as tarefas PHP agendadas de todos os utilizadores e associamo-las às respetivas aplicações.
- Proteger a manutenção: Retiramos os scripts de manutenção da pasta web e definimos verificações de SAPI.
- Acompanhar de forma contínua: No contrato de manutenção de segurança, mantemos a CLI, a SAPI web e as tarefas cron atualizadas em conjunto.
Perguntas frequentes
O php -v mostra a versão do meu site?
Não necessariamente. O php -v mostra a versão da variante de linha de comandos. O site pode correr através de outra versão do PHP-FPM ou de um módulo do Apache. Para o site conta o estado da SAPI web, que apura através do serviço ou de um ficheiro de teste temporário.
Porque é que os scripts CLI correm sem limite de tempo?
Segundo o manual do PHP, a CLI fixa max_execution_time em 0, ou seja, ilimitado, porque os scripts na linha de comandos executam muitas vezes tarefas longas. A duração pode limitar-se no próprio script ou com ferramentas como o timeout.
Posso usar o servidor integrado php -S em produção?
Não. O manual descreve-o como auxiliar de desenvolvimento, não como servidor web completo, e desaconselha a sua utilização em redes públicas e em produção. Para sistemas em produção, Apache, Nginx ou LiteSpeed com PHP-FPM têm de estar à frente.
O OPcache está ativo na linha de comandos?
Por defeito não. Segundo o manual, opcache.enable_cli está em 0. Para scripts curtos, a cache traz de qualquer modo pouco, porque cada chamada é um processo novo.