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:
- 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?
- Configuração: que php.ini é lido e onde podem constar definições adicionais, por exemplo num
.htaccess, num.user.iniou no pool do FPM? - 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.
- PHP-FPM: todos os pools e workers de cada versão instalada
- mod_php: o serviço Apache completo, não apenas um reload
- php-cgi e configurações FastCGI: todos os processos PHP restantes
- LiteSpeed: os processos PHP do servidor web, segundo as instruções do fabricante
- 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.