Situação atual: PHP2Shell. Duas vulnerabilidades críticas do PHP (CVSS 9,2) permitem executar código malicioso sem autenticação. Patches disponíveis desde 21/10/2026.O que fazer agora →

O PHP na linha de comandos (CLI)

A CLI do PHP executa scripts sem servidor web, por exemplo para tarefas cron e manutenção. Comporta-se de modo diferente da versão web e muitas vezes não mostra a versão que o seu site utiliza.

Atualizado em 5 min de leituraConhecimento PHP

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:

  1. php -v mostra o número de versão da CLI.
  2. php --ini mostra que ficheiros de configuração são carregados.
  3. php -m lista os módulos compilados e carregados.
  4. php -i chama phpinfo() e emite o resultado como texto.
  5. php -l datei.php verifica apenas a sintaxe (lint). Desde o PHP 8.3 também para vários ficheiros de uma vez.
  6. php -r 'code' executa código diretamente, sem <?php.
  7. php -d name=wert define uma definição INI para esta chamada.
  8. php -n ignora por completo o php.ini.
  9. php --ri name mostra 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:

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.

Fontes

Contacto imediato

Cada hora conta. Escreva-nos agora.

Descreva brevemente o sistema, a versão do PHP e o que observou. Entramos em contacto consigo, esclarecemos a situação e trabalhamos remotamente até o incidente estar concluído e documentado.

Ajuda imediata