Stručně: Pro lokální vývoj v PHP existují tři běžné cesty: vestavěný webový server (php -S) pro rychlé pokusy, oficiální image PHP pro Docker pro reprodukovatelná prostředí a nástroje jako DDEV, které vytvářejí hotová projektová prostředí pro WordPress, TYPO3, Shopware nebo Laravel. Rozhodující není tolik nástroj jako shoda: lokálně by měla běžet stejná verze PHP se stejnými rozšířeními jako naostro. Pro bezpečnost ale nakonec vždy rozhoduje běhové prostředí na serveru.
Proč vlastní vývojové prostředí?
Provádět změny přímo na živém serveru je riskantní: každý překlep je okamžitě vidět zákazníkům a testovací soubory tam rády zůstávají ležet. Lokální prostředí odděluje zkoušení od provozu. Je zároveň místem, kde se nové verze PHP a bezpečnostní aktualizace testují jako první.
Pro vedení firmy a IT proto není otázka, zda vývojové prostředí existuje, ale zda odpovídá živému systému. Lokální prostředí s PHP 8.4, zatímco naostro stále běží 8.1, problémy spíše zakrývá, než aby je ukázalo. Totéž platí pro verzi databáze, webový server a rozšíření jako intl, gd nebo pdo_mysql: už jediné chybějící rozšíření může způsobit, že se chyba projeví teprve naostro.
Možnosti v přehledu
| Možnost | Vhodné pro | Silné stránky | Meze |
|---|---|---|---|
Vestavěný server php -S |
krátké pokusy, malé skripty | bez instalace dalšího softwaru | není náhradou za Nginx nebo Apache, ne pro veřejné sítě |
| Oficiální image Dockeru | týmy, reprodukovatelná prostředí | verzi lze určit tagem, blízko provozu v kontejneru | konfiguraci a součinnost více kontejnerů si musíte postavit sami |
| DDEV | projekty CMS a frameworků | hotové typy projektů, databáze a webový server v ceně | vyžaduje Docker, vlastní konvence |
| Lokálně nainstalované PHP | jednotliví vývojáři | rychlé, přímé | verze více projektů se těžko udržují souběžně |
Vestavěný webový server
Od PHP 5.4 obsahuje příkazová řádka malý webový server. Spustí se v aktuálním adresáři nebo pomocí -t v jiném dokumentovém adresáři:
php -S localhost:8000 -t public/
Volitelně můžete předat skript routeru, který se při každém požadavku spustí jako první. Příručka je v zařazení jednoznačná: server má podporovat vývoj, není plnohodnotným webovým serverem a nemá se používat ve veřejné síti. Vážte jej proto na localhost, ne na 0.0.0.0, jinak může být za určitých okolností dostupný ve firemní nebo hotelové Wi-Fi. Více o příkazové řádce najdete v článku PHP na příkazové řádce.
Docker: oficiální image PHP
Oficiální image existují v několika variantách: cli pro příkazovou řádku, apache s Apache a mod_php, fpm pro provoz za Nginx nebo jinou proxy, k tomu varianty Alpine pro malé image. Rychlý start s Apache:
docker run --rm -p 8080:80 -v "$PWD":/var/www/html php:8.4-apache
Image obsahují šablony php.ini-development a php.ini-production v adresáři $PHP_INI_DIR. Lokálně dává smysl vývojová šablona, protože zobrazuje chyby. Pro produkci dokumentace image výslovně doporučuje produkční šablonu. Rozšíření instalujete pomocí dodávaných pomocných skriptů docker-php-ext-configure, docker-php-ext-install a docker-php-ext-enable. Jak fungují tagy a digesty, vysvětluje článek Oficiální image PHP pro Docker.
DDEV: hotová prostředí pro CMS a frameworky
DDEV staví na Dockeru a pro projekt zřídí webový server, PHP, databázi a pomocné služby. Rychlé návody téměř vždy sledují stejný vzor:
ddev config --project-type=wordpress --docroot=web
ddev start
ddev composer install
ddev launch
Jako typy projektů zná DDEV mimo jiné wordpress, typo3, shopware6, laravel, symfony, drupal11, magento2 a obecný typ php. Verzi PHP určíte v .ddev/config.yaml; podle dokumentace jsou možné verze od 5.6 do 8.5, výchozí je 8.4:
# .ddev/config.yaml (výřez)
php_version: "8.3"
webserver_type: nginx-fpm # případně apache-fpm
Lokální prostředí tak odpovídá živé verzi, i když ta ještě není nejnovější.
Lokální vývoj, stav záplat a PHP2Shell
Po PHP2Shell několik poskytovatelů platforem upozornilo na typickou chybu v úvaze. Vercel podle bulletinu zdůrazňuje, že aktualizace lokálního vývojového prostředí, aplikačního kódu nebo pluginů nestačí; rozhodující je běhové prostředí PHP, které skutečně odpovídá. Mít lokálně PHP 8.4.27 nechrání server s 8.4.26.
Naopak vývojové prostředí přináší vlastní rizika, která mohou přejít do produkce:
- Vývojové ini v produkci:
display_errorsje vphp.ini-developmentzapnuto. Pokud se tento soubor dostane na server, návštěvníci uvidí cesty a chybová hlášení. Viz Vypnutí výpisu chyb v produkci. - Zapomenuté testovací soubory: soubory
phpinfo(), dumpy databáze nebo soubory.envs přístupovými údaji do nasazení nepatří. - Otevřené vývojové servery:
php -Snebo kontejnery s publikovanými porty na počítačích v síti. - Zastaralé image: lokální image se samy neaktualizují; po bezpečnostním vydání PHP je nutné znovu sestavit i vývojové prostředí, aby testy běžely s opravenou verzí.
Verzi PHP určete na jednom místě, například v Dockerfile nebo v .ddev/config.yaml, a při aktualizacích ji měňte společně s konfigurací serveru.
Jak konkrétně pomáhá PHP SOS?
V rámci bezpečnostní servisní smlouvy dbáme na to, aby vývoj a provoz do sebe zapadaly:
- Srovnání: Porovnáme verzi PHP a rozšíření ve vývojovém, testovacím a živém prostředí.
- Postup aktualizace: Nová vydání PHP se nejprve nasadí v testovacím prostředí, poté naostro, vždy s restartem.
- Kontrola nasazení: Dbáme na to, aby se na server nedostalo vývojové ini, testovací soubory ani přístupové údaje.
- Dokumentace: Kdykoli víte, jaká verze kde běží.
Časté dotazy
Smím vestavěný webový server PHP používat veřejně?
Ne. Příručka PHP výslovně uvádí, že server spuštěný pomocí php -S slouží k vývoji a nemá se používat ve veřejné síti. Pro provoz patří PHP-FPM s Nginx nebo Apache.
Co je DDEV?
DDEV je nástroj, který staví na Dockeru a vytváří hotová vývojová prostředí pro projekty v PHP. Zná typy projektů pro WordPress, TYPO3, Shopware 6, Laravel, Drupal a další systémy.
Stačí aktualizovat lokální verzi PHP?
Ne. Proti zranitelnostem jako PHP2Shell se počítá běhové prostředí PHP, které skutečně odpovídá, tedy to na serveru. Lokální prostředí by ale mělo mít stejnou verzi, aby byly testy vypovídající.
Jakou php.ini použít lokálně?
Lokálně dává smysl php.ini-development, protože zobrazuje chyby. V produkci je třeba použít php.ini-production. Oficiální image Dockeru obsahují obě šablony.