Situația actuală: PHP2Shell. Două vulnerabilități critice PHP (CVSS 9.2) permit cod malițios fără autentificare. Patchuri din 21.10.2026.Ce este de făcut acum →

PHP în linia de comandă (CLI)

PHP CLI execută scripturi fără server web, de exemplu pentru cronjob-uri și mentenanță. Se comportă diferit de versiunea web și adesea nu arată starea pe care o folosește site-ul dumneavoastră.

Stadiu 5 min de cititCunoștințe PHP

Pe scurt: PHP CLI (Command Line Interface) este varianta PHP pentru linia de comandă. Execută scripturi fără server web, de exemplu pentru cronjob-uri, Composer sau sarcini de mentenanță. Are valori implicite proprii, adesea un php.ini propriu și uneori chiar o altă versiune decât site-ul. De aceea, php -v nu este o dovadă de încredere că site-ul este corectat după PHP2Shell.

Ce este PHP CLI?

Manualul PHP menționează două domenii principale de utilizare ale PHP: scripturi pentru site-uri web și scripturi în linia de comandă. Pentru cele din urmă există un SAPI propriu, numit cli. Nu are nevoie nici de server web, nici de browser, doar de interpretorul PHP. Potrivit manualului, este potrivit mai ales pentru sarcini care rulează periodic prin Cron sub Linux sau prin planificatorul de sarcini sub Windows.

Exemple tipice din activitatea zilnică a unei companii: importuri nocturne în magazin, trimiterea de newslettere, curățarea cache-urilor, actualizări prin Composer sau instrumentele din linia de comandă ale CMS-urilor, precum WP-CLI sau consola Symfony. Sub Windows, fișierul se numește php.exe, varianta CGI php-cgi.exe.

Spre deosebire de PHP-FPM, CLI nu este un serviciu. Fiecare apel pornește un proces nou, citește din nou configurația, potrivit manualului, și se încheie când scriptul este gata. O repornire după o actualizare nu este deci necesară. Excepție fac procesele de lungă durată pornite prin CLI, de exemplu workerii de cozi ai framework-urilor sau daemonii sub systemd ori Supervisor. Ei rulează zile întregi cu interpretorul încărcat o dată și trebuie reporniți după o actualizare PHP exact ca workerii web.

Pentru conducere și managementul de proiect asta înseamnă: și sarcinile din fundal aparțin inventarului și fiecărui plan de actualizare.

Prin ce diferă CLI de versiunea web?

Potrivit manualului, CLI suprascrie fix unele setări. Ele nu pot fi modificate prin php.ini, ci doar în timpul execuției prin ini_set():

Directivă Valoare în CLI Motivare potrivit manualului
html_errors oprit tagurile HTML deranjează în terminal
implicit_flush pornit ieșirile trebuie să apară imediat
max_execution_time 0 (nelimitat) scripturile din linia de comandă rulează adesea mult
register_argc_argv pornit scripturile primesc mereu $argc și $argv
output_buffering oprit fixat, funcțiile de buffering rămân utilizabile
max_input_time oprit CLI nu cunoaște GET, POST sau upload-uri

O altă diferență: CLI nu trece în directorul scriptului. Cine apelează php -f ordner/skript.php din /tmp continuă să lucreze în /tmp. Căile relative din cronjob-uri sunt de aceea o sursă frecventă de erori.

Un script mic, care trebuie să ruleze doar în linia de comandă:

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

Verificarea PHP_SAPI împiedică declanșarea unui script de mentenanță prin browser, dacă se află din greșeală în directorul web. Manualul recomandă explicit verificarea SAPI în acest mod, în loc de a te baza pe existența $argv.

Cele mai importante opțiuni ale PHP CLI

Opțiunile următoare provin din prezentarea opțiunilor din manualul PHP și sunt deosebit de utile pentru administratori:

  1. php -v arată numărul versiunii CLI.
  2. php --ini arată ce fișiere de configurare sunt încărcate.
  3. php -m listează modulele compilate și încărcate.
  4. php -i apelează phpinfo() și afișează rezultatul ca text.
  5. php -l datei.php verifică doar sintaxa (lint). Din PHP 8.3, și pentru mai multe fișiere deodată.
  6. php -r 'code' execută cod direct, fără <?php.
  7. php -d name=wert setează o opțiune INI pentru acest apel.
  8. php -n ignoră complet php.ini.
  9. php --ri name arată configurația unei extensii.
php --ini
php -m | grep -i -E "opcache|sodium|pdo"
php --ri session | grep upload_progress
php -l src/Controller.php src/Model.php

Serverul web integrat: doar pentru dezvoltare

Cu php -S localhost:8000, CLI pornește un server web mic. Exemplul de ieșire din manual indică PHP 5.4.0 ca punct de plecare. Manualul este clar: serverul servește dezvoltării, nu este un server web complet și nu trebuie să ruleze în rețele publice și nici în producție. Dacă rulează permanent pe un server și este accesibil din exterior, este o constatare pe care ar trebui să o remediați.

CLI, Cron și securitatea după PHP2Shell

Rapoartele cunoscute despre PHP2Shell menționează PHP-FPM, mod_php, php-cgi, FrankenPHP și LiteSpeed ca moduri de operare afectate. CLI nu procesează cereri din rețea. Pentru securitate este totuși importantă sub trei aspecte:

Cum ajută PHP SOS concret?

  • Corelarea versiunilor: Comparăm starea CLI cu cea web și dovedim ce versiune livrează de fapt site-ul dumneavoastră.
  • Verificarea cronjob-urilor: Listăm toate sarcinile PHP programate ale tuturor utilizatorilor și le atribuim aplicațiilor lor.
  • Securizarea mentenanței: Mutăm scripturile de mentenanță din directorul web și adăugăm verificări SAPI.
  • Asistență continuă: În contractul de mentenanță de securitate menținem la zi împreună CLI, SAPI-ul web și cronjob-urile.

Întrebări frecvente

Arată php -v versiunea site-ului meu?

Nu neapărat. php -v arată versiunea variantei pentru linia de comandă. Site-ul poate rula printr-o altă versiune PHP-FPM sau printr-un modul Apache. Pentru site contează starea SAPI-ului web, pe care o aflați prin serviciu sau printr-un fișier de verificare temporar.

De ce rulează scripturile CLI nelimitat?

Potrivit manualului PHP, CLI setează fix max_execution_time la 0, adică nelimitat, deoarece scripturile din linia de comandă îndeplinesc adesea sarcini lungi. Durata poate fi limitată prin script însuși sau prin instrumente precum timeout.

Pot folosi serverul web integrat php -S în producție?

Nu. Manualul îl descrie ca ajutor pentru dezvoltare, nu ca server web complet, și descurajează utilizarea în rețele publice și în producție. Pentru sistemele live este nevoie de Apache, Nginx sau LiteSpeed cu PHP-FPM în față.

Este OPcache activ în linia de comandă?

Implicit nu. Potrivit manualului, opcache.enable_cli este 0. Pentru scripturi scurte, cache-ul aduce oricum puțin, deoarece fiecare apel este un proces nou.

Surse

Contact imediat

Fiecare oră contează. Scrieți-ne acum.

Descrieți pe scurt sistemul, versiunea PHP și ce ați observat. Ne vom face auziți, clarificăm situația și lucrăm la distanță până când incidentul este încheiat și documentat.

Ajutor imediat