Ukratko: Za lokalni razvoj PHP-a postoje tri uobičajena puta: ugrađeni web-poslužitelj (php -S) za brze pokušaje, službene PHP Docker slike za okruženja koja se mogu ponovno izgraditi i alati poput DDEV-a koji stvaraju gotova projektna okruženja za WordPress, TYPO3, Shopware ili Laravel. Odlučujući je manje alat, a više podudarnost: lokalno bi trebala raditi ista verzija PHP-a s istim ekstenzijama kao uživo. Za sigurnost je na kraju ipak uvijek važno okruženje izvođenja na poslužitelju.
Zašto zasebno razvojno okruženje?
Mijenjati izravno na živom poslužitelju rizično je: svaka tipfeler odmah je vidljiv kupcima, a testne datoteke rado ostaju ležati. Lokalno okruženje razdvaja isprobavanje od rada. Ujedno je mjesto na kojem se nove verzije PHP-a i sigurnosna ažuriranja najprije testiraju.
Za upravu i IT vodstvo pitanje stoga nije postoji li razvojno okruženje, nego odgovara li živom sustavu. Lokalno okruženje s PHP-om 8.4, dok uživo još radi 8.1, prikriva probleme umjesto da ih pokaže. Isto vrijedi za verziju baze podataka, web-poslužitelj i ekstenzije poput intl, gd ili pdo_mysql: već jedna nedostajuća ekstenzija može dovesti do toga da se pogreška primijeti tek uživo.
Mogućnosti u pregledu
| Mogućnost | Prikladno za | Prednosti | Granice |
|---|---|---|---|
Ugrađeni poslužitelj php -S |
kratke pokušaje, male skripte | bez instalacije dodatnog softvera | nije zamjena za Nginx ili Apache, ne za javne mreže |
| Službena Docker slika | timove, okruženja koja se mogu ponovno izgraditi | verzija se određuje tagom, blizu rada u containeru | konfiguraciju i suradnju više containera gradite sami |
| DDEV | CMS i framework projekte | gotovi tipovi projekata, uključeni baza podataka i web-poslužitelj | zahtijeva Docker, vlastite konvencije |
| Lokalno instaliran PHP | pojedinačne programere | brzo, izravno | verzije više projekata teško je držati paralelno |
Ugrađeni web-poslužitelj
Od PHP-a 5.4 naredbeni redak sadrži mali web-poslužitelj. Pokreće se u trenutačnom direktoriju ili s -t u drugom direktoriju dokumenata:
php -S localhost:8000 -t public/
Po želji predajete router skriptu koja se pri svakom zahtjevu izvršava prva. Priručnik je kod razvrstavanja nedvosmislen: poslužitelj treba podupirati razvoj, nije potpun web-poslužitelj i ne smije se koristiti u javnoj mreži. Vežite ga stoga na localhost, a ne na 0.0.0.0, jer inače može biti dostupan u WLAN-u tvrtke ili hotela. Više o naredbenom retku na stranici PHP u naredbenom retku.
Docker: službene PHP slike
Službene slike postoje u nekoliko varijanti: cli za naredbeni redak, apache s Apacheom i mod_php-om, fpm za rad iza Nginxa ili drugog proxyja, uz to Alpine varijante za male slike. Brz početak s Apacheom:
docker run --rm -p 8080:80 -v "$PWD":/var/www/html php:8.4-apache
Slike sadrže predloške php.ini-development i php.ini-production u direktoriju $PHP_INI_DIR. Lokalno je razvojni predložak smislen jer prikazuje pogreške. Za produkciju dokumentacija slike izričito preporučuje produkcijski predložak. Ekstenzije instalirate isporučenim pomoćnim skriptama docker-php-ext-configure, docker-php-ext-install i docker-php-ext-enable. Kako tagovi i digestovi funkcioniraju, objašnjava članak Službene PHP Docker slike.
DDEV: gotova okruženja za CMS i frameworke
DDEV se temelji na Dockeru i za projekt postavlja web-poslužitelj, PHP, bazu podataka i pomoćne usluge. Upute za brzi početak gotovo uvijek prate isti obrazac:
ddev config --project-type=wordpress --docroot=web
ddev start
ddev composer install
ddev launch
Kao tipove projekata DDEV, među ostalim, poznaje wordpress, typo3, shopware6, laravel, symfony, drupal11, magento2 i opći tip php. Verziju PHP-a određujete u .ddev/config.yaml; prema dokumentaciji moguće su verzije od 5.6 do 8.5, a zadana je 8.4:
# .ddev/config.yaml (izvadak)
php_version: "8.3"
webserver_type: nginx-fpm # alternativno apache-fpm
Tako lokalno okruženje odgovara živoj verziji, čak i kad ona još nije najnovija.
Lokalni razvoj, razina zakrpa i PHP2Shell
Nakon PHP2Shella nekoliko je pružatelja platformi ukazalo na tipičnu zabludu. Vercel prema biltenu naglašava da ažuriranje lokalnog razvojnog okruženja, koda aplikacije ili pluginova nije dovoljno; odlučujuće je PHP okruženje koje stvarno poslužuje stranice. Imati lokalno PHP 8.4.27 ne štiti poslužitelj s 8.4.26.
Obrnuto, razvojno okruženje donosi vlastite rizike koji mogu otputovati u produkciju:
- Razvojni ini u produkciji:
display_errorsje uphp.ini-developmentuključen. Ako ta datoteka dospije na poslužitelj, posjetitelji vide putanje i poruke o pogreškama. Vidi Isključivanje ispisa pogrešaka u produkciji. - Zaboravljene testne datoteke:
phpinfo()datoteke, dumpovi baze podataka ili.envdatoteke s pristupnim podacima ne pripadaju u deployment. - Otvoreni razvojni poslužitelji:
php -Sili containeri s objavljenim portovima na računalima u mreži. - Zastarjele slike: Lokalne se slike ne ažuriraju same od sebe; nakon PHP sigurnosnog izdanja i razvojno okruženje treba iznova izgraditi kako bi se testovi izvodili s ispravljenom verzijom.
Verziju PHP-a odredite na jednom mjestu, primjerice u Dockerfileu ili u .ddev/config.yaml, i pri ažuriranjima je mijenjajte zajedno s konfiguracijom poslužitelja.
Kako PHP SOS konkretno pomaže?
U sigurnosnom ugovoru o održavanju brinemo se da razvoj i rad budu usklađeni:
- Usporedba: Uspoređujemo verziju PHP-a i ekstenzije razvojnog, testnog i živog okruženja.
- Tijek ažuriranja: Nova PHP izdanja najprije se instaliraju u testnom okruženju, zatim uživo, svaki put s ponovnim pokretanjem.
- Provjera deploymenta: Pazimo da na poslužitelj ne dospiju razvojni ini, testne datoteke ili pristupni podaci.
- Dokumentacija: U svakom trenutku znate koja verzija gdje radi.
Česta pitanja
Smijem li ugrađeni PHP web-poslužitelj koristiti javno?
Ne. PHP priručnik izričito kaže da poslužitelj pokrenut s php -S služi razvoju i ne smije se koristiti u javnoj mreži. Za produkciju su potrebni PHP-FPM s Nginxom ili Apacheom.
Što je DDEV?
DDEV je alat koji se temelji na Dockeru i stvara gotova razvojna okruženja za PHP projekte. Poznaje tipove projekata za WordPress, TYPO3, Shopware 6, Laravel, Drupal i druge sustave.
Je li dovoljno ažurirati lokalnu verziju PHP-a?
Ne. Protiv ranjivosti poput PHP2Shella važi PHP okruženje koje stvarno poslužuje stranice, dakle ono na poslužitelju. Lokalno okruženje ipak bi trebalo imati istu verziju kako bi testovi bili vjerodostojni.
Koji php.ini koristim lokalno?
Lokalno je php.ini-development smislen jer prikazuje pogreške. U produkciji treba koristiti php.ini-production. Službene Docker slike donose oba predloška.