# PHP u naredbenom retku (CLI)

> PHP CLI objašnjen: razlike u odnosu na web-inačicu, važne opcije poput -l, -m i --ini, cron zadaci, ugrađeni web-poslužitelj i zašto php -v često zavarava.

Izvor: https://phpsos.de/hr/php/php-cli/  
Stanje: 25.10.2026  
Pružatelj: PHP SOS, PHP hitna pomoć i sigurnost poslužitelja. Hitna pomoć putem WhatsAppa: https://wa.me/491736494914?text=Pozdrav%20PHP%20SOS%2C%20trebamo%20pomo%C4%87%20s%20na%C5%A1im%20PHP%20poslu%C5%BEiteljem.%20Tvrtka%3A%20%E2%80%A6%20Web-stranica%3A%20%E2%80%A6

**Ukratko:** PHP CLI (Command Line Interface) je inačica PHP-a za naredbeni redak. Izvršava skripte bez web-poslužitelja, na primjer za cron zadatke, Composer ili zadatke održavanja. Ima vlastite zadane vrijednosti, često vlastiti php.ini, a ponekad čak i drugu verziju od web-stranice. Zato `php -v` nije pouzdan dokaz da je web-stranica nakon PHP2Shella zakrpana.

## Što je PHP CLI?

PHP priručnik navodi dva glavna područja primjene PHP-a: skripte za web-stranice i skripte u naredbenom retku. Za potonje postoji zaseban SAPI naziva `cli`. Ne treba mu ni web-poslužitelj ni preglednik, samo PHP interpreter. Prema priručniku osobito je prikladan za zadatke koji se redovito izvršavaju putem crona na Linuxu ili planera zadataka na Windowsu.

Tipični primjeri u poslovnoj svakodnevici: noćni uvozi u web-trgovini, slanje newslettera, čišćenje predmemorija, ažuriranja putem Composera ili alati naredbenog retka CMS-ova poput WP-CLI-ja ili Symfony konzole. Pod Windowsom se datoteka zove `php.exe`, a CGI inačica `php-cgi.exe`.

Za razliku od PHP-FPM-a, CLI nije usluga. Svaki poziv pokreće novi proces, prema priručniku iznova čita konfiguraciju i završava kad je skripta gotova. Ponovno pokretanje nakon ažuriranja stoga nije potrebno. Iznimke su dugotrajni procesi pokrenuti putem CLI-ja, na primjer workeri redova čekanja frameworka ili daemoni pod systemd-om ili Supervisorom. Oni danima rade s jednom učitanim interpreterom i nakon PHP ažuriranja moraju se ponovno pokrenuti jednako kao web workeri.

Za upravu i voditelje projekata to znači: i pozadinski zadaci pripadaju u inventar i u svaki plan ažuriranja.

## Po čemu se CLI razlikuje od web-inačice?

CLI prema priručniku trajno nadjačava neke postavke. One se ne mogu mijenjati putem php.ini, samo tijekom rada putem `ini_set()`:

| Direktiva | Vrijednost u CLI-ju | Obrazloženje prema priručniku |
|---|---|---|
| `html_errors` | isključeno | HTML oznake smetaju u terminalu |
| `implicit_flush` | uključeno | ispisi se trebaju pojaviti odmah |
| `max_execution_time` | 0 (neograničeno) | skripte naredbenog retka često rade dugo |
| `register_argc_argv` | uključeno | skripte uvijek dobivaju `$argc` i `$argv` |
| `output_buffering` | isključeno | čvrsto zadano, funkcije međuspremnika ostaju upotrebljive |
| `max_input_time` | isključeno | CLI ne poznaje GET, POST ni uploade |

Još jedna razlika: CLI ne prelazi u direktorij skripte. Tko pozove `php -f ordner/skript.php` iz `/tmp`, i dalje radi u `/tmp`. Relativne putanje u cron zadacima zato su česti izvor pogrešaka.

Mala skripta koja smije raditi samo u naredbenom retku:

```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");
```

Provjera `PHP_SAPI` sprječava da se skripta za održavanje pokrene preko preglednika ako se slučajno nađe u web-direktoriju. Priručnik izričito savjetuje da se SAPI provjerava ovako, umjesto oslanjanja na postojanje `$argv`.

## Najvažnije opcije PHP CLI-ja

Sljedeće opcije potječu iz pregleda opcija PHP priručnika i osobito su korisne administratorima:

1. **`php -v`** prikazuje broj verzije CLI-ja.
2. **`php --ini`** prikazuje koje se konfiguracijske datoteke učitavaju.
3. **`php -m`** ispisuje ukompilirane i učitane module.
4. **`php -i`** poziva `phpinfo()` i ispisuje rezultat kao tekst.
5. **`php -l datei.php`** provjerava samo sintaksu (lint). Od PHP-a 8.3 i za više datoteka odjednom.
6. **`php -r 'code'`** izvršava kod izravno, bez `<?php`.
7. **`php -d name=wert`** postavlja INI postavku za taj poziv.
8. **`php -n`** potpuno zanemaruje php.ini.
9. **`php --ri name`** prikazuje konfiguraciju ekstenzije.

```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
```

## Ugrađeni web-poslužitelj: samo za razvoj

Pomoću `php -S localhost:8000` CLI pokreće mali web-poslužitelj. Primjer ispisa u priručniku kao polazište navodi PHP 5.4.0. Priručnik je jasan: poslužitelj služi razvoju, nije potpun web-poslužitelj, ne smije raditi u javnim mrežama ni u produkciji. Ako na poslužitelju trajno radi i dostupan je izvana, to je nalaz koji biste trebali ukloniti.

## CLI, cron i sigurnost nakon PHP2Shella

Poznate objave o PHP2Shellu kao pogođene načine rada navode PHP-FPM, mod_php, php-cgi, FrankenPHP i LiteSpeed. CLI ne obrađuje zahtjeve iz mreže. Za sigurnost je ipak važan u tri pogleda:

- **Pogrešan dokaz:** `php -v` prikazuje verziju CLI-ja. Web-stranica može koristiti drugu verziju, a backportovi distribucija često ne mijenjaju prikazani broj. Kako ispravno dokazati stanje, piše na stranici [Provjera PHP verzije i razine zakrpa](https://phpsos.de/hr/php2shell/php-version-pruefen/) i u članku [Zašto php -v prikazuje isti broj](https://phpsos.de/hr/blog/php-v-zeigt-alte-nummer/).
- **Postojanost putem crona:** Napadači nakon provale rado koriste cron zadatke koji redovito pokreću PHP skriptu. Napomene o traženju daje članak [Prepoznati skrivene cron zadatke kao zadnja vrata](https://phpsos.de/hr/blog/cronjobs-als-hintertuer/).
- **Isti paket:** CLI najčešće potječe iz istog izvora paketa kao PHP-FPM i pripada u ažuriranje.

## Kako PHP SOS konkretno pomaže?

- **Uskladiti verzije:** Uspoređujemo stanje CLI-ja i weba te dokazujemo koju verziju Vaša web-stranica stvarno isporučuje.
- **Provjeriti cron zadatke:** Popisujemo sve planirane PHP zadatke svih korisnika i pridružujemo ih njihovim aplikacijama.
- **Osigurati održavanje:** Skripte za održavanje premještamo iz web-direktorija i postavljamo SAPI provjere.
- **Trajno skrbiti:** U [ugovoru o sigurnosnom održavanju](https://phpsos.de/hr/leistungen/security-wartungsvertrag/) zajedno održavamo ažurnima CLI, web SAPI i cron zadatke.


## Česta pitanja

**Prikazuje li php -v verziju moje web-stranice?**  
Ne nužno. php -v prikazuje verziju inačice za naredbeni redak. Web-stranica može raditi putem druge verzije PHP-FPM-a ili Apache modula. Za web-stranicu je važno stanje web SAPI-ja, koje utvrđujete putem usluge ili kratkotrajne probne datoteke.

**Zašto CLI skripte rade neograničeno dugo?**  
Prema PHP priručniku CLI trajno postavlja max_execution_time na 0, dakle neograničeno, jer skripte u naredbenom retku često obavljaju dugotrajne zadatke. Trajanje se može ograničiti samom skriptom ili alatima poput timeout.

**Smijem li ugrađeni web-poslužitelj php -S koristiti u produkciji?**  
Ne. Priručnik ga opisuje kao pomoć pri razvoju, a ne kao potpun web-poslužitelj, te odvraća od uporabe u javnim mrežama i u produkciji. Za žive sustave ispred PHP-FPM-a pripadaju Apache, Nginx ili LiteSpeed.

**Je li OPcache u naredbenom retku aktivan?**  
Prema zadanim postavkama nije. opcache.enable_cli prema priručniku iznosi 0. Za kratke skripte predmemorija ionako malo donosi jer je svaki poziv novi proces.

## Izvori

- [PHP priručnik: PHP u naredbenom retku](https://www.php.net/manual/en/features.commandline.php)
- [PHP priručnik: Razlike CLI SAPI-ja](https://www.php.net/manual/en/features.commandline.differences.php)
- [PHP priručnik: CLI opcije](https://www.php.net/manual/en/features.commandline.options.php)
- [PHP priručnik: Ugrađeni web-poslužitelj](https://www.php.net/manual/en/features.commandline.webserver.php)
