Trenutno stanje: PHP2Shell. Dve kritični ranljivosti PHP (CVSS 9,2) omogočata izvedbo škodljive kode brez prijave. Popravki od 21. 10. 2026.Kaj je zdaj treba storiti →

PHP v ukazni vrstici (CLI)

PHP CLI izvaja skripte brez spletnega strežnika, na primer za cron opravila in vzdrževanje. Obnaša se drugače kot spletna različica in pogosto ne kaže stanja, ki ga uporablja vaša spletna stran.

Stanje 4 min branjaZnanje o PHP

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:

  1. php -v prikaže številko različice CLI.
  2. php --ini prikaže, katere konfiguracijske datoteke se naložijo.
  3. php -m našteje prevedene in naložene module.
  4. php -i pokliče phpinfo() in rezultat izpiše kot besedilo.
  5. php -l datei.php preveri samo sintakso (lint). Od PHP 8.3 tudi za več datotek naenkrat.
  6. php -r 'code' kodo izvede neposredno, brez <?php.
  7. php -d name=wert za ta klic nastavi nastavitev INI.
  8. php -n php.ini v celoti prezre.
  9. php --ri name prikaž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:

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.

Viri

Takojšnji stik

Vsaka ura šteje. Pišite nam zdaj.

Na kratko opišite sistem, različico PHP in opažanje. Odzovemo se, razjasnimo stanje in delamo na daljavo, dokler incident ni zaključen in dokumentiran.

Takojšnja pomoč