Dabartinė padėtis: PHP2Shell. Du kritiniai PHP pažeidžiamumai (CVSS 9,2) leidžia vykdyti kenkėjišką kodą be prisijungimo. Pataisos nuo 2026-10-21.Ką dabar daryti →

PHP komandinėje eilutėje (CLI)

PHP CLI vykdo skriptus be žiniatinklio serverio, pavyzdžiui, cron užduotims ir priežiūrai. Ji elgiasi kitaip nei žiniatinklio versija ir dažnai nerodo būsenos, kurią naudoja jūsų svetainė.

Būsena 4 min. skaitymoPHP žinios

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:

  1. php -v rodo CLI versijos numerį.
  2. php --ini rodo, kurie konfigūracijos failai įkeliami.
  3. php -m išvardija sukompiliuotus ir įkeltus modulius.
  4. php -i iškviečia phpinfo() ir rezultatą išveda kaip tekstą.
  5. php -l datei.php tikrina tik sintaksę (lint). Nuo PHP 8.3 ir keliems failams iš karto.
  6. php -r 'code' vykdo kodą tiesiogiai, be <?php.
  7. php -d name=wert nustato INI nustatymą šiam iškvietimui.
  8. php -n visiškai ignoruoja php.ini.
  9. php --ri name rodo 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:

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.

Šaltiniai

Skubus kontaktas

Kiekviena valanda svarbi. Parašykite mums dabar.

Trumpai aprašykite sistemą, PHP versiją ir pastebėjimus. Mes atsakysime, išsiaiškinsime padėtį ir dirbsime nuotoliu, kol incidentas bus užbaigtas ir dokumentuotas.

Skubi pagalba