Накратко: За локална разработка с PHP има три разпространени пътя: вграденият уеб сървър (php -S) за бързи опити, официалните Docker образи на PHP за възпроизводими среди и инструменти като DDEV, които създават готови проектни среди за WordPress, TYPO3, Shopware или Laravel. Решаващо е не толкова инструментът, колкото съвпадението: локално трябва да работи същата версия на PHP със същите разширения като в продукция. За сигурността в крайна сметка винаги е от значение средата за изпълнение на сървъра.
Защо отделна среда за разработка?
Промените директно на живия сървър са рисковани: всяка грешка в написването е веднага видима за клиентите, а тестовите файлове лесно остават. Локалната среда отделя експериментирането от експлоатацията. Тя е същевременно мястото, където първо се тестват новите версии на PHP и актуализациите за сигурност.
За ръководството и ИТ директорите въпросът затова не е дали има среда за разработка, а дали тя съответства на живата система. Локална среда с PHP 8.4, докато в продукция още работи 8.1, замъглява проблемите, вместо да ги показва. Същото важи за версията на базата данни, уеб сървъра и разширения като intl, gd или pdo_mysql: дори едно липсващо разширение може да доведе до това грешката да проличи едва в продукция.
Опциите накратко
| Опция | Подходяща за | Силни страни | Граници |
|---|---|---|---|
Вграден сървър php -S |
кратки опити, малки скриптове | без инсталиране на друг софтуер | не е заместител на Nginx или Apache, не за публични мрежи |
| Официален Docker образ | екипи, възпроизводими среди | версията се определя с таг, близо до работа с контейнери | конфигурацията и взаимодействието на няколко контейнера се правят сами |
| DDEV | проекти с CMS и фреймуърци | готови типове проекти, включени база данни и уеб сървър | изисква Docker, собствени конвенции |
| Локално инсталиран PHP | отделни разработчици | бързо, директно | версиите на няколко проекта трудно се поддържат паралелно |
Вграденият уеб сървър
От PHP 5.4 командният ред съдържа малък уеб сървър. Той стартира в текущата директория или с -t в друга директория на документите:
php -S localhost:8000 -t public/
По желание подавате router скрипт, който се изпълнява първи при всяка заявка. Ръководството е недвусмислено в оценката: сървърът трябва да подпомага разработката, не е пълноценен уеб сървър и не бива да се използва в публична мрежа. Затова го свързвайте към localhost, не към 0.0.0.0, иначе при някои обстоятелства е достъпен във фирмената или хотелската Wi-Fi мрежа. Повече за командния ред има в PHP в командния ред.
Docker: официални образи на PHP
Официалните образи съществуват в няколко варианта: cli за командния ред, apache с Apache и mod_php, fpm за работа зад Nginx или друго прокси, както и варианти с Alpine за малки образи. Бърз старт с Apache:
docker run --rm -p 8080:80 -v "$PWD":/var/www/html php:8.4-apache
Образите съдържат шаблоните php.ini-development и php.ini-production в директорията $PHP_INI_DIR. Локално е разумен шаблонът за разработка, защото показва грешките. За продукция документацията на образа изрично препоръчва шаблона за продукция. Разширенията се инсталират с доставените помощни скриптове docker-php-ext-configure, docker-php-ext-install и docker-php-ext-enable. Как работят таговете и digest, обяснява Официални Docker образи на PHP.
DDEV: готови среди за CMS и фреймуърци
DDEV се основава на Docker и настройва за един проект уеб сървър, PHP, база данни и помощни услуги. Ръководствата за бърз старт почти винаги следват един и същ модел:
ddev config --project-type=wordpress --docroot=web
ddev start
ddev composer install
ddev launch
Като типове проекти DDEV познава, наред с други, wordpress, typo3, shopware6, laravel, symfony, drupal11, magento2 и общия тип php. Версията на PHP се определя в .ddev/config.yaml; според документацията са възможни версии от 5.6 до 8.5, по подразбиране е 8.4:
# .ddev/config.yaml (откъс)
php_version: "8.3"
webserver_type: nginx-fpm # алтернативно apache-fpm
Така локалната среда съответства на версията в продукция, дори тя още да не е най-новата.
Локална разработка, състояние на пачовете и PHP2Shell
След PHP2Shell няколко доставчици на платформи обърнаха внимание на типична грешка в разсъжденията. Vercel подчертава според бюлетина, че актуализацията на локалната среда за разработка, на кода на приложението или на плъгините не е достатъчна; решаваща е PHP средата за изпълнение, която действително обслужва заявките. Ако локално имате PHP 8.4.27, това не защитава сървъра с 8.4.26.
Обратно, средата за разработка носи собствени рискове, които могат да мигрират към продукцията:
- Ini за разработка в продукция:
display_errorsе включен вphp.ini-development. Ако този файл попадне на сървъра, посетителите виждат пътища и съобщения за грешки. Вижте Изключване на извеждането на грешки в продукция. - Забравени тестови файлове: файловете
phpinfo(), дъмповете на бази данни или файловете.envс данни за достъп не принадлежат към внедряването. - Отворени сървъри за разработка:
php -Sили контейнери с публикувани портове на компютри в мрежата. - Остарели образи: Локалните образи не се актуализират сами; след издание на PHP за сигурност и средата за разработка трябва да се изгради наново, за да се тества с коригираната версия.
Определяйте версията на PHP на едно място, например в Dockerfile или в .ddev/config.yaml, и я променяйте при актуализации заедно с конфигурацията на сървъра.
Как помага PHP SOS конкретно?
В договора за поддръжка на сигурността се грижим разработката и експлоатацията да си пасват:
- Съпоставяне: Сравняваме версията на PHP и разширенията в средите за разработка, тестване и продукция.
- Процес на актуализиране: Новите издания на PHP първо се внедряват в тестовата среда, после в продукция, всеки път с рестартиране.
- Проверка на внедряването: Следим в сървъра да не попадат ini за разработка, тестови файлове или данни за достъп.
- Документация: Знаете по всяко време коя версия къде работи.
Често задавани въпроси
Мога ли да използвам вградения уеб сървър на PHP публично?
Не. Ръководството на PHP изрично казва, че сървърът, стартиран с php -S, служи за разработка и не бива да се използва в публична мрежа. За експлоатация са нужни PHP-FPM с Nginx или Apache.
Какво е DDEV?
DDEV е инструмент, изграден върху Docker, който създава готови среди за разработка за PHP проекти. Той познава типове проекти за WordPress, TYPO3, Shopware 6, Laravel, Drupal и други системи.
Достатъчно ли е да актуализирам локалната версия на PHP?
Не. Срещу уязвимости като PHP2Shell важи PHP средата за изпълнение, която действително обслужва заявките, т.е. тази на сървъра. Локалната среда обаче трябва да е със същата версия, за да са тестовете смислени.
Кой php.ini да използвам локално?
Локално е разумно да се ползва php.ini-development, защото показва грешките. В продукция трябва да се използва php.ini-production. Официалните Docker образи носят и двата шаблона.