Na kratko: PHP CLI (Command Line Interface) je različica PHP za ukazno vrstico. Skripte izvaja brez spletnega strežnika, na primer za cron opravila, Composer ali vzdrževalne naloge. Ima lastne privzete vrednosti, pogosto lastno php.ini in včasih celo drugo različico kot spletna stran. Zato php -v ni zanesljiv dokaz, da je spletna stran po PHP2Shell popravljena.
Kaj je PHP CLI?
Priročnik PHP navaja dve glavni področji uporabe PHP: skripte za spletne strani in skripte v ukazni vrstici. Za slednje obstaja lasten SAPI z imenom cli. Ne potrebuje ne spletnega strežnika ne brskalnika, samo interpreter PHP. Po priročniku je posebej primeren za naloge, ki se redno izvajajo prek crona v Linuxu ali načrtovalnika opravil v sistemu Windows.
Značilni primeri v podjetju: nočni uvozi v spletni trgovini, pošiljanje novic, čiščenje predpomnilnikov, posodobitve prek Composerja ali ukazna orodja CMS-jev, kot sta WP-CLI ali konzola Symfony. V sistemu Windows se datoteka imenuje php.exe, različica CGI php-cgi.exe.
Za razliko od PHP-FPM CLI ni storitev. Vsak klic zažene nov proces, po priročniku konfiguracijo prebere znova in se konča, ko je skripta končana. Ponovni zagon po posodobitvi zato ni potreben. Izjeme so dolgo tekoči procesi, zagnani prek CLI, na primer workerji čakalnih vrst ogrodij ali daemoni pod systemd ali Supervisor. Ti tečejo dneve z enkrat naloženim interpreterjem in jih je treba po posodobitvi PHP znova zagnati prav tako kot spletne workerje.
Za vodstvo in vodstvo projektov to pomeni: tudi naloge v ozadju sodijo v popis in v vsak načrt posodobitev.
Kako se CLI razlikuje od spletne različice?
CLI po priročniku nekatere nastavitve trdno prepiše. Prek php.ini jih ni mogoče spremeniti, samo med izvajanjem z ini_set():
| Direktiva | Vrednost v CLI | Utemeljitev po priročniku |
|---|---|---|
html_errors |
izklopljeno | oznake HTML motijo v terminalu |
implicit_flush |
vklopljeno | izpisi naj se pojavijo takoj |
max_execution_time |
0 (neomejeno) | skripte v ukazni vrstici pogosto tečejo dolgo |
register_argc_argv |
vklopljeno | skripte vedno prejmejo $argc in $argv |
output_buffering |
izklopljeno | trdno določeno, funkcije medpomnjenja ostanejo uporabne |
max_input_time |
izklopljeno | CLI ne pozna GET, POST ali nalaganj |
Še ena razlika: CLI ne preklopi v imenik skripte. Kdor pokliče php -f ordner/skript.php iz /tmp, dela naprej v /tmp. Relativne poti v cron opravilih so zato pogost vir napak.
Majhna skripta, ki naj teče samo v ukazni vrstici:
<?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");
Preverjanje PHP_SAPI preprečuje, da bi se vzdrževalna skripta sprožila prek brskalnika, če bi po nesreči ležala v spletnem imeniku. Priročnik izrecno svetuje, da se SAPI preverja tako, namesto da bi se zanesli na obstoj $argv.
Najpomembnejše možnosti PHP CLI
Naslednje možnosti izvirajo iz pregleda možnosti v priročniku PHP in so za skrbnike posebej koristne:
php -vprikaže številko različice CLI.php --iniprikaže, katere konfiguracijske datoteke se naložijo.php -mnašteje prevedene in naložene module.php -ipokličephpinfo()in rezultat izpiše kot besedilo.php -l datei.phppreveri samo sintakso (lint). Od PHP 8.3 tudi za več datotek naenkrat.php -r 'code'kodo izvede neposredno, brez<?php.php -d name=wertza ta klic nastavi nastavitev INI.php -nphp.ini v celoti prezre.php --ri nameprikaže konfiguracijo razširitve.
php --ini
php -m | grep -i -E "opcache|sodium|pdo"
php --ri session | grep upload_progress
php -l src/Controller.php src/Model.php
Vgrajeni spletni strežnik: samo za razvoj
S php -S localhost:8000 CLI zažene majhen spletni strežnik. Primer izpisa v priročniku kot izhodišče navaja PHP 5.4.0. Priročnik je jasen: strežnik je namenjen razvoju, ni polnovreden spletni strežnik in ne sme teči v javnih omrežjih ne v produkciji. Če na strežniku teče trajno in je dosegljiv od zunaj, je to ugotovitev, ki jo morate odpraviti.
CLI, cron in varnost po PHP2Shell
Znana poročila o PHP2Shell kot prizadete načine delovanja navajajo PHP-FPM, mod_php, php-cgi, FrankenPHP in LiteSpeed. CLI ne obdeluje zahtev iz omrežja. Za varnost je kljub temu pomemben v treh pogledih:
- Napačen dokaz:
php -vprikaže različico CLI. Spletna stran lahko uporablja drugo različico, backporti distribucij pa prikazane številke pogosto ne spremenijo. Kako stanje pravilno dokažete, piše na strani Preverjanje različice PHP in stanja popravkov in v prispevku Zakaj php -v kaže isto številko. - Obstojnost prek crona: napadalci po vdoru radi uporabljajo cron opravila, ki redno zaženejo skripto PHP. Namige za iskanje daje Prepoznavanje skritih cron opravil kot stranskih vrat.
- Isti paket: CLI praviloma izvira iz istega vira paketov kot PHP-FPM in sodi v posodobitev.
Kako PHP SOS pomaga konkretno?
- Usklajevanje različic: primerjamo stanje CLI in spleta ter dokažemo, katero različico vaša spletna stran dejansko streže.
- Preverjanje cron opravil: naštejemo vse načrtovane naloge PHP vseh uporabnikov in jih uvrstimo k njihovim aplikacijam.
- Zavarovanje vzdrževanja: vzdrževalne skripte prestavimo iz spletnega imenika in nastavimo preverjanja SAPI.
- Trajna oskrba: v varnostni vzdrževalni pogodbi CLI, spletni SAPI in cron opravila posodabljamo skupaj.
Pogosta vprašanja
Ali php -v prikaže različico moje spletne strani?
Ne nujno. php -v prikaže različico izvedbe za ukazno vrstico. Spletna stran lahko teče prek druge različice PHP-FPM ali modula Apache. Za spletno stran šteje stanje spletnega SAPI, ki ga ugotovite prek storitve ali kratek čas odložene preizkusne datoteke.
Zakaj skripte CLI tečejo neomejeno dolgo?
Po priročniku PHP CLI max_execution_time trdno nastavi na 0, torej neomejeno, ker skripte v ukazni vrstici pogosto opravljajo dolge naloge. Čas izvajanja je mogoče omejiti v skripti sami ali z orodji, kot je timeout.
Ali smem vgrajeni spletni strežnik php -S uporabljati produktivno?
Ne. Priročnik ga opisuje kot pripomoček za razvoj, ne kot polnovreden spletni strežnik, in odsvetuje uporabo v javnih omrežjih in v produkciji. Pred živimi sistemi naj stojijo Apache, Nginx ali LiteSpeed s PHP-FPM.
Ali je OPcache v ukazni vrstici aktiven?
Privzeto ne. opcache.enable_cli je po priročniku na 0. Pri kratkih skriptah predpomnilnik tako ali tako prinese malo, ker je vsak klic nov proces.