Kort gezegd: SAPI staat voor Server Application Programming Interface, de interface waarmee PHP met zijn omgeving praat. Typische SAPI's zijn fpm-fcgi (PHP-FPM), apache2handler (mod_php), cgi-fcgi (php-cgi), litespeed en cli voor de opdrachtregel. De SAPI bepaalt hoe verzoeken binnenkomen, welke php.ini geldt en welke processen na een update opnieuw moeten starten. Bij PHP2Shell hangt zelfs de risico-indeling ervan af.
Wat is een SAPI?
PHP zelf is een programma dat code uitvoert. Om webpagina's te kunnen uitleveren heeft het een verbinding nodig met een webserver, met de opdrachtregel of met een andere toepassing. Die verbinding is de SAPI. Ze neemt verzoekgegevens aan, geeft ze door aan de Zend Engine en geeft de uitvoer terug.
Je kunt je de SAPI voorstellen als een stekker: de motor blijft gelijk, maar al naar gelang de stekker past hij op Apache, op Nginx via FastCGI, op LiteSpeed of op de terminal. Elke variant heeft eigen sterke punten, eigen configuratiewegen en eigen valkuilen.
De SAPI beslist vooral over drie zaken die in de praktijk tellen:
- Procesmodel: Draait PHP in de webserver, als eigen dienst met permanente workers of als kortlevend proces per aanroep?
- Configuratie: Welke php.ini wordt gelezen, en waar mogen extra instellingen staan, bijvoorbeeld in
.htaccess, in een.user.iniof in de FPM-pool? - Rechten en scheiding: Onder welke gebruiker draait de code, en kunnen meerdere websites van elkaar worden gescheiden?
In hostingpanelen duiken SAPI's onder andere namen op. Plesk spreekt bijvoorbeeld van PHP-handlers zoals „FPM application”, „FastCGI application” of „Apache module”. Bedoeld zijn dezelfde uitvoeringsmodi die deze pagina beschrijft. In geval van twijfel helpt het testbestand verderop, dat de werkelijke SAPI-naam toont.
Welke PHP-SAPI's bestaan er?
De PHP-handleiding noemt voor php_sapi_name() onder meer deze retourwaarden: apache, apache2handler, cgi (tot PHP 5.3), cgi-fcgi, cli, cli-server, embed, fpm-fcgi, litespeed en phpdbg. De lijst is uitdrukkelijk niet limitatief.
| SAPI-naam | Uitvoeringsmodus | Typische toepassing | Procesmodel |
|---|---|---|---|
fpm-fcgi |
PHP-FPM | Nginx, Apache met proxy_fcgi, hostingpanelen |
eigen dienst met workerpools |
apache2handler |
mod_php | oudere Apache-servers, eenvoudige Docker-images | PHP in het Apache-proces |
cgi-fcgi |
php-cgi | oude installaties, sommige Windows-opstellingen | proces per verzoek of FastCGI |
litespeed |
LSAPI | LiteSpeed-webserver, veel shared hosters | eigen PHP-processen |
cli |
opdrachtregel | cronjobs, Composer, onderhoudsscripts | één proces per aanroep |
cli-server |
ingebouwde webserver | alleen lokale ontwikkeling (php -S) |
een ontwikkelserver |
embed |
ingebed | PHP in andere programma's | afhankelijk van het programma |
phpdbg |
debugger | foutopsporing | interactief |
FrankenPHP is een moderne toepassingsserver die PHP direct inbedt. Hij is eveneens door PHP2Shell getroffen en heeft eigen updatewegen; details onder FrankenPHP beveiligen.
Zo controleert u de SAPI van uw server
De SAPI van een website komt u alleen via de webserver te weten, niet via de opdrachtregel. Een klein testbestand volstaat:
<?php
// sapi-check.php: direct na de aanroep weer verwijderen
header('Content-Type: text/plain');
echo PHP_SAPI, "\n", PHP_VERSION, "\n", php_ini_loaded_file(), "\n";
Op de opdrachtregel zijn de geïnstalleerde varianten en diensten uitsluitend lezend vast te stellen:
php -r 'echo PHP_SAPI, PHP_EOL;' # altijd "cli"
ls /usr/sbin/php-fpm* 2>/dev/null # geïnstalleerde FPM-versies
systemctl list-units --type=service | grep -i -E "php|lsws|apache2|httpd"
apachectl -M 2>/dev/null | grep -i php # mod_php geladen?
Waarom elke SAPI zijn eigen php.ini kan hebben
Volgens de PHP-handleiding zoekt PHP eerst naar een bestand php-SAPI.ini, dus bijvoorbeeld php-cli.ini, en pas daarna naar php.ini. Distributies zoals Debian en Ubuntu gaan verder en maken per SAPI eigen mappen aan, bijvoorbeeld /etc/php/8.3/fpm/ en /etc/php/8.3/cli/.
Ook het tijdstip verschilt: bij servermodules leest PHP de configuratie volgens de handleiding maar één keer bij het starten van de webserver, bij CGI en CLI bij elke aanroep. Wie een instelling wijzigt, moet daarom weten welke SAPI het betreft. Meer daarover onder De php.ini uitgelegd.
SAPI en beveiliging: wat PHP2Shell heeft laten zien
Door PHP2Shell zijn volgens de meldingen PHP-FPM, Apache met mod_php, php-cgi, FrankenPHP en LiteSpeed getroffen. Het PHP-team schat het risico bij mod_php het hoogst in, omdat daar een exploit is gedemonstreerd voordat toepassingscode draait. De redenen staan onder Waarom mod_php het hoogste risico draagt.
Voor de bedrijfsvoering betekent de SAPI vooral één ding: ze bepaalt wat na de update opnieuw moet starten.
- PHP-FPM: alle pools en workers van elke geïnstalleerde versie
- mod_php: de volledige Apache-dienst, niet alleen een reload
- php-cgi en FastCGI-opstellingen: alle resterende PHP-processen
- LiteSpeed: de PHP-processen van de webserver volgens de handleiding van de leverancier
- CLI: geen permanente processen, maar het pakket wel meebijwerken, zodat controles kloppen
Op middellange termijn loont de overstap weg van mod_php. De PHP-handleiding adviseert voor nieuwe Apache-installaties PHP-FPM met mod_proxy_fcgi. De basis beschrijft PHP-FPM uitgelegd.
Hoe helpt PHP SOS concreet?
- SAPI's in kaart brengen: Wij stellen voor elke server vast welke uitvoeringsmodi en PHP-versies daadwerkelijk actief zijn.
- Juist herstarten: Via de PHP-patchservice werken wij elke SAPI bij en leggen we de herstart van alle processen vast.
- Configuratie toewijzen: Wij laten zien welke php.ini en welke poolinstellingen voor uw website gelden.
- Overstap plannen: Waar mod_php of php-cgi draait, plannen en testen wij de overstap naar PHP-FPM.
Veelgestelde vragen
Hoe ontdek ik welke SAPI mijn website gebruikt?
Het betrouwbaarst met een kortstondig geplaatst testbestand dat PHP_SAPI of php_sapi_name() uitgeeft, aangeroepen via de webserver. Op de opdrachtregel krijgt u altijd cli, dat zegt niets over de website. Verwijder het testbestand daarna meteen.
Welke SAPI is de veiligste?
Geen enkele is uit zichzelf veilig. PHP-FPM biedt echter de meeste middelen voor scheiding: eigen pools, gebruikers en vergrendelde instellingen per website. De PHP-handleiding adviseert voor nieuwe Apache-installaties uitdrukkelijk PHP-FPM in plaats van mod_php.
Is de opdrachtregelversie van PHP door PHP2Shell getroffen?
De bekende meldingen noemen PHP-FPM, mod_php, php-cgi, FrankenPHP en LiteSpeed. De CLI verwerkt geen verzoeken uit het netwerk. Ze komt echter meestal uit dezelfde pakketbron en moet altijd mee worden bijgewerkt, alleen al zodat controleopdrachten de juiste stand tonen.
Kan een server meerdere SAPI's tegelijk gebruiken?
Ja, dat is zelfs gebruikelijk. Vrijwel elke server heeft naast de web-SAPI de CLI voor cronjobs en onderhoud. Vaak draaien bovendien meerdere PHP-FPM-versies naast elkaar. Elk daarvan moet afzonderlijk worden bijgewerkt en opnieuw gestart.