Trumpai: PHP kurti lokaliai yra trys įprasti būdai: įmontuotas žiniatinklio serveris (php -S) greitiems bandymams, oficialūs PHP Docker atvaizdai atkuriamoms aplinkoms ir tokie įrankiai kaip DDEV, kurie sukuria paruoštas projekto aplinkas WordPress, TYPO3, Shopware ar Laravel. Lemia ne tiek įrankis, kiek atitikimas: lokaliai turėtų veikti ta pati PHP versija su tais pačiais plėtiniais kaip gyvoje aplinkoje. Saugumui galiausiai visada svarbi vykdymo aplinka serveryje.
Kodėl reikalinga atskira kūrimo aplinka?
Pakeitimus daryti tiesiai gyvame serveryje rizikinga: kiekviena klaida iškart matoma klientams, o testiniai failai mėgsta likti. Lokali aplinka atskiria bandymus nuo eksploatacijos. Ji kartu yra vieta, kurioje pirmiausia išbandomos naujos PHP versijos ir saugumo atnaujinimai.
Vadovybei ir IT vadovams klausimas todėl yra ne tai, ar kūrimo aplinka yra, o tai, ar ji atitinka gyvą sistemą. Lokali aplinka su PHP 8.4, kai gyvoje dar veikia 8.1, problemas slepia, užuot jas parodžiusi. Tas pats galioja duomenų bazės versijai, žiniatinklio serveriui ir plėtiniams, tokiems kaip intl, gd ar pdo_mysql: net vienas trūkstamas plėtinys gali lemti, kad klaida išryškės tik gyvoje aplinkoje.
Parinkčių apžvalga
| Parinktis | Tinka | Stiprybės | Ribos |
|---|---|---|---|
Įmontuotas serveris php -S |
trumpiems bandymams, mažiems skriptams | be papildomos programinės įrangos diegimo | neatstoja Nginx ar Apache, netinka viešiems tinklams |
| Oficialus Docker atvaizdas | komandoms, atkuriamoms aplinkoms | versiją galima nustatyti pagal žymę, artima konteinerinei veiklai | konfigūraciją ir kelių konteinerių sąveiką tenka kurti patiems |
| DDEV | CMS ir karkasų projektams | paruošti projektų tipai, duomenų bazė ir žiniatinklio serveris įskaičiuoti | reikalauja Docker, savos konvencijos |
| Lokaliai įdiegtas PHP | pavieniams kūrėjams | greita, tiesiogiai | sunku lygiagrečiai laikyti kelių projektų versijas |
Įmontuotas žiniatinklio serveris
Nuo PHP 5.4 komandinė eilutė turi nedidelį žiniatinklio serverį. Jis paleidžiamas esamame kataloge arba su -t kitame dokumentų kataloge:
php -S localhost:8000 -t public/
Pasirinktinai galite perduoti maršrutizatoriaus skriptą, kuris vykdomas pirmiausia per kiekvieną užklausą. Vadovas klasifikuoja aiškiai: serveris skirtas padėti kūrimui, nėra pilnavertis žiniatinklio serveris ir neturi būti naudojamas viešame tinkle. Todėl susiekite jį su localhost, o ne su 0.0.0.0, antraip jis gali būti pasiekiamas įmonės ar viešbučio WLAN tinkle. Daugiau apie komandinę eilutę skyriuje PHP komandinėje eilutėje.
Docker: oficialūs PHP atvaizdai
Oficialūs atvaizdai teikiami keliais variantais: cli komandinei eilutei, apache su Apache ir mod_php, fpm veiklai už Nginx ar kito tarpinio serverio (proxy), taip pat Alpine variantai mažiems atvaizdams. Greita pradžia su Apache:
docker run --rm -p 8080:80 -v "$PWD":/var/www/html php:8.4-apache
Atvaizduose yra šablonai php.ini-development ir php.ini-production kataloge $PHP_INI_DIR. Lokaliai prasmingas kūrimo šablonas, nes jis rodo klaidas. Produkcijai atvaizdų dokumentacija aiškiai rekomenduoja produkcijos šabloną. Plėtinius įdiegiate su pateikiamais pagalbiniais skriptais docker-php-ext-configure, docker-php-ext-install ir docker-php-ext-enable. Kaip veikia žymės ir santraukos (digest), paaiškina Oficialūs PHP Docker atvaizdai.
DDEV: paruoštos aplinkos CMS ir karkasams
DDEV remiasi Docker ir projektui įrengia žiniatinklio serverį, PHP, duomenų bazę ir pagalbines paslaugas. Greitosios pradžios instrukcijos beveik visada seka tuo pačiu šablonu:
ddev config --project-type=wordpress --docroot=web
ddev start
ddev composer install
ddev launch
Kaip projektų tipus DDEV žino, be kita ko, wordpress, typo3, shopware6, laravel, symfony, drupal11, magento2 ir bendrąjį tipą php. PHP versiją nustatote faile .ddev/config.yaml; pasak dokumentacijos, galimos versijos nuo 5.6 iki 8.5, numatytoji yra 8.4:
# .ddev/config.yaml (ištrauka)
php_version: "8.3"
webserver_type: nginx-fpm # arba apache-fpm
Taip lokali aplinka atitinka gyvą versiją, net jei ši dar nėra naujausia.
Lokalus kūrimas, pataisų būsena ir PHP2Shell
Po PHP2Shell keli platformų teikėjai atkreipė dėmesį į tipišką mąstymo klaidą. Vercel biuletenyje pabrėžia, kad lokalios kūrimo aplinkos, programos kodo ar papildinių atnaujinimo nepakanka; lemia PHP vykdymo aplinka, kuri iš tikrųjų teikia turinį. Lokaliai turėti PHP 8.4.27 serverio su 8.4.26 neapsaugo.
Priešingai, kūrimo aplinka atneša savų rizikų, kurios gali patekti į produkciją:
- Kūrimo ini produkcijoje:
display_errorsfailephp.ini-developmentįjungtas. Jei šis failas patenka į serverį, lankytojai mato kelius ir klaidų pranešimus. Žr. Klaidų rodymo išjungimas produkcijoje. - Užmiršti testiniai failai:
phpinfo()failai, duomenų bazės iškrovos ar.envfailai su prieigos duomenimis diegime neturi būti. - Atviri kūrimo serveriai:
php -Sar konteineriai su paskelbtais prievadais tinkle esančiuose kompiuteriuose. - Pasenę atvaizdai: lokalūs atvaizdai patys neatnaujinami; po PHP saugumo leidimo ir kūrimo aplinką reikia sukurti iš naujo, kad testai veiktų su ištaisyta versija.
Nustatykite PHP versiją vienoje vietoje, pavyzdžiui, Dockerfile ar .ddev/config.yaml, ir atnaujinimų metu keiskite ją kartu su serverio konfigūracija.
Kaip PHP SOS padeda konkrečiai?
Pagal saugumo priežiūros sutartį rūpinamės, kad kūrimas ir eksploatacija derėtų:
- Palyginimas: lyginame kūrimo, testavimo ir gyvos aplinkos PHP versiją ir plėtinius.
- Atnaujinimo eiga: nauji PHP leidimai pirmiausia įdiegiami testavimo aplinkoje, po to gyvoje, kiekvieną kartą su paleidimu iš naujo.
- Diegimo patikra: žiūrime, kad į serverį nepatektų kūrimo ini, testiniai failai ar prieigos duomenys.
- Dokumentacija: bet kuriuo metu žinote, kuri versija kur veikia.
Dažni klausimai
Ar galiu įmontuotą PHP žiniatinklio serverį naudoti viešai?
Ne. PHP vadovas aiškiai sako, kad su php -S paleistas serveris skirtas kūrimui ir neturi būti naudojamas viešame tinkle. Eksploatacijai skirti PHP-FPM su Nginx arba Apache.
Kas yra DDEV?
DDEV yra įrankis, sukurtas ant Docker, kuris sukuria paruoštas PHP projektų kūrimo aplinkas. Jis žino projektų tipus WordPress, TYPO3, Shopware 6, Laravel, Drupal ir kitoms sistemoms.
Ar pakanka atnaujinti lokalią PHP versiją?
Ne. Nuo spragų, tokių kaip PHP2Shell, svarbi PHP vykdymo aplinka, kuri iš tikrųjų teikia turinį, t. y. serveryje. Tačiau lokali aplinka turėtų turėti tą pačią versiją, kad testai būtų prasmingi.
Kokį php.ini naudoti lokaliai?
Lokaliai prasminga php.ini-development, nes jis rodo klaidas. Produkcijoje reikia naudoti php.ini-production. Oficialūs Docker atvaizdai turi abu šablonus.