Aktuālā situācija: PHP2Shell. Divas kritiskas PHP ievainojamības (CVSS 9.2) ļauj izpildīt ļaunprātīgu kodu bez pieteikšanās. Ielāpi kopš 21.10.2026.Kas jādara tagad →

PHP komandrindā (CLI)

PHP CLI izpilda skriptus bez tīmekļa servera, piemēram, cron uzdevumiem un apkopei. Tā uzvedas citādi nekā tīmekļa versija un bieži nerāda to stāvokli, ko izmanto jūsu vietne.

Aktuāls uz 4 min lasīšanas laiksPHP zināšanas

Īsi: PHP CLI (Command Line Interface) ir PHP variants komandrindai. Tā izpilda skriptus bez tīmekļa servera, piemēram, cron uzdevumiem, Composer vai apkopes uzdevumiem. Tai ir savas noklusējuma vērtības, bieži savs php.ini un dažreiz pat cita versija nekā vietnei. Tāpēc php -v nav drošs pierādījums, ka vietne pēc PHP2Shell ir ielāpota.

Kas ir PHP CLI?

PHP rokasgrāmata min divas PHP galvenās lietošanas jomas: skriptus vietnēm un skriptus komandrindā. Pēdējam ir sava SAPI ar nosaukumu cli. Tai nevajag ne tīmekļa serveri, ne pārlūkprogrammu, tikai PHP interpretatoru. Saskaņā ar rokasgrāmatu tā īpaši piemērota uzdevumiem, kas regulāri darbojas ar Cron Linux sistēmā vai ar uzdevumu plānotāju Windows sistēmā.

Tipiski piemēri uzņēmuma ikdienā: naktī veikti importi veikalā, jaunumu vēstuļu sūtīšana, kešatmiņu tīrīšana, atjauninājumi ar Composer vai CMS komandrindas rīki, piemēram, WP-CLI vai Symfony konsole. Sistēmā Windows fails saucas php.exe, CGI variants php-cgi.exe.

Atšķirībā no PHP-FPM CLI nav pakalpojums. Katrs izsaukums startē jaunu procesu, saskaņā ar rokasgrāmatu konfigurāciju nolasa no jauna un beidzas, kad skripts ir pabeigts. Pārstartēšana pēc atjauninājuma tāpēc nav vajadzīga. Izņēmumi ir ilgi darbojoši procesi, kas startēti caur CLI, piemēram, ietvaru rindu darbprocesi vai dēmoni zem systemd vai Supervisor. Tie dienām ilgi darbojas ar vienreiz ielādēto interpretatoru, un pēc PHP atjauninājuma tie jāpārstartē tāpat kā tīmekļa darbprocesi.

Vadībai un projektu vadītājiem tas nozīmē: arī fona uzdevumi pieder inventāram un katram atjaunināšanas plānam.

Kā CLI atšķiras no tīmekļa versijas?

CLI saskaņā ar rokasgrāmatu dažus iestatījumus pārraksta stingri. Tos nevar mainīt ar php.ini, tikai izpildes laikā ar ini_set():

Direktīva Vērtība CLI Pamatojums saskaņā ar rokasgrāmatu
html_errors izslēgts HTML tagi terminālī traucē
implicit_flush ieslēgts izvadei jāparādās uzreiz
max_execution_time 0 (neierobežots) komandrindas skripti bieži darbojas ilgi
register_argc_argv ieslēgts skripti vienmēr saņem $argc un $argv
output_buffering izslēgts stingri noteikts, buferizācijas funkcijas paliek lietojamas
max_input_time izslēgts CLI nepazīst GET, POST vai augšupielādes

Vēl viena atšķirība: CLI nepāriet uz skripta direktoriju. Kas izsauc php -f ordner/skript.php no /tmp, turpina strādāt /tmp. Relatīvie ceļi cron uzdevumos tāpēc ir bieža kļūdu avots.

Neliels skripts, kam jādarbojas tikai komandrindā:

<?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");

Pārbaude uz PHP_SAPI neļauj apkopes skriptu izraisīt ar pārlūkprogrammu, ja tas kļūdas dēļ atrodas tīmekļa direktorijā. Rokasgrāmata skaidri iesaka SAPI pārbaudīt šādi, nevis paļauties uz $argv esamību.

PHP CLI svarīgākās opcijas

Turpmākās opcijas ņemtas no PHP rokasgrāmatas opciju pārskata un administratoriem ir īpaši noderīgas:

  1. php -v rāda CLI versijas numuru.
  2. php --ini rāda, kuri konfigurācijas faili tiek ielādēti.
  3. php -m uzskaita iekompilētos un ielādētos moduļus.
  4. php -i izsauc phpinfo() un izvada rezultātu kā tekstu.
  5. php -l datei.php pārbauda tikai sintaksi (lint). Kopš PHP 8.3 arī vairākiem failiem uzreiz.
  6. php -r 'code' izpilda kodu tieši, bez <?php.
  7. php -d name=wert šim izsaukumam iestata INI iestatījumu.
  8. php -n pilnībā ignorē php.ini.
  9. php --ri name rāda paplašinājuma konfigurāciju.
php --ini
php -m | grep -i -E "opcache|sodium|pdo"
php --ri session | grep upload_progress
php -l src/Controller.php src/Model.php

Iebūvētais tīmekļa serveris: tikai izstrādei

Ar php -S localhost:8000 CLI startē nelielu tīmekļa serveri. Rokasgrāmatas piemēra izvade kā sākumpunktu min PHP 5.4.0. Rokasgrāmata ir viennozīmīga: serveris kalpo izstrādei, nav pilnvērtīgs tīmekļa serveris, un tam nevajadzētu darboties publiskos tīklos un ražošanā. Ja tas serverī darbojas pastāvīgi un ir sasniedzams no ārpuses, tas ir konstatējums, kas jānovērš.

CLI, Cron un drošība pēc PHP2Shell

Zināmie ziņojumi par PHP2Shell kā skartos darbības režīmus min PHP-FPM, mod_php, php-cgi, FrankenPHP un LiteSpeed. CLI neapstrādā pieprasījumus no tīkla. Drošībai tā tomēr ir svarīga trīs aspektos:

Kā PHP SOS palīdz konkrēti?

  • Salīdzināt versijas: Mēs salīdzinām CLI un tīmekļa stāvokli un pierādām, kuru versiju jūsu vietne patiešām piegādā.
  • Pārbaudīt cron uzdevumus: Mēs uzskaitām visus visu lietotāju ieplānotos PHP uzdevumus un piesaistām tos lietojumprogrammām.
  • Nodrošināt apkopi: Mēs apkopes skriptus pārvietojam ārpus tīmekļa direktorija un ieviešam SAPI pārbaudes.
  • Uzturēt pastāvīgi: Drošības apkopes līgumā mēs CLI, tīmekļa SAPI un cron uzdevumus uzturam aktuālus kopā.

Biežāk uzdotie jautājumi

Vai php -v rāda manas vietnes versiju?

Ne obligāti. php -v rāda komandrindas varianta versiju. Vietne var darboties ar citu PHP-FPM versiju vai Apache moduli. Vietnei svarīgs ir tīmekļa SAPI stāvoklis, ko noskaidrojat caur pakalpojumu vai uz īsu brīdi novietotu pārbaudes failu.

Kāpēc CLI skripti darbojas neierobežoti ilgi?

Saskaņā ar PHP rokasgrāmatu CLI max_execution_time stingri iestata uz 0, tātad neierobežoti, jo komandrindas skripti bieži veic ilgus uzdevumus. Izpildes laiku var ierobežot pats skripts vai tādi rīki kā timeout.

Vai iebūvēto serveri php -S drīkst izmantot ražošanā?

Nē. Rokasgrāmata to raksta kā palīglīdzekli izstrādei, nevis pilnvērtīgu tīmekļa serveri, un atrunā no lietošanas publiskos tīklos un ražošanā. Dzīvajām sistēmām priekšā jābūt Apache, Nginx vai LiteSpeed ar PHP-FPM.

Vai OPcache komandrindā ir aktīvs?

Pēc noklusējuma nē. opcache.enable_cli saskaņā ar rokasgrāmatu ir 0. Īsiem skriptiem kešatmiņa tāpat dod maz, jo katrs izsaukums ir jauns process.

Avoti

Tūlītējs kontakts

Katra stunda ir svarīga. Rakstiet mums tūlīt.

Īsi aprakstiet sistēmu, PHP versiju un novēroto. Mēs sazināsimies, noskaidrosim situāciju un strādāsim attālināti, līdz incidents ir slēgts un dokumentēts.

Tūlītēja palīdzība