Kort sagt: PHP CLI (Command Line Interface) är den variant av PHP som används på kommandoraden. Den kör skript utan webbserver, till exempel för cronjobb, Composer eller underhållsuppgifter. Den har egna standardvärden, ofta en egen php.ini och ibland till och med en annan version än webbplatsen. Därför är php -v inget tillförlitligt bevis för att webbplatsen är patchad efter PHP2Shell.
Vad är PHP CLI?
PHP-manualen nämner två huvudsakliga användningsområden för PHP: skript för webbplatser och skript på kommandoraden. För det senare finns ett eget SAPI med namnet cli. Det behöver varken webbserver eller webbläsare, bara PHP-tolken. Enligt manualen lämpar det sig särskilt för uppgifter som regelbundet körs via cron under Linux eller via schemaläggaren under Windows.
Typiska exempel i företagsvardagen: nattliga importer i webbutiken, utskick av nyhetsbrev, rensning av cachar, uppdateringar via Composer eller kommandoradsverktygen i CMS som WP-CLI eller Symfony-konsolen. Under Windows heter filen php.exe, CGI-varianten php-cgi.exe.
Till skillnad från PHP-FPM är CLI ingen tjänst. Varje anrop startar en ny process, läser enligt manualen in konfigurationen på nytt och avslutas när skriptet är klart. En omstart efter en uppdatering behövs därför inte. Undantag är långkörande processer som startas via CLI, till exempel kö-workers från ramverk eller daemoner under systemd eller Supervisor. De körs i dagar med den en gång laddade tolken och måste startas om efter en PHP-uppdatering precis som webb-workers.
För ledning och projektledning betyder det: Även bakgrundsuppgifter hör hemma i inventeringen och i varje uppdateringsplan.
Hur skiljer sig CLI från webbversionen?
CLI skriver enligt manualen över vissa inställningar fast. De går inte att ändra via php.ini, bara vid körning med ini_set():
| Direktiv | Värde i CLI | Motivering enligt manualen |
|---|---|---|
html_errors |
av | HTML-taggar stör i terminalen |
implicit_flush |
på | utdata ska visas direkt |
max_execution_time |
0 (obegränsat) | kommandoradsskript körs ofta länge |
register_argc_argv |
på | skript får alltid $argc och $argv |
output_buffering |
av | fast inbyggt, buffertfunktioner kan fortfarande användas |
max_input_time |
av | CLI känner inte till GET, POST eller uppladdningar |
En annan skillnad: CLI byter inte till skriptets katalog. Den som anropar php -f ordner/skript.php från /tmp fortsätter att arbeta i /tmp. Relativa sökvägar i cronjobb är därför en vanlig felkälla.
Ett litet skript som bara ska köras på kommandoraden:
<?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");
Kontrollen av PHP_SAPI förhindrar att ett underhållsskript utlöses via webbläsaren om det av misstag ligger i webbkatalogen. Manualen rekommenderar uttryckligen att kontrollera SAPI på det här sättet i stället för att förlita sig på att $argv finns.
De viktigaste alternativen i PHP CLI
Följande alternativ kommer från alternativöversikten i PHP-manualen och är särskilt användbara för administratörer:
php -vvisar CLI:s versionsnummer.php --inivisar vilka konfigurationsfiler som laddas.php -mlistar de inkompilerade och laddade modulerna.php -ianroparphpinfo()och skriver ut resultatet som text.php -l datei.phpkontrollerar bara syntaxen (lint). Sedan PHP 8.3 även för flera filer samtidigt.php -r 'code'kör kod direkt, utan<?php.php -d name=wertsätter en INI-inställning för det här anropet.php -nignorerar php.ini helt.php --ri namevisar konfigurationen för ett tillägg.
php --ini
php -m | grep -i -E "opcache|sodium|pdo"
php --ri session | grep upload_progress
php -l src/Controller.php src/Model.php
Den inbyggda webbservern: bara för utveckling
Med php -S localhost:8000 startar CLI en liten webbserver. Exempelutskriften i manualen anger PHP 5.4.0 som utgångspunkt. Manualen är tydlig: Servern är till för utveckling, är ingen fullvärdig webbserver och ska inte köras i offentliga nät eller i produktion. Om den körs permanent på en server och är nåbar utifrån är det ett fynd som ni bör åtgärda.
CLI, cron och säkerhet efter PHP2Shell
De kända rapporterna om PHP2Shell nämner PHP-FPM, mod_php, php-cgi, FrankenPHP och LiteSpeed som berörda driftlägen. CLI bearbetar inga förfrågningar från nätet. För säkerheten är den ändå viktig i tre avseenden:
- Felaktigt bevis:
php -vvisar CLI-versionen. Webbplatsen kan använda en annan version, och distributionernas backports ändrar ofta inte det visade numret. Hur ni styrker läget på rätt sätt står under Kontrollera PHP-version och patchnivå och i artikeln Varför php -v visar samma nummer. - Beständighet via cron: Angripare använder efter ett intrång gärna cronjobb som regelbundet startar ett PHP-skript. Tips för sökningen ger Upptäcka dolda cronjobb som bakdörr.
- Samma paket: CLI kommer oftast från samma paketkälla som PHP-FPM och hör med i uppdateringen.
Hur hjälper PHP SOS konkret?
- Jämföra versioner: Vi jämför CLI- och webbläge och styrker vilken version er webbplats faktiskt levererar.
- Granska cronjobb: Vi listar alla schemalagda PHP-uppgifter för alla användare och kopplar dem till deras applikationer.
- Säkra underhållet: Vi flyttar underhållsskript ut ur webbkatalogen och inför SAPI-kontroller.
- Sköta löpande: Inom säkerhetsunderhållsavtalet håller vi CLI, webb-SAPI och cronjobb aktuella tillsammans.
Vanliga frågor
Visar php -v versionen för min webbplats?
Inte nödvändigtvis. php -v visar versionen för kommandoradsvarianten. Webbplatsen kan köras via en annan PHP-FPM-version eller en Apache-modul. För webbplatsen räknas webb-SAPI:ts läge, som ni tar reda på via tjänsten eller en kortvarig kontrollfil.
Varför körs CLI-skript obegränsat länge?
Enligt PHP-manualen sätter CLI max_execution_time fast till 0, alltså obegränsat, eftersom skript på kommandoraden ofta utför långa uppgifter. Körtiden kan begränsas via skriptet självt eller med verktyg som timeout.
Får jag använda den inbyggda webbservern php -S i produktion?
Nej. Manualen beskriver den som ett hjälpmedel för utveckling, inte som en fullvärdig webbserver, och avråder från användning i offentliga nät och i produktion. För livesystem hör Apache, Nginx eller LiteSpeed med PHP-FPM framför.
Är OPcache aktiv på kommandoraden?
Som standard inte. opcache.enable_cli står enligt manualen på 0. För korta skript ger cachen ändå lite, eftersom varje anrop är en ny process.