Kort sagt: SAPI står for Server Application Programming Interface, den grænseflade, som PHP taler med sine omgivelser igennem. Typiske SAPI'er er fpm-fcgi (PHP-FPM), apache2handler (mod_php), cgi-fcgi (php-cgi), litespeed og cli til kommandolinjen. SAPI'en afgør, hvordan forespørgsler ankommer, hvilken php.ini der gælder, og hvilke processer der skal genstartes efter en opdatering. Ved PHP2Shell afhænger endda risikoklassificeringen af den.
Hvad er en SAPI?
PHP selv er et program, der udfører kode. For at kunne levere websider har det brug for en forbindelse til en webserver, til kommandolinjen eller til en anden applikation. Denne forbindelse er SAPI'en. Den modtager forespørgselsdata, giver dem videre til Zend Engine og returnerer outputtet.
Man kan forestille sig SAPI'en som et stik: Motoren forbliver den samme, men alt efter stikket passer den til Apache, til Nginx via FastCGI, til LiteSpeed eller til terminalen. Hver variant har egne styrker, egne konfigurationsveje og egne faldgruber.
SAPI'en afgør først og fremmest tre ting, som tæller i hverdagen:
- Procesmodel: Kører PHP inde i webserveren, som egen tjeneste med vedvarende workere eller som kortlivet proces pr. kald?
- Konfiguration: Hvilken php.ini læses, og hvor må yderligere indstillinger stå, f.eks. i
.htaccess, i en.user.inieller i FPM-poolen? - Rettigheder og adskillelse: Under hvilken bruger kører koden, og kan flere websites adskilles fra hinanden?
I hosting-paneler dukker SAPI'er op under andre navne. Plesk taler f.eks. om PHP-handlere som "FPM application", "FastCGI application" eller "Apache module". Der menes de samme driftsformer, som denne side beskriver. Er I i tvivl, hjælper kontrolfilen længere nede, som viser det faktiske SAPI-navn.
Hvilke PHP-SAPI'er findes der?
PHP-manualen nævner til php_sapi_name() blandt andet disse returværdier: apache, apache2handler, cgi (til og med PHP 5.3), cgi-fcgi, cli, cli-server, embed, fpm-fcgi, litespeed og phpdbg. Listen er udtrykkeligt ikke udtømmende.
| SAPI-navn | Driftsform | Typisk anvendelse | Procesmodel |
|---|---|---|---|
fpm-fcgi |
PHP-FPM | Nginx, Apache med proxy_fcgi, hosting-paneler |
egen tjeneste med worker-pools |
apache2handler |
mod_php | ældre Apache-servere, simple Docker-images | PHP i Apache-processen |
cgi-fcgi |
php-cgi | gamle installationer, nogle Windows-opsætninger | proces pr. forespørgsel eller FastCGI |
litespeed |
LSAPI | LiteSpeed-webserver, mange shared-hostere | egne PHP-processer |
cli |
kommandolinje | cronjobs, Composer, vedligeholdelsesscripts | én proces pr. kald |
cli-server |
indbygget webserver | kun lokal udvikling (php -S) |
en udviklingsserver |
embed |
indlejret | PHP i andre programmer | afhænger af programmet |
phpdbg |
debugger | fejlfinding | interaktiv |
FrankenPHP er en moderne applikationsserver, der indlejrer PHP direkte. Den er ligeledes berørt af PHP2Shell og har egne opdateringsveje; detaljer under Sikring af FrankenPHP.
Sådan kontrollerer I jeres servers SAPI
En hjemmesides SAPI får I kun at vide via webserveren, ikke via kommandolinjen. En lille kontrolfil er nok:
<?php
// sapi-check.php: slet igen straks efter kaldet
header('Content-Type: text/plain');
echo PHP_SAPI, "\n", PHP_VERSION, "\n", php_ini_loaded_file(), "\n";
På kommandolinjen kan de installerede varianter og tjenester registreres læsende:
php -r 'echo PHP_SAPI, PHP_EOL;' # altid "cli"
ls /usr/sbin/php-fpm* 2>/dev/null # installerede FPM-versioner
systemctl list-units --type=service | grep -i -E "php|lsws|apache2|httpd"
apachectl -M 2>/dev/null | grep -i php # mod_php indlæst?
Hvorfor hver SAPI kan have sin egen php.ini
Ifølge PHP-manualen leder PHP først efter en fil php-SAPI.ini, altså f.eks. php-cli.ini, og først derefter efter php.ini. Distributioner som Debian og Ubuntu går videre og opretter egne mapper pr. SAPI, f.eks. /etc/php/8.3/fpm/ og /etc/php/8.3/cli/.
Tidspunktet er også forskelligt: Ved servermoduler læser PHP ifølge manualen konfigurationen kun én gang, når webserveren starter, ved CGI og CLI ved hvert kald. Den, der ændrer en indstilling, skal derfor vide, hvilken SAPI der er berørt. Mere herom under php.ini forklaret.
SAPI og sikkerhed: hvad PHP2Shell har vist
Af PHP2Shell er ifølge meddelelserne PHP-FPM, Apache med mod_php, php-cgi, FrankenPHP og LiteSpeed berørt. PHP-teamet vurderer risikoen ved mod_php som den højeste, fordi der dér blev vist en exploit, før applikationskode kører. Begrundelserne står under Hvorfor mod_php bærer den højeste risiko.
For driften betyder SAPI'en først og fremmest én ting: Den afgør, hvad der skal genstartes efter opdateringen.
- PHP-FPM: alle pools og workere i hver installeret version
- mod_php: hele Apache-tjenesten, ikke blot en reload
- php-cgi og FastCGI-opsætninger: alle tilbageværende PHP-processer
- LiteSpeed: webserverens PHP-processer efter leverandørens vejledning
- CLI: ingen vedvarende processer, men opdatér pakken med, så kontroller passer
På mellemlang sigt kan et skift væk fra mod_php betale sig. PHP-manualen anbefaler til nye Apache-installationer PHP-FPM med mod_proxy_fcgi. Grundlaget beskriver PHP-FPM forklaret.
Hvordan hjælper PHP SOS konkret?
- Kortlægge SAPI'er: Vi finder for hver server ud af, hvilke driftsformer og PHP-versioner der faktisk er aktive.
- Genstarte korrekt: Via PHP-patchservicen opdaterer vi hver SAPI og dokumenterer genstarten af alle processer.
- Henføre konfiguration: Vi viser, hvilken php.ini og hvilke pool-indstillinger der gælder for jeres website.
- Planlægge skiftet: Hvor mod_php eller php-cgi kører, planlægger og tester vi skiftet til PHP-FPM.
Ofte stillede spørgsmål
Hvordan finder jeg ud af, hvilken SAPI min hjemmeside bruger?
Mest pålideligt med en kortvarigt lagt kontrolfil, der udskriver PHP_SAPI eller php_sapi_name(), kaldt via webserveren. På kommandolinjen får I altid cli, og det siger intet om hjemmesiden. Slet derefter kontrolfilen straks.
Hvilken SAPI er den sikreste?
Ingen er sikker i sig selv. PHP-FPM tilbyder dog de fleste værktøjer til adskillelse: egne pools, brugere og låste indstillinger pr. website. PHP-manualen anbefaler udtrykkeligt PHP-FPM frem for mod_php til nye Apache-installationer.
Er kommandolinjeversionen berørt af PHP2Shell?
De kendte meddelelser nævner PHP-FPM, mod_php, php-cgi, FrankenPHP og LiteSpeed. CLI behandler ingen forespørgsler fra nettet. Den stammer dog som regel fra den samme pakkekilde og bør altid opdateres med, allerede for at kontrolkommandoer viser den rigtige status.
Kan en server bruge flere SAPI'er samtidig?
Ja, det er endda almindeligt. Næsten enhver server har ved siden af web-SAPI'en CLI til cronjobs og vedligeholdelse. Ofte kører der desuden flere PHP-FPM-versioner parallelt. Hver af dem skal opdateres og genstartes for sig.