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 →

SAPI explicada: como o PHP comunica com o servidor web

A SAPI é a interface entre o PHP e o servidor web. Determina como chegam os pedidos, que php.ini vale e o que tem de reiniciar depois de uma atualização.

Atualizado em 5 min de leituraConhecimento PHP

Em resumo: SAPI significa Server Application Programming Interface, a interface através da qual o PHP comunica com o seu ambiente. As SAPI típicas são fpm-fcgi (PHP-FPM), apache2handler (mod_php), cgi-fcgi (php-cgi), litespeed e cli para a linha de comandos. A SAPI determina como chegam os pedidos, que php.ini vale e que processos têm de reiniciar depois de uma atualização. No PHP2Shell, até a classificação do risco depende dela.

O que é uma SAPI?

O próprio PHP é um programa que executa código. Para poder entregar páginas web, precisa de uma ligação a um servidor web, à linha de comandos ou a outra aplicação. Essa ligação é a SAPI. Recebe os dados do pedido, passa-os à Zend Engine e devolve a saída.

Pode imaginar-se a SAPI como uma ficha: o motor é o mesmo, mas, consoante a ficha, encaixa no Apache, no Nginx via FastCGI, no LiteSpeed ou no terminal. Cada variante tem pontos fortes, caminhos de configuração e armadilhas próprios.

A SAPI decide sobretudo três coisas que contam no dia a dia:

  1. Modelo de processos: o PHP corre dentro do servidor web, como serviço próprio com workers permanentes ou como processo de curta duração por chamada?
  2. Configuração: que php.ini é lido e onde podem constar definições adicionais, por exemplo num .htaccess, num .user.ini ou no pool do FPM?
  3. Permissões e separação: com que utilizador corre o código e é possível separar vários sites uns dos outros?

Nos painéis de alojamento, as SAPI aparecem com outros nomes. O Plesk fala, por exemplo, em handlers PHP como «FPM application», «FastCGI application» ou «Apache module». Referem-se aos mesmos modos de operação que esta página descreve. Em caso de dúvida, ajuda o ficheiro de teste mais abaixo, que mostra o nome real da SAPI.

Que SAPI do PHP existem?

O manual do PHP indica, para php_sapi_name(), entre outros, estes valores de retorno: apache, apache2handler, cgi (até ao PHP 5.3), cgi-fcgi, cli, cli-server, embed, fpm-fcgi, litespeed e phpdbg. A lista não é expressamente exaustiva.

Nome da SAPI Modo de operação Utilização típica Modelo de processos
fpm-fcgi PHP-FPM Nginx, Apache com proxy_fcgi, painéis de alojamento serviço próprio com pools de workers
apache2handler mod_php servidores Apache mais antigos, imagens Docker simples PHP no processo do Apache
cgi-fcgi php-cgi instalações antigas, algumas configurações Windows processo por pedido ou FastCGI
litespeed LSAPI servidor web LiteSpeed, muitos alojadores partilhados processos PHP próprios
cli linha de comandos tarefas cron, Composer, scripts de manutenção um processo por chamada
cli-server servidor web integrado apenas desenvolvimento local (php -S) um servidor de desenvolvimento
embed incorporado PHP dentro de outros programas depende do programa
phpdbg depurador deteção de erros interativo

O FrankenPHP é um servidor de aplicações moderno que incorpora o PHP diretamente. Também está afetado pelo PHP2Shell e tem vias de atualização próprias; pormenores em Proteger o FrankenPHP.

Como verificar a SAPI do seu servidor

A SAPI de um site só se descobre através do servidor web, não pela linha de comandos. Basta um pequeno ficheiro de teste:

<?php
// sapi-check.php: apagar de imediato depois de o chamar
header('Content-Type: text/plain');
echo PHP_SAPI, "\n", PHP_VERSION, "\n", php_ini_loaded_file(), "\n";

Na linha de comandos podem registar-se, apenas em leitura, as variantes e serviços instalados:

php -r 'echo PHP_SAPI, PHP_EOL;'          # sempre "cli"
ls /usr/sbin/php-fpm* 2>/dev/null           # versões FPM instaladas
systemctl list-units --type=service | grep -i -E "php|lsws|apache2|httpd"
apachectl -M 2>/dev/null | grep -i php     # mod_php carregado?

Porque é que cada SAPI pode ter o seu próprio php.ini

Segundo o manual do PHP, o PHP procura primeiro um ficheiro php-SAPI.ini, por exemplo php-cli.ini, e só depois o php.ini. Distribuições como Debian e Ubuntu vão mais longe e criam pastas próprias por SAPI, por exemplo /etc/php/8.3/fpm/ e /etc/php/8.3/cli/.

O momento também difere: nos módulos de servidor, o PHP lê a configuração, segundo o manual, apenas uma vez no arranque do servidor web; no CGI e na CLI, a cada chamada. Quem altera uma definição tem por isso de saber que SAPI é afetada. Mais sobre isto em O php.ini explicado.

SAPI e segurança: o que o PHP2Shell mostrou

Segundo os comunicados, o PHP2Shell afeta PHP-FPM, Apache com mod_php, php-cgi, FrankenPHP e LiteSpeed. A equipa do PHP classifica o risco como o mais elevado no mod_php, porque aí foi demonstrado um exploit antes de o código da aplicação correr. As razões estão em Porque é que o mod_php tem o risco mais elevado.

Para a operação, a SAPI significa sobretudo uma coisa: determina o que tem de reiniciar depois da atualização.

  1. PHP-FPM: todos os pools e workers de cada versão instalada
  2. mod_php: o serviço Apache completo, não apenas um reload
  3. php-cgi e configurações FastCGI: todos os processos PHP restantes
  4. LiteSpeed: os processos PHP do servidor web, segundo as instruções do fabricante
  5. CLI: sem processos permanentes, mas atualizar também o pacote, para que as verificações estejam corretas

A médio prazo compensa abandonar o mod_php. O manual do PHP recomenda, para novas instalações do Apache, o PHP-FPM com mod_proxy_fcgi. Os fundamentos são descritos em PHP-FPM explicado.

Como ajuda concretamente a PHP SOS?

  • Levantar as SAPI: Apuramos, para cada servidor, que modos de operação e versões do PHP estão realmente ativos.
  • Reiniciar corretamente: Através do serviço de patches PHP atualizamos cada SAPI e comprovamos o reinício de todos os processos.
  • Atribuir a configuração: Mostramos que php.ini e que definições de pool valem para o seu site.
  • Planear a mudança: Onde corre mod_php ou php-cgi, planeamos e testamos a mudança para o PHP-FPM.

Perguntas frequentes

Como descubro que SAPI o meu site utiliza?

O mais fiável é um ficheiro de teste colocado por pouco tempo, que mostre PHP_SAPI ou php_sapi_name(), chamado através do servidor web. Na linha de comandos obtém sempre cli, o que nada diz sobre o site. Depois, apague o ficheiro de teste de imediato.

Qual é a SAPI mais segura?

Nenhuma é segura por si só. O PHP-FPM oferece, porém, mais ferramentas de separação: pools, utilizadores e definições bloqueadas por site. O manual do PHP aconselha expressamente o PHP-FPM em vez do mod_php para novas instalações do Apache.

A versão de linha de comandos do PHP está afetada pelo PHP2Shell?

Os comunicados conhecidos referem PHP-FPM, mod_php, php-cgi, FrankenPHP e LiteSpeed. A CLI não processa pedidos vindos da rede. Mas costuma vir da mesma fonte de pacotes e deve ser sempre atualizada também, nem que seja para que os comandos de verificação mostrem o estado correto.

Um servidor pode usar várias SAPI ao mesmo tempo?

Sim, e é até habitual. Quase todos os servidores têm, além da SAPI web, a CLI para tarefas cron e manutenção. Muitas vezes correm também em paralelo várias versões do PHP-FPM. Cada uma tem de ser atualizada e reiniciada individualmente.

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