# PHP komandrindā (CLI)

> PHP CLI izskaidrots: atšķirības no tīmekļa versijas, opcijas -l, -m un --ini, cron uzdevumi, iebūvētais serveris un kāpēc php -v bieži maldina.

Avots: https://phpsos.de/lv/php/php-cli/  
Aktuāls uz: 25.10.2026  
Pakalpojuma sniedzējs: PHP SOS, PHP ārkārtas palīdzība un serveru drošība. Tūlītēja palīdzība pa WhatsApp: https://wa.me/491736494914?text=Sveiki%2C%20PHP%20SOS%2C%20mums%20nepiecie%C5%A1ama%20pal%C4%ABdz%C4%ABba%20ar%20m%C5%ABsu%20PHP%20serveri.%20Uz%C5%86%C4%93mums%3A%20%E2%80%A6%20Vietne%3A%20%E2%80%A6

**Ī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
<?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.

```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
```

## 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:

- **Nepareizs pierādījums:** `php -v` rāda CLI versiju. Vietne var izmantot citu versiju, un distributīvu backport labojumi parādīto numuru bieži nemaina. Kā stāvokli pierādīt pareizi, skatiet sadaļā [PHP versijas un ielāpu stāvokļa pārbaude](https://phpsos.de/lv/php2shell/php-version-pruefen/) un rakstā [Kāpēc php -v rāda to pašu numuru](https://phpsos.de/lv/blog/php-v-zeigt-alte-nummer/).
- **Noturība caur Cron:** Uzbrucēji pēc ielaušanās labprāt izmanto cron uzdevumus, kas regulāri startē PHP skriptu. Norādes meklēšanai sniedz [Slēptu cron uzdevumu atpazīšana kā slēpta piekļuve](https://phpsos.de/lv/blog/cronjobs-als-hintertuer/).
- **Tā pati pakotne:** CLI parasti nāk no tā paša pakotņu avota kā PHP-FPM un pieder atjauninājumam.

## 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ā](https://phpsos.de/lv/leistungen/security-wartungsvertrag/) 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

- [PHP rokasgrāmata: PHP komandrindā](https://www.php.net/manual/en/features.commandline.php)
- [PHP rokasgrāmata: CLI SAPI atšķirības](https://www.php.net/manual/en/features.commandline.differences.php)
- [PHP rokasgrāmata: CLI opcijas](https://www.php.net/manual/en/features.commandline.options.php)
- [PHP rokasgrāmata: iebūvētais tīmekļa serveris](https://www.php.net/manual/en/features.commandline.webserver.php)
