# PHP w wierszu poleceń (CLI)

> PHP CLI wyjaśnione: różnice względem wersji webowej, ważne opcje -l, -m i --ini, zadania Cron, wbudowany serwer WWW i dlaczego php -v często myli.

Źródło: https://phpsos.de/pl/php/php-cli/  
Stan: 25.10.2026  
Dostawca: PHP SOS, Pomoc awaryjna PHP i bezpieczeństwo serwerów. Natychmiastowa pomoc przez WhatsApp: https://wa.me/491736494914?text=Dzie%C5%84%20dobry%2C%20PHP%20SOS%2C%20potrzebujemy%20pomocy%20z%20naszym%20serwerem%20PHP.%20Firma%3A%20%E2%80%A6%20Strona%20internetowa%3A%20%E2%80%A6

**Krótko:** PHP CLI (Command Line Interface) to wariant PHP dla wiersza poleceń. Wykonuje skrypty bez serwera WWW, na przykład dla zadań Cron, Composera lub zadań konserwacyjnych. Ma własne wartości domyślne, często własny php.ini, a czasem nawet inną wersję niż strona. Dlatego `php -v` nie jest wiarygodnym dowodem, że strona została po PHP2Shell załatana.

## Czym jest PHP CLI?

Podręcznik PHP wymienia dwa główne obszary zastosowań PHP: skrypty dla stron internetowych i skrypty w wierszu poleceń. Dla tego drugiego istnieje osobne SAPI o nazwie `cli`. Nie potrzebuje ani serwera WWW, ani przeglądarki, tylko interpretera PHP. Według podręcznika nadaje się szczególnie do zadań uruchamianych regularnie przez Cron w systemie Linux lub przez harmonogram zadań w systemie Windows.

Typowe przykłady z codziennej pracy firmy: nocne importy w sklepie, wysyłka newslettera, czyszczenie pamięci podręcznych, aktualizacje przez Composera albo narzędzia wiersza poleceń systemów CMS, takie jak WP-CLI czy konsola Symfony. W systemie Windows plik nazywa się `php.exe`, a wariant CGI `php-cgi.exe`.

W odróżnieniu od PHP-FPM CLI nie jest usługą. Każde wywołanie uruchamia nowy proces, według podręcznika wczytuje konfigurację od nowa i kończy się, gdy skrypt jest gotowy. Restart po aktualizacji nie jest więc potrzebny. Wyjątkiem są długo działające procesy uruchamiane przez CLI, na przykład workery kolejek we frameworkach lub demony w systemd czy Supervisor. Działają one całymi dniami na jednokrotnie załadowanym interpreterze i po aktualizacji PHP trzeba je zrestartować tak samo jak workery webowe.

Dla zarządu i kierownictwa projektów oznacza to: zadania w tle także należą do inwentarza i do każdego planu aktualizacji.

## Czym CLI różni się od wersji webowej?

CLI według podręcznika nadpisuje na stałe kilka ustawień. Nie da się ich zmienić przez php.ini, tylko w czasie działania przez `ini_set()`:

| Dyrektywa | Wartość w CLI | Uzasadnienie według podręcznika |
|---|---|---|
| `html_errors` | wyłączone | znaczniki HTML przeszkadzają w terminalu |
| `implicit_flush` | włączone | wyjście ma pojawiać się od razu |
| `max_execution_time` | 0 (bez ograniczeń) | skrypty wiersza poleceń często działają długo |
| `register_argc_argv` | włączone | skrypty zawsze otrzymują `$argc` i `$argv` |
| `output_buffering` | wyłączone | na stałe zapisane, funkcje buforowania pozostają dostępne |
| `max_input_time` | wyłączone | CLI nie zna GET, POST ani przesyłania plików |

Kolejna różnica: CLI nie przechodzi do katalogu skryptu. Kto wywoła `php -f ordner/skript.php` z `/tmp`, nadal pracuje w `/tmp`. Ścieżki względne w zadaniach Cron są dlatego częstym źródłem błędów.

Mały skrypt, który ma działać tylko w wierszu poleceń:

```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");
```

Sprawdzenie `PHP_SAPI` zapobiega uruchomieniu skryptu konserwacyjnego przez przeglądarkę, jeśli przez pomyłkę leży w katalogu WWW. Podręcznik wyraźnie zaleca sprawdzać SAPI w ten sposób, zamiast polegać na obecności `$argv`.

## Najważniejsze opcje PHP CLI

Poniższe opcje pochodzą z przeglądu opcji w podręczniku PHP i są szczególnie przydatne dla administratorów:

1. **`php -v`** pokazuje numer wersji CLI.
2. **`php --ini`** pokazuje, które pliki konfiguracyjne są ładowane.
3. **`php -m`** wylicza wkompilowane i załadowane moduły.
4. **`php -i`** wywołuje `phpinfo()` i wypisuje wynik jako tekst.
5. **`php -l datei.php`** sprawdza tylko składnię (lint). Od PHP 8.3 także dla wielu plików naraz.
6. **`php -r 'code'`** wykonuje kod bezpośrednio, bez `<?php`.
7. **`php -d name=wert`** ustawia ustawienie INI dla tego wywołania.
8. **`php -n`** całkowicie ignoruje php.ini.
9. **`php --ri name`** pokazuje konfigurację rozszerzenia.

```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
```

## Wbudowany serwer WWW: tylko do programowania

Poleceniem `php -S localhost:8000` CLI uruchamia mały serwer WWW. Przykładowe wyjście w podręczniku podaje PHP 5.4.0 jako punkt wyjścia. Podręcznik jest jednoznaczny: serwer służy do programowania, nie jest pełnowartościowym serwerem WWW i nie powinien działać w sieciach publicznych ani w produkcji. Jeśli działa na serwerze na stałe i jest dostępny z zewnątrz, jest to ustalenie, które należy usunąć.

## CLI, Cron i bezpieczeństwo po PHP2Shell

Znane komunikaty o PHP2Shell wymieniają jako dotknięte tryby pracy PHP-FPM, mod_php, php-cgi, FrankenPHP i LiteSpeed. CLI nie przetwarza żądań z sieci. Dla bezpieczeństwa jest jednak ważne pod trzema względami:

- **Fałszywy dowód:** `php -v` pokazuje wersję CLI. Strona może używać innej wersji, a backporty dystrybucji często nie zmieniają wyświetlanego numeru. Jak prawidłowo udokumentować stan, opisujemy na stronie [Jak sprawdzić wersję PHP i stan poprawek](https://phpsos.de/pl/php2shell/php-version-pruefen/) oraz w artykule [Dlaczego php -v pokazuje ten sam numer](https://phpsos.de/pl/blog/php-v-zeigt-alte-nummer/).
- **Utrwalenie przez Cron:** Atakujący po włamaniu chętnie używają zadań Cron, które regularnie uruchamiają skrypt PHP. Wskazówki dotyczące wyszukiwania podaje artykuł [Rozpoznawanie ukrytych zadań Cron jako tylnych drzwi](https://phpsos.de/pl/blog/cronjobs-als-hintertuer/).
- **Ten sam pakiet:** CLI pochodzi zwykle z tego samego źródła pakietów co PHP-FPM i należy ją uwzględnić w aktualizacji.

## Jak konkretnie pomaga PHP SOS?

- **Porównanie wersji:** Porównujemy stan CLI i stan webowy i dokumentujemy, jaką wersję Państwa strona faktycznie wydaje.
- **Kontrola zadań Cron:** Zestawiamy wszystkie zaplanowane zadania PHP wszystkich użytkowników i przypisujemy je do aplikacji.
- **Zabezpieczenie konserwacji:** Przenosimy skrypty konserwacyjne z katalogu WWW i ustawiamy kontrole SAPI.
- **Stała opieka:** W ramach [umowy serwisowej bezpieczeństwa](https://phpsos.de/pl/leistungen/security-wartungsvertrag/) utrzymujemy CLI, webowe SAPI i zadania Cron razem w aktualnym stanie.


## Częste pytania

**Czy php -v pokazuje wersję mojej strony?**  
Niekoniecznie. php -v pokazuje wersję wariantu dla wiersza poleceń. Strona może działać przez inną wersję PHP-FPM albo moduł Apache. Dla strony liczy się stan webowego SAPI, który ustala się przez usługę lub krótko umieszczony plik kontrolny.

**Dlaczego skrypty CLI mogą działać w nieskończoność?**  
Według podręcznika PHP CLI ustawia max_execution_time na stałe na 0, czyli bez ograniczeń, ponieważ skrypty w wierszu poleceń często wykonują długie zadania. Czas działania można ograniczyć w samym skrypcie lub narzędziami takimi jak timeout.

**Czy mogę używać wbudowanego serwera WWW php -S produkcyjnie?**  
Nie. Podręcznik opisuje go jako pomoc przy programowaniu, a nie pełnowartościowy serwer WWW, i odradza użycie w sieciach publicznych oraz w produkcji. Dla systemów działających na żywo przed PHP-FPM należy postawić Apache, Nginx lub LiteSpeed.

**Czy OPcache jest aktywny w wierszu poleceń?**  
Domyślnie nie. opcache.enable_cli jest według podręcznika ustawione na 0. Dla krótkich skryptów pamięć podręczna i tak niewiele daje, ponieważ każde wywołanie to nowy proces.

## Źródła

- [Podręcznik PHP: PHP w wierszu poleceń](https://www.php.net/manual/en/features.commandline.php)
- [Podręcznik PHP: różnice SAPI CLI](https://www.php.net/manual/en/features.commandline.differences.php)
- [Podręcznik PHP: opcje CLI](https://www.php.net/manual/en/features.commandline.options.php)
- [Podręcznik PHP: wbudowany serwer WWW](https://www.php.net/manual/en/features.commandline.webserver.php)
