# Локална разработка с PHP: Docker, DDEV и други

> Локална разработка с PHP с вградения сървър, Docker или DDEV: силни страни, граници, примери и как разработката и продукцията остават еднакви по пачовете.

Източник: https://phpsos.de/bg/php/php-lokal-entwickeln/  
Актуалност: 25.10.2026  
Доставчик: PHP SOS, Спешна помощ за PHP и сигурност на сървъри. Незабавна помощ по WhatsApp: https://wa.me/491736494914?text=%D0%97%D0%B4%D1%80%D0%B0%D0%B2%D0%B5%D0%B9%D1%82%D0%B5%2C%20PHP%20SOS%2C%20%D0%B8%D0%BC%D0%B0%D0%BC%D0%B5%20%D0%BD%D1%83%D0%B6%D0%B4%D0%B0%20%D0%BE%D1%82%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%20%D1%81%20%D0%BD%D0%B0%D1%88%D0%B8%D1%8F%20PHP%20%D1%81%D1%8A%D1%80%D0%B2%D1%8A%D1%80.%20%D0%A4%D0%B8%D1%80%D0%BC%D0%B0%3A%20%E2%80%A6%20%D0%A3%D0%B5%D0%B1%D1%81%D0%B0%D0%B9%D1%82%3A%20%E2%80%A6

**Накратко:** За локална разработка с 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` в друга директория на документите:

```bash
php -S localhost:8000 -t public/
```

По желание подавате router скрипт, който се изпълнява първи при всяка заявка. Ръководството е недвусмислено в оценката: сървърът трябва да подпомага разработката, не е пълноценен уеб сървър и не бива да се използва в публична мрежа. Затова го свързвайте към `localhost`, не към `0.0.0.0`, иначе при някои обстоятелства е достъпен във фирмената или хотелската Wi-Fi мрежа. Повече за командния ред има в [PHP в командния ред](https://phpsos.de/bg/php/php-cli/).

## Docker: официални образи на PHP

Официалните образи съществуват в няколко варианта: `cli` за командния ред, `apache` с Apache и mod_php, `fpm` за работа зад Nginx или друго прокси, както и варианти с Alpine за малки образи. Бърз старт с Apache:

```bash
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](https://phpsos.de/bg/blog/offizielle-php-docker-images/).

## DDEV: готови среди за CMS и фреймуърци

DDEV се основава на Docker и настройва за един проект уеб сървър, PHP, база данни и помощни услуги. Ръководствата за бърз старт почти винаги следват един и същ модел:

```bash
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:

```yaml
# .ddev/config.yaml (откъс)
php_version: "8.3"
webserver_type: nginx-fpm   # алтернативно apache-fpm
```

Така локалната среда съответства на версията в продукция, дори тя още да не е най-новата.

## Локална разработка, състояние на пачовете и PHP2Shell

След PHP2Shell няколко доставчици на платформи обърнаха внимание на типична грешка в разсъжденията. Vercel подчертава според бюлетина, че актуализацията на локалната среда за разработка, на кода на приложението или на плъгините не е достатъчна; решаваща е PHP средата за изпълнение, която действително обслужва заявките. Ако локално имате PHP 8.4.27, това не защитава сървъра с 8.4.26.

Обратно, средата за разработка носи собствени рискове, които могат да мигрират към продукцията:

1. **Ini за разработка в продукция:** `display_errors` е включен в `php.ini-development`. Ако този файл попадне на сървъра, посетителите виждат пътища и съобщения за грешки. Вижте [Изключване на извеждането на грешки в продукция](https://phpsos.de/bg/blog/display-errors-produktion/).
2. **Забравени тестови файлове:** файловете `phpinfo()`, дъмповете на бази данни или файловете `.env` с данни за достъп не принадлежат към внедряването.
3. **Отворени сървъри за разработка:** `php -S` или контейнери с публикувани портове на компютри в мрежата.
4. **Остарели образи:** Локалните образи не се актуализират сами; след издание на PHP за сигурност и средата за разработка трябва да се изгради наново, за да се тества с коригираната версия.

> **Съвет:**
> Определяйте версията на PHP на едно място, например в Dockerfile или в `.ddev/config.yaml`, и я променяйте при актуализации заедно с конфигурацията на сървъра.

## Как помага PHP SOS конкретно?

В [договора за поддръжка на сигурността](https://phpsos.de/bg/leistungen/security-wartungsvertrag/) се грижим разработката и експлоатацията да си пасват:

- **Съпоставяне:** Сравняваме версията на 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 образи носят и двата шаблона.

## Източници

- [Ръководство на PHP: Вграден уеб сървър](https://www.php.net/manual/en/features.commandline.webserver.php)
- [Docker Official Image: PHP](https://hub.docker.com/_/php)
- [DDEV](https://ddev.com/)
