Kort gezegd: De PHP CLI (Command Line Interface) is de variant van PHP voor de opdrachtregel. Ze voert scripts uit zonder webserver, bijvoorbeeld voor cronjobs, Composer of onderhoudstaken. Ze heeft eigen standaardwaarden, vaak een eigen php.ini en soms zelfs een andere versie dan de website. Daarom is php -v geen betrouwbaar bewijs dat de website na PHP2Shell is gepatcht.
Wat is de PHP CLI?
De PHP-handleiding noemt twee hoofdtoepassingen van PHP: scripts voor websites en scripts op de opdrachtregel. Voor dat laatste is er een eigen SAPI met de naam cli. Ze heeft geen webserver of browser nodig, alleen de PHP-interpreter. Volgens de handleiding is ze bijzonder geschikt voor taken die regelmatig via cron onder Linux of via de taakplanner onder Windows draaien.
Typische voorbeelden in de bedrijfspraktijk: nachtelijke imports in de webshop, nieuwsbriefverzending, opschonen van caches, updates via Composer of de opdrachtregelhulpmiddelen van CMS'en zoals WP-CLI of de Symfony-console. Onder Windows heet het bestand php.exe, de CGI-variant php-cgi.exe.
Anders dan PHP-FPM is de CLI geen dienst. Elke aanroep start een nieuw proces, leest volgens de handleiding de configuratie opnieuw in en eindigt als het script klaar is. Een herstart na een update is daarom niet nodig. Uitzonderingen zijn langlopende processen die via de CLI worden gestart, zoals wachtrijworkers van frameworks of daemons onder systemd of Supervisor. Ze draaien dagenlang met de eenmaal geladen interpreter en moeten na een PHP-update net zo opnieuw worden gestart als webworkers.
Voor directie en projectleiding betekent dit: ook achtergrondtaken horen in de inventaris en in elk updateplan.
Waarin verschilt de CLI van de webversie?
De CLI overschrijft volgens de handleiding enkele instellingen vast. Ze zijn niet via de php.ini te wijzigen, alleen tijdens de uitvoering met ini_set():
| Directive | Waarde in de CLI | Reden volgens de handleiding |
|---|---|---|
html_errors |
uit | HTML-tags storen in de terminal |
implicit_flush |
aan | uitvoer moet direct verschijnen |
max_execution_time |
0 (onbeperkt) | opdrachtregelscripts draaien vaak lang |
register_argc_argv |
aan | scripts krijgen altijd $argc en $argv |
output_buffering |
uit | vast ingesteld, bufferfuncties blijven bruikbaar |
max_input_time |
uit | de CLI kent geen GET, POST of uploads |
Een ander verschil: de CLI wisselt niet naar de map van het script. Wie php -f ordner/skript.php vanuit /tmp aanroept, blijft in /tmp werken. Relatieve paden in cronjobs zijn daarom een veelvoorkomende bron van fouten.
Een klein script dat alleen op de opdrachtregel mag draaien:
<?php
if (PHP_SAPI !== 'cli') {
http_response_code(403);
exit('Nur für die Kommandozeile.');
}
$tage = (int) ($argv[1] ?? 30);
$grenze = time() - $tage * 86400;
$alt = 0;
foreach (glob(__DIR__ . '/cache/*.tmp') ?: [] as $datei) {
if (filemtime($datei) < $grenze) { $alt++; }
}
fwrite(STDOUT, "Dateien älter als $tage Tage: $alt\n");
De controle op PHP_SAPI voorkomt dat een onderhoudsscript via de browser wordt geactiveerd als het per ongeluk in de webmap staat. De handleiding adviseert uitdrukkelijk de SAPI zo te controleren in plaats van te vertrouwen op de aanwezigheid van $argv.
De belangrijkste opties van de PHP CLI
De volgende opties komen uit het optieoverzicht van de PHP-handleiding en zijn voor beheerders bijzonder nuttig:
php -vtoont het versienummer van de CLI.php --initoont welke configuratiebestanden worden geladen.php -msomt de ingecompileerde en geladen modules op.php -iroeptphpinfo()aan en geeft het resultaat als tekst uit.php -l datei.phpcontroleert alleen de syntaxis (lint). Sinds PHP 8.3 ook voor meerdere bestanden tegelijk.php -r 'code'voert code direct uit, zonder<?php.php -d name=wertstelt een INI-instelling in voor deze aanroep.php -nnegeert de php.ini volledig.php --ri nametoont de configuratie van een extensie.
php --ini
php -m | grep -i -E "opcache|sodium|pdo"
php --ri session | grep upload_progress
php -l src/Controller.php src/Model.php
De ingebouwde webserver: alleen voor ontwikkeling
Met php -S localhost:8000 start de CLI een kleine webserver. De voorbeelduitvoer in de handleiding noemt PHP 5.4.0 als uitgangspunt. De handleiding is eenduidig: de server dient voor ontwikkeling, is geen volwaardige webserver en mag niet in openbare netwerken en niet in productie draaien. Draait hij permanent en van buitenaf bereikbaar op een server, dan is dat een bevinding die u moet verhelpen.
CLI, cron en beveiliging na PHP2Shell
De bekende meldingen over PHP2Shell noemen PHP-FPM, mod_php, php-cgi, FrankenPHP en LiteSpeed als getroffen uitvoeringsmodi. De CLI verwerkt geen verzoeken uit het netwerk. Voor de beveiliging is ze toch in drie opzichten belangrijk:
- Onjuist bewijs:
php -vtoont de CLI-versie. De website kan een andere versie gebruiken, en backports van distributies veranderen het getoonde nummer vaak niet. Hoe u de stand juist aantoont, staat onder PHP-versie en patchstand controleren en in het artikel Waarom php -v hetzelfde nummer toont. - Persistentie via cron: Aanvallers gebruiken na een inbraak graag cronjobs die regelmatig een PHP-script starten. Aanwijzingen voor het zoeken geeft Verborgen cronjobs als achterdeur herkennen.
- Hetzelfde pakket: De CLI komt meestal uit dezelfde pakketbron als PHP-FPM en hoort in de update.
Hoe helpt PHP SOS concreet?
- Versies vergelijken: Wij vergelijken CLI- en webstand en bewijzen welke versie uw website werkelijk uitlevert.
- Cronjobs controleren: Wij sommen alle geplande PHP-taken van alle gebruikers op en koppelen ze aan hun toepassingen.
- Onderhoud beveiligen: Wij verplaatsen onderhoudsscripts uit de webmap en stellen SAPI-controles in.
- Duurzaam begeleiden: In het beveiligingsonderhoudscontract houden wij CLI, web-SAPI en cronjobs gezamenlijk actueel.
Veelgestelde vragen
Toont php -v de versie van mijn website?
Niet per se. php -v toont de versie van de opdrachtregelvariant. De website kan via een andere PHP-FPM-versie of een Apache-module draaien. Voor de website telt de stand van de web-SAPI, die u via de dienst of een kortstondig testbestand vaststelt.
Waarom draaien CLI-scripts onbeperkt lang?
Volgens de PHP-handleiding zet de CLI max_execution_time vast op 0, dus onbeperkt, omdat scripts op de opdrachtregel vaak lange taken uitvoeren. De looptijd kunt u beperken via het script zelf of via hulpmiddelen als timeout.
Mag ik de ingebouwde webserver php -S productief gebruiken?
Nee. De handleiding beschrijft hem als hulpmiddel voor ontwikkeling, niet als volwaardige webserver, en raadt gebruik in openbare netwerken en in productie af. Voor live-systemen horen Apache, Nginx of LiteSpeed met PHP-FPM ervoor.
Is OPcache op de opdrachtregel actief?
Standaard niet. opcache.enable_cli staat volgens de handleiding op 0. Voor korte scripts levert de cache toch weinig op, omdat elke aanroep een nieuw proces is.