# PHP komandinėje eilutėje (CLI)

> PHP CLI paaiškinta: skirtumai nuo žiniatinklio versijos, svarbios parinktys -l, -m ir --ini, cron užduotys, įtaisytasis serveris ir kodėl php -v dažnai klaidina.

Šaltinis: https://phpsos.de/lt/php/php-cli/  
Būsena: 2026-10-25  
Teikėjas: PHP SOS, PHP avarinė pagalba ir serverio sauga. Skubi pagalba per „WhatsApp“: https://wa.me/491736494914?text=Sveiki%2C%20PHP%20SOS%2C%20mums%20reikia%20pagalbos%20su%20m%C5%ABs%C5%B3%20PHP%20serveriu.%20%C4%AEmon%C4%97%3A%20%E2%80%A6%20Svetain%C4%97%3A%20%E2%80%A6

**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
<?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ą.

```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
```

## Į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:

- **Klaidingas įrodymas:** `php -v` rodo CLI versiją. Svetainė gali naudoti kitą versiją, o distribucijų backport rodomo numerio dažnai nepakeičia. Kaip teisingai įrodyti būseną, aprašyta skyriuje [PHP versijos ir pataisų būsenos patikra](https://phpsos.de/lt/php2shell/php-version-pruefen/) ir straipsnyje [Kodėl php -v rodo tą patį numerį](https://phpsos.de/lt/blog/php-v-zeigt-alte-nummer/).
- **Išlikimas per cron:** po įsilaužimo užpuolikai mėgsta naudoti cron užduotis, kurios reguliariai paleidžia PHP skriptą. Paieškos patarimai pateikti straipsnyje [Paslėptų cron užduočių kaip užpakalinių durų atpažinimas](https://phpsos.de/lt/blog/cronjobs-als-hintertuer/).
- **Tas pats paketas:** CLI dažniausiai ateina iš to paties paketų šaltinio kaip PHP-FPM ir priklauso atnaujinimui.

## 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](https://phpsos.de/lt/leistungen/security-wartungsvertrag/) 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

- [PHP vadovas: PHP komandinėje eilutėje](https://www.php.net/manual/en/features.commandline.php)
- [PHP vadovas: CLI SAPI skirtumai](https://www.php.net/manual/en/features.commandline.differences.php)
- [PHP vadovas: CLI parinktys](https://www.php.net/manual/en/features.commandline.options.php)
- [PHP vadovas: įtaisytasis žiniatinklio serveris](https://www.php.net/manual/en/features.commandline.webserver.php)
