Stručne: Na lokálny vývoj PHP existujú tri bežné cesty: vstavaný webový server (php -S) na rýchle pokusy, oficiálne obrazy PHP pre Docker pre reprodukovateľné prostredia a nástroje ako DDEV, ktoré vytvárajú hotové projektové prostredia pre WordPress, TYPO3, Shopware alebo Laravel. Rozhodujúci je menej nástroj než zhoda: lokálne by mala bežať rovnaká verzia PHP s rovnakými rozšíreniami ako naostro. Pre bezpečnosť však nakoniec vždy rozhoduje prostredie na serveri.
Prečo vlastné vývojové prostredie?
Robiť zmeny priamo na živom serveri je riskantné: každý preklep je okamžite viditeľný pre zákazníkov a testovacie súbory tam radi zostanú. Lokálne prostredie oddeľuje skúšanie od prevádzky. Je zároveň miestom, kde sa nové verzie PHP a bezpečnostné aktualizácie testujú ako prvé.
Pre vedenie firmy a vedúcich IT preto otázka nie je, či vývojové prostredie existuje, ale či zodpovedá živému systému. Lokálne prostredie s PHP 8.4, kým naostro beží ešte 8.1, problémy zahmlieva namiesto toho, aby ich ukázalo. To isté platí pre verziu databázy, webový server a rozšírenia ako intl, gd alebo pdo_mysql: už jedno chýbajúce rozšírenie môže spôsobiť, že sa chyba prejaví až naostro.
Možnosti v prehľade
| Možnosť | Vhodné pre | Silné stránky | Hranice |
|---|---|---|---|
Vstavaný server php -S |
krátke pokusy, malé skripty | bez inštalácie ďalšieho softvéru | nie je náhradou za Nginx alebo Apache, nie pre verejné siete |
| Oficiálny obraz Dockeru | tímy, reprodukovateľné prostredia | verziu možno určiť tagom, blízko prevádzke v kontajneroch | konfiguráciu a súčinnosť viacerých kontajnerov si treba postaviť sám |
| DDEV | projekty CMS a frameworkov | hotové typy projektov, databáza a webový server v cene | vyžaduje Docker, vlastné konvencie |
| Lokálne nainštalované PHP | jednotliví vývojári | rýchle, priame | verzie viacerých projektov sa ťažko udržiavajú paralelne |
Vstavaný webový server
Od PHP 5.4 obsahuje príkazový riadok malý webový server. Spustí sa v aktuálnom adresári alebo pomocou -t v inom adresári dokumentov:
php -S localhost:8000 -t public/
Voliteľne môžete odovzdať skript routera, ktorý sa pri každej požiadavke spustí ako prvý. Príručka je pri zaradení jednoznačná: server má podporovať vývoj, nie je plnohodnotným webovým serverom a nemá sa používať vo verejnej sieti. Viažte ho preto na localhost, nie na 0.0.0.0, inak môže byť za istých okolností dostupný vo firemnej alebo hotelovej sieti WiFi. Viac o príkazovom riadku v PHP v príkazovom riadku.
Docker: oficiálne obrazy PHP
Oficiálne obrazy existujú vo viacerých variantoch: cli pre príkazový riadok, apache s Apache a mod_php, fpm pre prevádzku za Nginx alebo iným proxy, k tomu varianty Alpine pre malé obrazy. Rýchly štart s Apache:
docker run --rm -p 8080:80 -v "$PWD":/var/www/html php:8.4-apache
Obrazy obsahujú šablóny php.ini-development a php.ini-production v adresári $PHP_INI_DIR. Lokálne dáva zmysel vývojová šablóna, pretože zobrazuje chyby. Pre produkciu dokumentácia obrazu výslovne odporúča produkčnú šablónu. Rozšírenia nainštalujete dodávanými pomocnými skriptmi docker-php-ext-configure, docker-php-ext-install a docker-php-ext-enable. Ako fungujú tagy a digesty, vysvetľuje Oficiálne obrazy PHP pre Docker.
DDEV: hotové prostredia pre CMS a frameworky
DDEV stavia na Dockeri a pre projekt nastaví webový server, PHP, databázu a pomocné služby. Rýchle návody na štart takmer vždy nasledujú rovnaký vzor:
ddev config --project-type=wordpress --docroot=web
ddev start
ddev composer install
ddev launch
Ako typy projektov pozná DDEV okrem iného wordpress, typo3, shopware6, laravel, symfony, drupal11, magento2 a všeobecný typ php. Verziu PHP určíte v .ddev/config.yaml; podľa dokumentácie sú možné verzie od 5.6 po 8.5, štandard je 8.4:
# .ddev/config.yaml (výrez)
php_version: "8.3"
webserver_type: nginx-fpm # alternatívne apache-fpm
Lokálne prostredie tak zodpovedá živej verzii, aj keď ešte nie je najnovšia.
Lokálny vývoj, stav záplat a PHP2Shell
Po PHP2Shell viacerí poskytovatelia platforiem upozornili na typickú chybu v úsudku. Vercel podľa bulletinu zdôrazňuje, že aktualizácia lokálneho vývojového prostredia, aplikačného kódu alebo pluginov nestačí; rozhodujúce je prostredie PHP, ktoré skutočne odpovedá. Mať lokálne PHP 8.4.27 nechráni server s 8.4.26.
Naopak, vývojové prostredie prináša vlastné riziká, ktoré sa môžu preniesť do produkcie:
- Vývojový ini v produkcii:
display_errorsje vphp.ini-developmentzapnuté. Ak sa tento súbor dostane na server, návštevníci vidia cesty a chybové hlásenia. Pozri Vypnutie výpisu chýb v produkcii. - Zabudnuté testovacie súbory: súbory
phpinfo(), výpisy databázy alebo súbory.envs prístupovými údajmi do nasadenia nepatria. - Otvorené vývojové servery:
php -Salebo kontajnery so zverejnenými portmi na počítačoch v sieti. - Zastarané obrazy: Lokálne obrazy sa neaktualizujú samy; po bezpečnostnom vydaní PHP sa má znova zostaviť aj vývojové prostredie, aby testy bežali s opravenou verziou.
Verziu PHP určte na jednom mieste, napríklad v Dockerfile alebo v .ddev/config.yaml, a pri aktualizáciách ju meňte spoločne s konfiguráciou servera.
Ako PHP SOS konkrétne pomáha?
V zmluve o bezpečnostnej údržbe dbáme na to, aby vývoj a prevádzka k sebe pasovali:
- Porovnanie: Porovnávame verziu PHP a rozšírenia vo vývojovom, testovacom a živom prostredí.
- Postup aktualizácie: Nové vydania PHP sa nasadzujú najprv v testovacom prostredí, potom naostro, vždy s reštartom.
- Kontrola nasadenia: Dbáme na to, aby sa na server nedostal vývojový ini, testovacie súbory ani prístupové údaje.
- Dokumentácia: Kedykoľvek viete, ktorá verzia kde beží.
Časté otázky
Smiem vstavaný webový server PHP používať verejne?
Nie. Príručka PHP výslovne uvádza, že server spustený pomocou php -S slúži na vývoj a nemá sa používať vo verejnej sieti. Do prevádzky patrí PHP-FPM s Nginx alebo Apache.
Čo je DDEV?
DDEV je nástroj, ktorý stavia na Dockeri a vytvára hotové vývojové prostredia pre projekty PHP. Pozná typy projektov pre WordPress, TYPO3, Shopware 6, Laravel, Drupal a ďalšie systémy.
Stačí aktualizovať lokálnu verziu PHP?
Nie. Proti zraniteľnostiam ako PHP2Shell rozhoduje prostredie PHP, ktoré skutočne odpovedá, teda to na serveri. Lokálne prostredie by však malo mať rovnakú verziu, aby boli testy výpovedné.
Ktorý php.ini mám lokálne používať?
Lokálne dáva zmysel php.ini-development, pretože zobrazuje chyby. V produkcii patrí používať php.ini-production. Oficiálne obrazy Dockeru obsahujú obe šablóny.