Ukratko: PHP CLI (Command Line Interface) je inačica PHP-a za naredbeni redak. Izvršava skripte bez web-poslužitelja, na primjer za cron zadatke, Composer ili zadatke održavanja. Ima vlastite zadane vrijednosti, često vlastiti php.ini, a ponekad čak i drugu verziju od web-stranice. Zato php -v nije pouzdan dokaz da je web-stranica nakon PHP2Shella zakrpana.
Što je PHP CLI?
PHP priručnik navodi dva glavna područja primjene PHP-a: skripte za web-stranice i skripte u naredbenom retku. Za potonje postoji zaseban SAPI naziva cli. Ne treba mu ni web-poslužitelj ni preglednik, samo PHP interpreter. Prema priručniku osobito je prikladan za zadatke koji se redovito izvršavaju putem crona na Linuxu ili planera zadataka na Windowsu.
Tipični primjeri u poslovnoj svakodnevici: noćni uvozi u web-trgovini, slanje newslettera, čišćenje predmemorija, ažuriranja putem Composera ili alati naredbenog retka CMS-ova poput WP-CLI-ja ili Symfony konzole. Pod Windowsom se datoteka zove php.exe, a CGI inačica php-cgi.exe.
Za razliku od PHP-FPM-a, CLI nije usluga. Svaki poziv pokreće novi proces, prema priručniku iznova čita konfiguraciju i završava kad je skripta gotova. Ponovno pokretanje nakon ažuriranja stoga nije potrebno. Iznimke su dugotrajni procesi pokrenuti putem CLI-ja, na primjer workeri redova čekanja frameworka ili daemoni pod systemd-om ili Supervisorom. Oni danima rade s jednom učitanim interpreterom i nakon PHP ažuriranja moraju se ponovno pokrenuti jednako kao web workeri.
Za upravu i voditelje projekata to znači: i pozadinski zadaci pripadaju u inventar i u svaki plan ažuriranja.
Po čemu se CLI razlikuje od web-inačice?
CLI prema priručniku trajno nadjačava neke postavke. One se ne mogu mijenjati putem php.ini, samo tijekom rada putem ini_set():
| Direktiva | Vrijednost u CLI-ju | Obrazloženje prema priručniku |
|---|---|---|
html_errors |
isključeno | HTML oznake smetaju u terminalu |
implicit_flush |
uključeno | ispisi se trebaju pojaviti odmah |
max_execution_time |
0 (neograničeno) | skripte naredbenog retka često rade dugo |
register_argc_argv |
uključeno | skripte uvijek dobivaju $argc i $argv |
output_buffering |
isključeno | čvrsto zadano, funkcije međuspremnika ostaju upotrebljive |
max_input_time |
isključeno | CLI ne poznaje GET, POST ni uploade |
Još jedna razlika: CLI ne prelazi u direktorij skripte. Tko pozove php -f ordner/skript.php iz /tmp, i dalje radi u /tmp. Relativne putanje u cron zadacima zato su česti izvor pogrešaka.
Mala skripta koja smije raditi samo u naredbenom retku:
<?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");
Provjera PHP_SAPI sprječava da se skripta za održavanje pokrene preko preglednika ako se slučajno nađe u web-direktoriju. Priručnik izričito savjetuje da se SAPI provjerava ovako, umjesto oslanjanja na postojanje $argv.
Najvažnije opcije PHP CLI-ja
Sljedeće opcije potječu iz pregleda opcija PHP priručnika i osobito su korisne administratorima:
php -vprikazuje broj verzije CLI-ja.php --iniprikazuje koje se konfiguracijske datoteke učitavaju.php -mispisuje ukompilirane i učitane module.php -ipozivaphpinfo()i ispisuje rezultat kao tekst.php -l datei.phpprovjerava samo sintaksu (lint). Od PHP-a 8.3 i za više datoteka odjednom.php -r 'code'izvršava kod izravno, bez<?php.php -d name=wertpostavlja INI postavku za taj poziv.php -npotpuno zanemaruje php.ini.php --ri nameprikazuje konfiguraciju ekstenzije.
php --ini
php -m | grep -i -E "opcache|sodium|pdo"
php --ri session | grep upload_progress
php -l src/Controller.php src/Model.php
Ugrađeni web-poslužitelj: samo za razvoj
Pomoću php -S localhost:8000 CLI pokreće mali web-poslužitelj. Primjer ispisa u priručniku kao polazište navodi PHP 5.4.0. Priručnik je jasan: poslužitelj služi razvoju, nije potpun web-poslužitelj, ne smije raditi u javnim mrežama ni u produkciji. Ako na poslužitelju trajno radi i dostupan je izvana, to je nalaz koji biste trebali ukloniti.
CLI, cron i sigurnost nakon PHP2Shella
Poznate objave o PHP2Shellu kao pogođene načine rada navode PHP-FPM, mod_php, php-cgi, FrankenPHP i LiteSpeed. CLI ne obrađuje zahtjeve iz mreže. Za sigurnost je ipak važan u tri pogleda:
- Pogrešan dokaz:
php -vprikazuje verziju CLI-ja. Web-stranica može koristiti drugu verziju, a backportovi distribucija često ne mijenjaju prikazani broj. Kako ispravno dokazati stanje, piše na stranici Provjera PHP verzije i razine zakrpa i u članku Zašto php -v prikazuje isti broj. - Postojanost putem crona: Napadači nakon provale rado koriste cron zadatke koji redovito pokreću PHP skriptu. Napomene o traženju daje članak Prepoznati skrivene cron zadatke kao zadnja vrata.
- Isti paket: CLI najčešće potječe iz istog izvora paketa kao PHP-FPM i pripada u ažuriranje.
Kako PHP SOS konkretno pomaže?
- Uskladiti verzije: Uspoređujemo stanje CLI-ja i weba te dokazujemo koju verziju Vaša web-stranica stvarno isporučuje.
- Provjeriti cron zadatke: Popisujemo sve planirane PHP zadatke svih korisnika i pridružujemo ih njihovim aplikacijama.
- Osigurati održavanje: Skripte za održavanje premještamo iz web-direktorija i postavljamo SAPI provjere.
- Trajno skrbiti: U ugovoru o sigurnosnom održavanju zajedno održavamo ažurnima CLI, web SAPI i cron zadatke.
Česta pitanja
Prikazuje li php -v verziju moje web-stranice?
Ne nužno. php -v prikazuje verziju inačice za naredbeni redak. Web-stranica može raditi putem druge verzije PHP-FPM-a ili Apache modula. Za web-stranicu je važno stanje web SAPI-ja, koje utvrđujete putem usluge ili kratkotrajne probne datoteke.
Zašto CLI skripte rade neograničeno dugo?
Prema PHP priručniku CLI trajno postavlja max_execution_time na 0, dakle neograničeno, jer skripte u naredbenom retku često obavljaju dugotrajne zadatke. Trajanje se može ograničiti samom skriptom ili alatima poput timeout.
Smijem li ugrađeni web-poslužitelj php -S koristiti u produkciji?
Ne. Priručnik ga opisuje kao pomoć pri razvoju, a ne kao potpun web-poslužitelj, te odvraća od uporabe u javnim mrežama i u produkciji. Za žive sustave ispred PHP-FPM-a pripadaju Apache, Nginx ili LiteSpeed.
Je li OPcache u naredbenom retku aktivan?
Prema zadanim postavkama nije. opcache.enable_cli prema priručniku iznosi 0. Za kratke skripte predmemorija ionako malo donosi jer je svaki poziv novi proces.