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

Lokalne programowanie w PHP: Docker, DDEV i inne

Do lokalnego programowania w PHP służą wbudowany serwer WWW, oficjalne obrazy Dockera i narzędzia takie jak DDEV. Ważne, aby lokalnie działała ta sama wersja PHP co na produkcji.

Stan 4 min czytaniaWiedza o PHP

Krótko: Do lokalnego programowania w PHP są trzy popularne drogi: wbudowany serwer WWW (php -S) do szybkich prób, oficjalne obrazy PHP dla Dockera do odtwarzalnych środowisk oraz narzędzia takie jak DDEV, które tworzą gotowe środowiska projektowe dla WordPressa, TYPO3, Shopware czy Laravela. Decydujące jest nie tyle narzędzie, ile zgodność: lokalnie powinna działać ta sama wersja PHP z tymi samymi rozszerzeniami co na produkcji. Dla bezpieczeństwa liczy się jednak w końcu zawsze środowisko uruchomieniowe na serwerze.

Dlaczego osobne środowisko deweloperskie?

Wprowadzanie zmian bezpośrednio na działającym serwerze jest ryzykowne: każda literówka jest od razu widoczna dla klientów, a pliki testowe chętnie zostają. Środowisko lokalne oddziela próbowanie od eksploatacji. Jest jednocześnie miejscem, w którym najpierw testuje się nowe wersje PHP i aktualizacje bezpieczeństwa.

Dla zarządu i kierownictwa IT pytanie nie brzmi więc, czy istnieje środowisko deweloperskie, lecz czy odpowiada systemowi produkcyjnemu. Środowisko lokalne z PHP 8.4, podczas gdy na produkcji nadal działa 8.1, zasłania problemy zamiast je pokazywać. To samo dotyczy wersji bazy danych, serwera WWW i rozszerzeń takich jak intl, gd czy pdo_mysql: już brakujące rozszerzenie może sprawić, że błąd wyjdzie na jaw dopiero na produkcji.

Opcje w skrócie

Opcja Nadaje się do Mocne strony Granice
Wbudowany serwer php -S krótkie próby, małe skrypty bez instalacji dodatkowego oprogramowania nie zastępuje Nginx ani Apache, nie do sieci publicznych
Oficjalny obraz Dockera zespoły, odtwarzalne środowiska wersję można ustalić tagiem, blisko pracy w kontenerach konfigurację i współdziałanie kilku kontenerów trzeba zbudować samemu
DDEV projekty CMS i frameworków gotowe typy projektów, baza danych i serwer WWW w pakiecie wymaga Dockera, własne konwencje
Lokalnie zainstalowane PHP pojedynczy programista szybko, bezpośrednio trudno równolegle utrzymywać wersje wielu projektów

Wbudowany serwer WWW

Od PHP 5.4 wiersz poleceń zawiera mały serwer WWW. Startuje w bieżącym katalogu albo z -t w innym katalogu dokumentów:

php -S localhost:8000 -t public/

Opcjonalnie przekazuje się skrypt routera, który przy każdym żądaniu wykonuje się jako pierwszy. Podręcznik jest w ocenie jednoznaczny: serwer ma wspierać programowanie, nie jest pełnowartościowym serwerem WWW i nie powinien być używany w sieci publicznej. Proszę więc wiązać go z localhost, a nie z 0.0.0.0, w przeciwnym razie może być osiągalny w firmowej lub hotelowej sieci Wi-Fi. Więcej o wierszu poleceń w artykule PHP w wierszu poleceń.

Docker: oficjalne obrazy PHP

Oficjalne obrazy występują w kilku wariantach: cli dla wiersza poleceń, apache z Apache i mod_php, fpm do pracy za Nginx lub innym proxy, a do tego warianty Alpine dla małych obrazów. Szybki start z Apache:

docker run --rm -p 8080:80 -v "$PWD":/var/www/html php:8.4-apache

Obrazy zawierają szablony php.ini-development i php.ini-production w katalogu $PHP_INI_DIR. Lokalnie sensowny jest szablon deweloperski, ponieważ wyświetla błędy. Dla produkcji dokumentacja obrazu wyraźnie zaleca szablon produkcyjny. Rozszerzenia instaluje się dołączonymi skryptami pomocniczymi docker-php-ext-configure, docker-php-ext-install i docker-php-ext-enable. Jak działają tagi i digesty, wyjaśnia artykuł Oficjalne obrazy PHP dla Dockera.

DDEV: gotowe środowiska dla CMS i frameworków

DDEV bazuje na Dockerze i konfiguruje dla projektu serwer WWW, PHP, bazę danych i usługi pomocnicze. Instrukcje szybkiego startu niemal zawsze mają ten sam wzorzec:

ddev config --project-type=wordpress --docroot=web
ddev start
ddev composer install
ddev launch

Jako typy projektów DDEV zna między innymi wordpress, typo3, shopware6, laravel, symfony, drupal11, magento2 oraz ogólny typ php. Wersję PHP ustawia się w .ddev/config.yaml; według dokumentacji możliwe są wersje od 5.6 do 8.5, domyślna to 8.4:

# .ddev/config.yaml (fragment)
php_version: "8.3"
webserver_type: nginx-fpm   # alternatywnie apache-fpm

W ten sposób środowisko lokalne odpowiada wersji produkcyjnej, nawet jeśli nie jest ona najnowsza.

Lokalne programowanie, stan poprawek i PHP2Shell

Po PHP2Shell kilku dostawców platform zwróciło uwagę na typowy błąd w rozumowaniu. Vercel podkreśla w biuletynie, że aktualizacja lokalnego środowiska deweloperskiego, kodu aplikacji czy wtyczek nie wystarcza; rozstrzygające jest środowisko uruchomieniowe PHP, które faktycznie obsługuje ruch. Posiadanie lokalnie PHP 8.4.27 nie chroni serwera z wersją 8.4.26.

Odwrotnie, środowisko deweloperskie niesie własne ryzyka, które mogą przeniknąć do produkcji:

  1. Ini deweloperskie na produkcji: display_errors jest włączone w php.ini-development. Jeśli ten plik trafi na serwer, odwiedzający widzą ścieżki i komunikaty o błędach. Zob. Wyłączanie wyświetlania błędów w produkcji.
  2. Zapomniane pliki testowe: pliki phpinfo(), zrzuty bazy danych lub pliki .env z danymi dostępowymi nie należą do wdrożenia.
  3. Otwarte serwery deweloperskie: php -S lub kontenery z opublikowanymi portami na komputerach w sieci.
  4. Przestarzałe obrazy: Lokalne obrazy nie aktualizują się same; po wydaniu poprawki bezpieczeństwa PHP także środowisko deweloperskie należy zbudować od nowa, aby testy działały z poprawioną wersją.
Wskazówka

Proszę ustalić wersję PHP w jednym miejscu, na przykład w Dockerfile lub w .ddev/config.yaml, i zmieniać ją przy aktualizacjach razem z konfiguracją serwera.

Jak konkretnie pomaga PHP SOS?

W ramach umowy serwisowej bezpieczeństwa dbamy o to, aby programowanie i eksploatacja do siebie pasowały:

  • Porównanie: Porównujemy wersję PHP i rozszerzenia środowiska deweloperskiego, testowego i produkcyjnego.
  • Przebieg aktualizacji: Nowe wydania PHP są instalowane najpierw w środowisku testowym, potem na produkcji, każdorazowo z restartem.
  • Kontrola wdrożenia: Dbamy o to, aby na serwer nie trafiały ini deweloperskie, pliki testowe ani dane dostępowe.
  • Dokumentacja: Wiedzą Państwo w każdej chwili, jaka wersja działa gdzie.

Częste pytania

Czy mogę używać wbudowanego serwera PHP publicznie?

Nie. Podręcznik PHP wyraźnie mówi, że serwer uruchamiany za pomocą php -S służy do programowania i nie powinien być używany w sieci publicznej. Do pracy produkcyjnej należą PHP-FPM z Nginx lub Apache.

Czym jest DDEV?

DDEV to narzędzie oparte na Dockerze, które tworzy gotowe środowiska deweloperskie dla projektów PHP. Zna typy projektów dla WordPressa, TYPO3, Shopware 6, Laravela, Drupala i innych systemów.

Czy wystarczy zaktualizować lokalną wersję PHP?

Nie. Przeciw lukom takim jak PHP2Shell liczy się środowisko uruchomieniowe PHP, które faktycznie obsługuje ruch, czyli to na serwerze. Środowisko lokalne powinno mieć jednak tę samą wersję, aby testy miały wartość dowodową.

Którego php.ini używać lokalnie?

Lokalnie sensowny jest php.ini-development, ponieważ wyświetla błędy. W produkcji należy używać php.ini-production. Oficjalne obrazy Dockera zawierają oba szablony.

Ź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