Я PHP разработчик, решил поделиться с Хабром своим опытом в части того, как подготовить на своем компьютере окружение, чтобы можно было создавать сайты PHP. Будет пример для Drupal. Но Drupal или нет, даже не важно, подойдет для любого другого PHP проекта. Грамотная настройка компьютера для разработки поможет в дальнейшем не тратить время и нервы. Этим придется пользоваться каждый день, поэтому стоит уделить время и сделать все так, чтобы было удобно пользоваться.
А что вообще надо чтобы запустился PHP сайт? Обычно нужен целый стек сервисов. Кроме того, чтобы не возникало ситуации: "локально работает, а на сервере - нет", необходимо чтобы сайт локально работал в окружении максимально похожем на то, как если бы сайт находился у провайдера. Это сам web сервер, интерпретатор PHP, база данных, composer, git, почтовый сервис, какой нибудь сервис для хранения индекса поиска (Solr например). Еще чтобы работал валидный https. Наверняка нужен node чтобы скомпилировать scss. То есть для того, чтобы программист мог вести разработку, это все надо иметь на локальном компьютере. Также надо иметь возможность менять версии всех этих сервисов. А для работы в команде необходимо, чтобы у всех разработчиков было одинаково настроенное окружение.
В этой задаче может быть много разных вариантов решения: от "поставить все это по отдельности на свой компьютер" до "разложить все сервисы по docker контейнерам, соединить их и использовать". Эти обе крайности имеют свои недостатки. Если все поставить на компьютер, то будет непросто работать с несколькими проектами у которых разные требования например к версиям сервисов. Настраивать Docker контейнеры это очень интересно, но сложно и вообще не про программирование.
Хорошо что существуют средства, созданные специально для упрощение настройки локальной среды разработки на PHP. Одно из них DDEV. DDEV это абстракция над docker с открытым исходным кодом. Вам не приходится работать с командами docker: перенаправлять порты, пробрасывать переменные и тому подобное. Там это уже настроено. Из коробки имеется один конфигурационный файл: config.yaml в нем есть описание возможных параметров. Самые основные: можно выбрать версию PHP тип и версию базы данных, тип веб-сервера, и другие. Причем эти настройки индивидуальны для каждого проекта и можно запускать несколько сайтов одновременно, они друг другу мешать не будут. Это решение работает на Маке (любой процессор), Линуксе и Винде.
Установка
У DDEV есть хорошая документация в том числе и раздел установка. На примере для MacOS: сначала устанавливается Docker Desktop или Colima. Затем, с помощью менеджера пакетов brew устанавливается сам DDEV.
brew install drud/ddev/ddev
mkcert -install
Создание нового проекта
Опять же на примере для MacOS. В терминале создаем папку где будут находится все проекты. Это папка Projects в домашней папке пользователя.
cd ~
mkdir Projects
cd Projects
Затем создаем папку самого проекта. Она будет называться my-ddev-test
mkdir my-ddev-test
cd my-ddev-test
Теперь надо загрузить в эту папку Drupal. Это можно сделается с помощью composer:
composer create-project drupal/recommended-project .
Теперь инициализируем DDEV в этой же папке
ddev config
Запустится мастер создания проекта: предлагается выбрать имя проекта (обычно совпадает с названием папки, но имя должно быть уникальным), название папки в которой веб-сервер будет искать файлы сайта (он ее определит сам, для Drupal это <project_folder>/web), а так же тип проекта (тоже определит сам). DDEV умеет подстраиваться под работу с популярными CMS: backdrop, drupal10, drupal6, drupal7, drupal8, drupal9, laravel, magento, magento2, php, shopware6, typo3, wordpress. Выбрав из списка, мы получим готовый конфигурационный файл с настройками для базы данных.
Выглядит это так:
Я специально спрятал файлы Drupal которые мы сначала загрузили с помощью composer, чтобы показать что именно создается при инициализации проекта DDEV. Это сама папка .ddev, в ней главный файл настроек config.yaml, и конфигурации в соответствии с выбранным типом проекта. То есть web/sites/default/settings.php Это тот файл в котором Drupal видит кроме прочих настроек, настройки подключения к базе. Файл web/sites/default/settings.ddev.php динамически генерируется и инжектится в основной файл настроек.
Запуск и основные команды
Чтобы запустить проект надо в терминале в папке проекта (там где находится .ddev) выполнить
ddev start
При первом запуске будут скачаны необходимые Docker image. Они не будут храниться в папке проекта и повторно, например для нового проекта, скачиваться не будут. Проект запустится и в ответ в терминале мы увидим URL по которому сайт можно отрыть в браузере.
Команда
ddev describe
покажет основные данные проекта.
Да, сразу из коробки доступны Mailhog и PHPMyAdmin.
Вот описание всех команд. А вот основные, которые будут использоваться каждый день:
ddev config - создать проект, поменять настройки. (Так же можно менять файл настроек вручную).
ddev start - запустить проект
ddev stop - остановить проект
ddev delete - удалить проект
ddev poweroff - остановить все проекты
ddev xdebug on - включить отладчик кода xdebug
ddev xdebug off - выключить отладчик кода xdebug
Отдельно надо упомянуть эти команды:
ddev sequelace - запускает менеджер базы дынных Sequel Ace или Sequel pro смотря что у вас установлено. То есть даже не надо прописывать параметры подключения, DDEV сам их передает!
ddev ssh - вход в консоль контейнера. Это как если бы подключились к хостинг серверу по ssh. Например можно внутри контейнера установить Node version manager и использовать для компиляции темы. Из коробки node присутствует в виде трех последних версий.
ddev logs -help - Можно почитать, как смотреть логи сервера. Например чтобы посмотреть логи базы данных надо выполнить: ddev logs -s db
Запущенные контейнеры их статусы и логи можно посмотреть так же в Docker desktop dashboard.
Через команду ddev <команда> выполняется ваша команда внутри контейнера. То есть чтобы например очистить кеш Drupal через drush надо выполнить:
ddev drush cr
Либо войти в контейнер с ddev ssh и затем как обычно drush cr
Что это за Drush?
У Drupal есть команды, которые запускаются в консоли. Это очень мощная фича, помогает автоматически генерировать код, включать/выключать модули, сбрасывать пароли пользователей, генерировать одноразовые URL для входа в админку, исполнять отдельные методы классов и очень много чего еще. Drush это то, чем разработчик Drupal пользуется постоянно.
Composer тоже лучше запускать внутри контейнера (ddev composer install), тогда он будет видеть правильную версию PHP, а не ту, что установлена у вас на на компьютере.
Настройки
Основные настройки в файле .ddev/config.yaml В документации есть описание как внести расширенные настройки. Если необходимо внести изменения в php.ini, то создаем файл .ddev/php/my-php.ini с настройками. Пример:
[PHP]
max_execution_time = 240;
Если необходимо внести изменения в настройки MySql, то создаем файл .ddev/mysql/my.cnf с настройками. Пример:
[mysqld]
collation-server = utf8_general_ci
character-set-server = utf8
innodb_large_prefix=false
Есть описание как добавлять дополнительные сервисы. Например если нужен Solr, то необходимо выполнить:
ddev get drud/ddev-drupal9-solr
Добавится контейнер, который будет доступен в вашем проекте.
После внесения изменений в конфигурацию проекта его необходимо перезапустить, чтобы изменения вступили в силу: ddev restart или просто ddev start
Заключение
Существуют и другие подобные "надстройки" над docker. Я работал с Docksal, вероятно имеются и другие. DDEV действительно удобно использовать. Работает стабильно и быстро. Имеется хорошая документация. Можно настроить любые параметры в этом окружении. То есть воссоздать локально окружение, которое есть на боевом сервере у провайдера. Главный плюс, это то, что программист может больше заниматься программированием, а не devops задачами. Кроме того, настройки DDEV могут и должны храниться в репозитории проекта, в git вместе с кодом сайта. В этом случает другой программист или вы сами просто запускаете ddev start и получаете сразу готовое, настроенное как надо для данного сайта окружение.