# PHP în linia de comandă (CLI)

> PHP CLI explicat: diferențe față de versiunea web, opțiuni precum -l, -m și --ini, cronjob-uri, serverul web integrat și de ce php -v înșală adesea.

Sursa: https://phpsos.de/ro/php/php-cli/  
Stadiu: 25.10.2026  
Furnizor: PHP SOS, Asistență de urgență PHP și securitatea serverelor. Ajutor imediat pe WhatsApp: https://wa.me/491736494914?text=Bun%C4%83%20ziua%2C%20PHP%20SOS%2C%20avem%20nevoie%20de%20ajutor%20cu%20serverul%20nostru%20PHP.%20Firma%3A%20%E2%80%A6%20Site%3A%20%E2%80%A6

**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
<?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.

```bash
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:

- **Dovadă greșită:** `php -v` arată versiunea CLI. Site-ul poate folosi o altă versiune, iar backporturile distribuției nu modifică adesea numărul afișat. Cum dovediți corect starea găsiți la [Verificarea versiunii PHP și a stării patchului](https://phpsos.de/ro/php2shell/php-version-pruefen/) și în articolul [De ce php -v arată același număr](https://phpsos.de/ro/blog/php-v-zeigt-alte-nummer/).
- **Persistență prin Cron:** După o intruziune, atacatorii folosesc cu plăcere cronjob-uri care pornesc periodic un script PHP. Indicații pentru căutare oferă [Recunoașterea cronjob-urilor ascunse ca ușă din spate](https://phpsos.de/ro/blog/cronjobs-als-hintertuer/).
- **Același pachet:** CLI provine de obicei din aceeași sursă de pachete ca PHP-FPM și aparține actualizării.

## 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](https://phpsos.de/ro/leistungen/security-wartungsvertrag/) 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

- [Manualul PHP: PHP în linia de comandă](https://www.php.net/manual/en/features.commandline.php)
- [Manualul PHP: diferențele SAPI-ului CLI](https://www.php.net/manual/en/features.commandline.differences.php)
- [Manualul PHP: opțiunile CLI](https://www.php.net/manual/en/features.commandline.options.php)
- [Manualul PHP: serverul web integrat](https://www.php.net/manual/en/features.commandline.webserver.php)
