Trenutno stanje: PHP2Shell. Dvije kritične PHP ranjivosti (CVSS 9.2) omogućuju zlonamjerni kod bez prijave. Zakrpe od 21. 10. 2026.Što sada učiniti →

PHP u naredbenom retku (CLI)

PHP CLI izvršava skripte bez web-poslužitelja, na primjer za cron zadatke i održavanje. Ponaša se drukčije od web-inačice i često ne prikazuje stanje koje koristi Vaša web-stranica.

Stanje 4 min čitanjaPHP znanje

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:

  1. php -v prikazuje broj verzije CLI-ja.
  2. php --ini prikazuje koje se konfiguracijske datoteke učitavaju.
  3. php -m ispisuje ukompilirane i učitane module.
  4. php -i poziva phpinfo() i ispisuje rezultat kao tekst.
  5. php -l datei.php provjerava samo sintaksu (lint). Od PHP-a 8.3 i za više datoteka odjednom.
  6. php -r 'code' izvršava kod izravno, bez <?php.
  7. php -d name=wert postavlja INI postavku za taj poziv.
  8. php -n potpuno zanemaruje php.ini.
  9. php --ri name prikazuje 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:

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.

Izvori

Hitni kontakt

Svaki sat se računa. Pišite nam odmah.

Ukratko opišite sustav, verziju PHP-a i opažanje. Javit ćemo Vam se, razjasniti situaciju i raditi na daljinu dok incident nije zaključen i dokumentiran.

Hitna pomoć