Stručně: SAPI znamená Server Application Programming Interface, tedy rozhraní, přes které PHP komunikuje se svým okolím. Typická SAPI jsou fpm-fcgi (PHP-FPM), apache2handler (mod_php), cgi-fcgi (php-cgi), litespeed a cli pro příkazovou řádku. SAPI určuje, jak požadavky přicházejí, který php.ini platí a které procesy je po aktualizaci nutné restartovat. U PHP2Shell na tom závisí dokonce i zařazení rizika.
Co je SAPI?
PHP samo je program, který provádí kód. Aby mohlo vydávat webové stránky, potřebuje spojení s webovým serverem, s příkazovou řádkou nebo s jinou aplikací. Toto spojení je SAPI. Přijímá data požadavku, předává je do Zend Engine a vrací výstup.
SAPI si lze představit jako zástrčku: motor zůstává stejný, ale podle zástrčky zapadá do Apache, do Nginx přes FastCGI, do LiteSpeed nebo do terminálu. Každá varianta má vlastní přednosti, vlastní cesty konfigurace a vlastní úskalí.
SAPI rozhoduje především o třech věcech, které jsou v každodenním provozu důležité:
- Procesní model: Běží PHP ve webovém serveru, jako samostatná služba s trvalými workery, nebo jako krátkodobý proces pro každé volání?
- Konfigurace: Který php.ini se čte a kde smějí být dodatečná nastavení, například v
.htaccess, v.user.ininebo v poolu FPM? - Oprávnění a oddělení: Pod kterým uživatelem kód běží a lze od sebe oddělit více webů?
V hostingových panelech se SAPI objevují pod jinými názvy. Plesk například mluví o obslužných programech PHP (handlerech) jako „FPM application“, „FastCGI application“ nebo „Apache module“. Míněny jsou tytéž provozní režimy, které tato stránka popisuje. V případě pochybností pomůže kontrolní soubor níže, který zobrazí skutečný název SAPI.
Která SAPI v PHP existují?
Příručka PHP uvádí pro php_sapi_name() mimo jiné tyto návratové hodnoty: apache, apache2handler, cgi (do PHP 5.3), cgi-fcgi, cli, cli-server, embed, fpm-fcgi, litespeed a phpdbg. Seznam výslovně není úplný.
| Název SAPI | Provozní režim | Typické nasazení | Procesní model |
|---|---|---|---|
fpm-fcgi |
PHP-FPM | Nginx, Apache s proxy_fcgi, hostingové panely |
samostatná služba s pooly workerů |
apache2handler |
mod_php | starší servery Apache, jednoduché image Dockeru | PHP v procesu Apache |
cgi-fcgi |
php-cgi | starší instalace, některá nastavení ve Windows | proces pro každý požadavek nebo FastCGI |
litespeed |
LSAPI | webový server LiteSpeed, mnoho sdílených hostingů | vlastní procesy PHP |
cli |
příkazová řádka | úlohy cron, Composer, skripty údržby | jeden proces pro každé volání |
cli-server |
vestavěný webový server | jen lokální vývoj (php -S) |
jeden vývojový server |
embed |
vložené | PHP v jiných programech | závisí na programu |
phpdbg |
debugger | hledání chyb | interaktivní |
FrankenPHP je moderní aplikační server, který PHP vkládá přímo do sebe. Také jej PHP2Shell postihuje a má vlastní cesty aktualizace; podrobnosti v článku Zabezpečení FrankenPHP.
Jak zjistit SAPI svého serveru
SAPI webu zjistíte jen přes webový server, nikoli přes příkazovou řádku. Stačí malý kontrolní soubor:
<?php
// sapi-check.php: po zavolání ihned zase smazat
header('Content-Type: text/plain');
echo PHP_SAPI, "\n", PHP_VERSION, "\n", php_ini_loaded_file(), "\n";
V příkazové řádce lze nainstalované varianty a služby zjistit jen pro čtení:
php -r 'echo PHP_SAPI, PHP_EOL;' # vždy "cli"
ls /usr/sbin/php-fpm* 2>/dev/null # nainstalované verze FPM
systemctl list-units --type=service | grep -i -E "php|lsws|apache2|httpd"
apachectl -M 2>/dev/null | grep -i php # načten mod_php?
Proč může mít každé SAPI svůj php.ini
Podle příručky PHP hledá PHP nejdříve soubor php-SAPI.ini, tedy například php-cli.ini, a teprve potom php.ini. Distribuce jako Debian a Ubuntu jdou dál a zakládají pro každé SAPI samostatné adresáře, například /etc/php/8.3/fpm/ a /etc/php/8.3/cli/.
Liší se i okamžik: u serverových modulů čte PHP konfiguraci podle příručky jen jednou při spuštění webového serveru, u CGI a CLI při každém volání. Kdo mění nastavení, musí proto vědět, kterého SAPI se týká. Více v článku php.ini vysvětlen.
SAPI a bezpečnost: co ukázal PHP2Shell
Podle hlášení postihuje PHP2Shell PHP-FPM, Apache s mod_php, php-cgi, FrankenPHP a LiteSpeed. Tým PHP hodnotí riziko u mod_php nejvýše, protože tam byl předveden exploit dříve, než se spustí kód aplikace. Důvody najdete v článku Proč nese mod_php nejvyšší riziko.
Pro provoz znamená SAPI především jedno: určuje, co se po aktualizaci musí restartovat.
- PHP-FPM: všechny pooly a workery každé nainstalované verze
- mod_php: celá služba Apache, nikoli jen reload
- php-cgi a nastavení FastCGI: všechny zbývající procesy PHP
- LiteSpeed: procesy PHP webového serveru podle návodu výrobce
- CLI: žádné trvalé procesy, ale balíček také aktualizovat, aby kontroly souhlasily
Ve střednědobém horizontu se vyplatí odejít od mod_php. Příručka PHP doporučuje pro nové instalace Apache PHP-FPM s mod_proxy_fcgi. Základy popisuje článek PHP-FPM vysvětleno.
Jak konkrétně pomáhá PHP SOS?
- Zmapovat SAPI: Pro každý server zjistíme, jaké provozní režimy a verze PHP jsou skutečně aktivní.
- Restartovat správně: Prostřednictvím služby PHP-Patch aktualizujeme každé SAPI a doložíme restart všech procesů.
- Přiřadit konfiguraci: Ukážeme, který php.ini a která nastavení poolu pro váš web platí.
- Naplánovat přechod: Tam, kde běží mod_php nebo php-cgi, naplánujeme a otestujeme přechod na PHP-FPM.
Časté dotazy
Jak zjistím, které SAPI můj web používá?
Nejspolehlivěji pomocí krátce nahraného kontrolního souboru, který vypíše PHP_SAPI nebo php_sapi_name() a je zavolán přes webový server. V příkazové řádce dostanete vždy cli, což o webu nic neříká. Poté kontrolní soubor ihned smažte.
Které SAPI je nejbezpečnější?
Žádné není samo o sobě bezpečné. PHP-FPM ale nabízí nejvíce nástrojů pro oddělení: vlastní pooly, uživatele a uzamčená nastavení pro každý web. Příručka PHP výslovně doporučuje pro nové instalace Apache PHP-FPM místo mod_php.
Týká se PHP2Shell i verze PHP pro příkazovou řádku?
Známá hlášení uvádějí PHP-FPM, mod_php, php-cgi, FrankenPHP a LiteSpeed. CLI nezpracovává požadavky ze sítě. Pochází ale většinou ze stejného zdroje balíčků a měla by se aktualizovat vždy také, už jen proto, aby kontrolní příkazy ukazovaly správný stav.
Může server používat více SAPI současně?
Ano, je to dokonce běžné. Téměř každý server má vedle webového SAPI také CLI pro úlohy cron a údržbu. Často navíc paralelně běží více verzí PHP-FPM. Každou z nich je nutné aktualizovat a restartovat zvlášť.