# PHP v ukazni vrstici (CLI)

> PHP CLI razložen: razlike do spletne različice, pomembne možnosti, kot so -l, -m in --ini, cron opravila, vgrajeni strežnik in zakaj php -v pogosto vara.

Vir: https://phpsos.de/sl/php/php-cli/  
Stanje: 25.10.2026  
Ponudnik: PHP SOS, Nujna pomoč za PHP in varnost strežnikov. Takojšnja pomoč po WhatsAppu: https://wa.me/491736494914?text=Pozdravljeni%2C%20PHP%20SOS%2C%20potrebujemo%20pomo%C4%8D%20z%20na%C5%A1im%20stre%C5%BEnikom%20PHP.%20Podjetje%3A%20%E2%80%A6%20Spletna%20stran%3A%20%E2%80%A6

**Na kratko:** PHP CLI (Command Line Interface) je različica PHP za ukazno vrstico. Skripte izvaja brez spletnega strežnika, na primer za cron opravila, Composer ali vzdrževalne naloge. Ima lastne privzete vrednosti, pogosto lastno php.ini in včasih celo drugo različico kot spletna stran. Zato `php -v` ni zanesljiv dokaz, da je spletna stran po PHP2Shell popravljena.

## Kaj je PHP CLI?

Priročnik PHP navaja dve glavni področji uporabe PHP: skripte za spletne strani in skripte v ukazni vrstici. Za slednje obstaja lasten SAPI z imenom `cli`. Ne potrebuje ne spletnega strežnika ne brskalnika, samo interpreter PHP. Po priročniku je posebej primeren za naloge, ki se redno izvajajo prek crona v Linuxu ali načrtovalnika opravil v sistemu Windows.

Značilni primeri v podjetju: nočni uvozi v spletni trgovini, pošiljanje novic, čiščenje predpomnilnikov, posodobitve prek Composerja ali ukazna orodja CMS-jev, kot sta WP-CLI ali konzola Symfony. V sistemu Windows se datoteka imenuje `php.exe`, različica CGI `php-cgi.exe`.

Za razliko od PHP-FPM CLI ni storitev. Vsak klic zažene nov proces, po priročniku konfiguracijo prebere znova in se konča, ko je skripta končana. Ponovni zagon po posodobitvi zato ni potreben. Izjeme so dolgo tekoči procesi, zagnani prek CLI, na primer workerji čakalnih vrst ogrodij ali daemoni pod systemd ali Supervisor. Ti tečejo dneve z enkrat naloženim interpreterjem in jih je treba po posodobitvi PHP znova zagnati prav tako kot spletne workerje.

Za vodstvo in vodstvo projektov to pomeni: tudi naloge v ozadju sodijo v popis in v vsak načrt posodobitev.

## Kako se CLI razlikuje od spletne različice?

CLI po priročniku nekatere nastavitve trdno prepiše. Prek php.ini jih ni mogoče spremeniti, samo med izvajanjem z `ini_set()`:

| Direktiva | Vrednost v CLI | Utemeljitev po priročniku |
|---|---|---|
| `html_errors` | izklopljeno | oznake HTML motijo v terminalu |
| `implicit_flush` | vklopljeno | izpisi naj se pojavijo takoj |
| `max_execution_time` | 0 (neomejeno) | skripte v ukazni vrstici pogosto tečejo dolgo |
| `register_argc_argv` | vklopljeno | skripte vedno prejmejo `$argc` in `$argv` |
| `output_buffering` | izklopljeno | trdno določeno, funkcije medpomnjenja ostanejo uporabne |
| `max_input_time` | izklopljeno | CLI ne pozna GET, POST ali nalaganj |

Še ena razlika: CLI ne preklopi v imenik skripte. Kdor pokliče `php -f ordner/skript.php` iz `/tmp`, dela naprej v `/tmp`. Relativne poti v cron opravilih so zato pogost vir napak.

Majhna skripta, ki naj teče samo v ukazni vrstici:

```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");
```

Preverjanje `PHP_SAPI` preprečuje, da bi se vzdrževalna skripta sprožila prek brskalnika, če bi po nesreči ležala v spletnem imeniku. Priročnik izrecno svetuje, da se SAPI preverja tako, namesto da bi se zanesli na obstoj `$argv`.

## Najpomembnejše možnosti PHP CLI

Naslednje možnosti izvirajo iz pregleda možnosti v priročniku PHP in so za skrbnike posebej koristne:

1. **`php -v`** prikaže številko različice CLI.
2. **`php --ini`** prikaže, katere konfiguracijske datoteke se naložijo.
3. **`php -m`** našteje prevedene in naložene module.
4. **`php -i`** pokliče `phpinfo()` in rezultat izpiše kot besedilo.
5. **`php -l datei.php`** preveri samo sintakso (lint). Od PHP 8.3 tudi za več datotek naenkrat.
6. **`php -r 'code'`** kodo izvede neposredno, brez `<?php`.
7. **`php -d name=wert`** za ta klic nastavi nastavitev INI.
8. **`php -n`** php.ini v celoti prezre.
9. **`php --ri name`** prikaže konfiguracijo razširitve.

```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
```

## Vgrajeni spletni strežnik: samo za razvoj

S `php -S localhost:8000` CLI zažene majhen spletni strežnik. Primer izpisa v priročniku kot izhodišče navaja PHP 5.4.0. Priročnik je jasen: strežnik je namenjen razvoju, ni polnovreden spletni strežnik in ne sme teči v javnih omrežjih ne v produkciji. Če na strežniku teče trajno in je dosegljiv od zunaj, je to ugotovitev, ki jo morate odpraviti.

## CLI, cron in varnost po PHP2Shell

Znana poročila o PHP2Shell kot prizadete načine delovanja navajajo PHP-FPM, mod_php, php-cgi, FrankenPHP in LiteSpeed. CLI ne obdeluje zahtev iz omrežja. Za varnost je kljub temu pomemben v treh pogledih:

- **Napačen dokaz:** `php -v` prikaže različico CLI. Spletna stran lahko uporablja drugo različico, backporti distribucij pa prikazane številke pogosto ne spremenijo. Kako stanje pravilno dokažete, piše na strani [Preverjanje različice PHP in stanja popravkov](https://phpsos.de/sl/php2shell/php-version-pruefen/) in v prispevku [Zakaj php -v kaže isto številko](https://phpsos.de/sl/blog/php-v-zeigt-alte-nummer/).
- **Obstojnost prek crona:** napadalci po vdoru radi uporabljajo cron opravila, ki redno zaženejo skripto PHP. Namige za iskanje daje [Prepoznavanje skritih cron opravil kot stranskih vrat](https://phpsos.de/sl/blog/cronjobs-als-hintertuer/).
- **Isti paket:** CLI praviloma izvira iz istega vira paketov kot PHP-FPM in sodi v posodobitev.

## Kako PHP SOS pomaga konkretno?

- **Usklajevanje različic:** primerjamo stanje CLI in spleta ter dokažemo, katero različico vaša spletna stran dejansko streže.
- **Preverjanje cron opravil:** naštejemo vse načrtovane naloge PHP vseh uporabnikov in jih uvrstimo k njihovim aplikacijam.
- **Zavarovanje vzdrževanja:** vzdrževalne skripte prestavimo iz spletnega imenika in nastavimo preverjanja SAPI.
- **Trajna oskrba:** v [varnostni vzdrževalni pogodbi](https://phpsos.de/sl/leistungen/security-wartungsvertrag/) CLI, spletni SAPI in cron opravila posodabljamo skupaj.


## Pogosta vprašanja

**Ali php -v prikaže različico moje spletne strani?**  
Ne nujno. php -v prikaže različico izvedbe za ukazno vrstico. Spletna stran lahko teče prek druge različice PHP-FPM ali modula Apache. Za spletno stran šteje stanje spletnega SAPI, ki ga ugotovite prek storitve ali kratek čas odložene preizkusne datoteke.

**Zakaj skripte CLI tečejo neomejeno dolgo?**  
Po priročniku PHP CLI max_execution_time trdno nastavi na 0, torej neomejeno, ker skripte v ukazni vrstici pogosto opravljajo dolge naloge. Čas izvajanja je mogoče omejiti v skripti sami ali z orodji, kot je timeout.

**Ali smem vgrajeni spletni strežnik php -S uporabljati produktivno?**  
Ne. Priročnik ga opisuje kot pripomoček za razvoj, ne kot polnovreden spletni strežnik, in odsvetuje uporabo v javnih omrežjih in v produkciji. Pred živimi sistemi naj stojijo Apache, Nginx ali LiteSpeed s PHP-FPM.

**Ali je OPcache v ukazni vrstici aktiven?**  
Privzeto ne. opcache.enable_cli je po priročniku na 0. Pri kratkih skriptah predpomnilnik tako ali tako prinese malo, ker je vsak klic nov proces.

## Viri

- [Priročnik PHP: PHP v ukazni vrstici](https://www.php.net/manual/en/features.commandline.php)
- [Priročnik PHP: razlike SAPI CLI](https://www.php.net/manual/en/features.commandline.differences.php)
- [Priročnik PHP: možnosti CLI](https://www.php.net/manual/en/features.commandline.options.php)
- [Priročnik PHP: vgrajeni spletni strežnik](https://www.php.net/manual/en/features.commandline.webserver.php)
