Trumpai: PHP CLI (Command Line Interface) yra PHP variantas komandinei eilutei. Ji vykdo skriptus be žiniatinklio serverio, pavyzdžiui, cron užduotims, Composer ar priežiūros užduotims. Ji turi savas numatytąsias reikšmes, dažnai savą php.ini ir kartais net kitokią versiją nei svetainė. Todėl php -v nėra patikimas įrodymas, kad svetainė po PHP2Shell pataisyta.
Kas yra PHP CLI?
PHP vadove nurodytos dvi pagrindinės PHP taikymo sritys: skriptai svetainėms ir skriptai komandinėje eilutėje. Pastarajam skirta atskira SAPI, vadinama cli. Jai nereikia nei žiniatinklio serverio, nei naršyklės, tik PHP interpretatoriaus. Pasak vadovo, ji ypač tinka užduotims, kurios reguliariai vykdomos per cron sistemoje Linux arba per užduočių planuoklį sistemoje Windows.
Tipiniai pavyzdžiai įmonės kasdienybėje: naktiniai importai parduotuvėje, naujienlaiškių siuntimas, talpyklų valymas, atnaujinimai per Composer arba CMS komandinės eilutės įrankiai, tokie kaip WP-CLI ar Symfony konsolė. Sistemoje Windows failas vadinasi php.exe, o CGI variantas php-cgi.exe.
Skirtingai nei PHP-FPM, CLI nėra tarnyba. Kiekvienas iškvietimas paleidžia naują procesą, pasak vadovo, iš naujo nuskaito konfigūraciją ir baigiasi, kai skriptas įvykdytas. Todėl po atnaujinimo paleisti iš naujo nereikia. Išimtys yra ilgai veikiantys procesai, paleisti per CLI, pavyzdžiui, karkasų eilių darbiniai procesai ar demonai (daemon) su systemd arba Supervisor. Jie dienų dienas veikia su vieną kartą įkeltu interpretatoriumi ir po PHP atnaujinimo turi būti paleisti iš naujo lygiai taip pat kaip žiniatinklio darbiniai procesai.
Vadovybei ir projektų vadovams tai reiškia: ir fono užduotys priklauso inventoriui bei kiekvienam atnaujinimo planui.
Kuo CLI skiriasi nuo žiniatinklio versijos?
Pasak vadovo, CLI kai kuriuos nustatymus perrašo fiksuotai. Jų negalima pakeisti per php.ini, tik vykdymo metu per ini_set():
| Direktyva | Reikšmė CLI | Pagrindimas pagal vadovą |
|---|---|---|
html_errors |
išjungta | HTML žymės trukdo terminale |
implicit_flush |
įjungta | išvestis turi pasirodyti iškart |
max_execution_time |
0 (neribota) | komandinės eilutės skriptai dažnai veikia ilgai |
register_argc_argv |
įjungta | skriptai visada gauna $argc ir $argv |
output_buffering |
išjungta | užkoduota fiksuotai, buferio funkcijos lieka naudojamos |
max_input_time |
išjungta | CLI nepažįsta GET, POST ar įkėlimų |
Dar vienas skirtumas: CLI nekeičia katalogo į skripto katalogą. Kas iš /tmp iškviečia php -f ordner/skript.php, toliau dirba /tmp. Todėl santykiniai keliai cron užduotyse yra dažnas klaidų šaltinis.
Mažas skriptas, kuris turi veikti tik komandinėje eilutėje:
<?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");
PHP_SAPI patikra neleidžia priežiūros skripto paleisti per naršyklę, jei jis netyčia atsidurtų žiniatinklio kataloge. Vadovas aiškiai pataria SAPI tikrinti taip, o ne pasikliauti $argv buvimu.
Svarbiausios PHP CLI parinktys
Toliau pateiktos parinktys paimtos iš PHP vadovo parinkčių apžvalgos ir yra ypač naudingos administratoriams:
php -vrodo CLI versijos numerį.php --inirodo, kurie konfigūracijos failai įkeliami.php -mišvardija sukompiliuotus ir įkeltus modulius.php -iiškviečiaphpinfo()ir rezultatą išveda kaip tekstą.php -l datei.phptikrina tik sintaksę (lint). Nuo PHP 8.3 ir keliems failams iš karto.php -r 'code'vykdo kodą tiesiogiai, be<?php.php -d name=wertnustato INI nustatymą šiam iškvietimui.php -nvisiškai ignoruoja php.ini.php --ri namerodo plėtinio konfigūraciją.
php --ini
php -m | grep -i -E "opcache|sodium|pdo"
php --ri session | grep upload_progress
php -l src/Controller.php src/Model.php
Įtaisytasis žiniatinklio serveris: tik kūrimui
Su php -S localhost:8000 CLI paleidžia mažą žiniatinklio serverį. Vadovo pavyzdinėje išvestyje kaip atspirties taškas nurodytas PHP 5.4.0. Vadovas aiškus: serveris skirtas kūrimui, nėra visavertis žiniatinklio serveris ir neturi veikti viešuose tinkluose bei gamyboje. Jei jis serveryje veikia nuolat ir yra pasiekiamas iš išorės, tai radinys, kurį reikėtų pašalinti.
CLI, cron ir saugumas po PHP2Shell
Žinomuose PHP2Shell pranešimuose kaip paveikti veikimo režimai minimi PHP-FPM, mod_php, php-cgi, FrankenPHP ir LiteSpeed. CLI neapdoroja užklausų iš tinklo. Saugumui ji vis tiek svarbi trimis požiūriais:
- Klaidingas įrodymas:
php -vrodo CLI versiją. Svetainė gali naudoti kitą versiją, o distribucijų backport rodomo numerio dažnai nepakeičia. Kaip teisingai įrodyti būseną, aprašyta skyriuje PHP versijos ir pataisų būsenos patikra ir straipsnyje Kodėl php -v rodo tą patį numerį. - Išlikimas per cron: po įsilaužimo užpuolikai mėgsta naudoti cron užduotis, kurios reguliariai paleidžia PHP skriptą. Paieškos patarimai pateikti straipsnyje Paslėptų cron užduočių kaip užpakalinių durų atpažinimas.
- Tas pats paketas: CLI dažniausiai ateina iš to paties paketų šaltinio kaip PHP-FPM ir priklauso atnaujinimui.
Kaip PHP SOS padeda konkrečiai?
- Versijų palyginimas: lyginame CLI ir žiniatinklio būseną ir įrodome, kurią versiją jūsų svetainė iš tikrųjų teikia.
- Cron užduočių patikra: išvardijame visas visų naudotojų suplanuotas PHP užduotis ir priskiriame jas programoms.
- Priežiūros apsauga: priežiūros skriptus perkeliame iš žiniatinklio katalogo ir nustatome SAPI patikras.
- Nuolatinė priežiūra: saugumo priežiūros sutartyje CLI, žiniatinklio SAPI ir cron užduotis laikome atnaujintas kartu.
Dažni klausimai
Ar php -v rodo mano svetainės versiją?
Nebūtinai. php -v rodo komandinės eilutės varianto versiją. Svetainė gali veikti su kita PHP-FPM versija arba Apache moduliu. Svetainei svarbi žiniatinklio SAPI būsena, kurią nustatote per tarnybą arba trumpam patalpintą patikros failą.
Kodėl CLI skriptai veikia neribotai ilgai?
Pasak PHP vadovo, CLI max_execution_time nustato fiksuotai 0, t. y. neribota, nes skriptai komandinėje eilutėje dažnai atlieka ilgas užduotis. Vykdymo laiką galima apriboti pačiu skriptu arba įrankiais, tokiais kaip timeout.
Ar galima gamyboje naudoti įtaisytąjį serverį php -S?
Ne. Vadovas jį apibūdina kaip pagalbą kūrimui, o ne visavertį žiniatinklio serverį, ir atkalba jį naudoti viešuose tinkluose bei gamyboje. Gyvoms sistemoms prieš jį turi būti Apache, Nginx ar LiteSpeed su PHP-FPM.
Ar OPcache aktyvi komandinėje eilutėje?
Pagal numatymą ne. Pasak vadovo, opcache.enable_cli yra 0. Trumpiems skriptams talpykla vis tiek mažai duoda, nes kiekvienas iškvietimas yra naujas procesas.