Aktualna sytuacja: PHP2Shell. Dwie krytyczne luki w PHP (CVSS 9,2) umożliwiają wykonanie złośliwego kodu bez logowania. Poprawki od 21.10.2026.Co należy teraz zrobić →

PHP w wierszu poleceń (CLI)

PHP CLI uruchamia skrypty bez serwera WWW, na przykład dla zadań Cron i konserwacji. Zachowuje się inaczej niż wersja webowa i często nie pokazuje stanu, z którego korzysta Państwa strona.

Stan 4 min czytaniaWiedza o PHP

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
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.
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:

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 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

Kontakt natychmiast

Liczy się każda godzina. Proszę napisać do nas teraz.

Proszę krótko opisać system, wersję PHP i obserwacje. Skontaktujemy się z Państwem, ustalimy sytuację i będziemy pracować zdalnie, aż incydent zostanie zamknięty i udokumentowany.

Natychmiastowa pomoc