В этом руководстве я расскажу, как лучше всего начать работу с настройкой среды разработки PHP, и покажу вам, как настроить Docker. Существует так много способов настроить среду разработки PHP, но на данный момент лучше всего использовать Docker.
Я начну с краткой истории того, как люди настраивали свою среду разработки PHP на протяжении многих лет, что привело нас к тому, что мы имеем сейчас. Но если вы предпочитаете пропустить все это и просто запустить свой сервер, вы можете сразу перейти к этапам настройки.
Немного предыстории
Одна из проблем
Еще пару лет назад я отправлял всех, кого обучал, к отличной статье Бруно Скворца
Эта статья только из 2015 года, но пять или шесть лет — это эпоха в постоянно меняющихся временных масштабах
Я быстро подытожу, как все изменилось за эти годы.
1. Ручная установка PHP, MySQL и Apache
Если вы, как и я, достаточно взрослые, чтобы заниматься разработкой
Для настройки среды разработки требовался значительный опыт. Вам нужно было знать, как настроить
2. Предварительно настроенные пакеты, такие как XAMPP
К
Если вы побродите по различным группам PHP в Facebook, вы обнаружите, что значительная часть новых разработчиков все еще следуют руководствам той эпохи, а большое количество существующих разработчиков так и не ушли, поэтому XAMPP
Использование XAMPP упростило установку и запуск среды
3. Виртуальные машины и бродяги
В конце
В то время как многие программисты видели преимущества такой среды, трудности и время, необходимые для ее настройки, означали, что это сделали немногие. Так было до тех пор, пока не появился Vagrant (и связанные с ним инструменты, такие как Puppet), которые избавили вас от всех хлопот.
Взгляните на статью, на которую я ссылался ранее, для отличного описания Vagrant, виртуальных машин и преимуществ такой настройки среды разработки.
4. Докер
Вся эта предыстория подводит нас к сегодняшнему дню и к причине этой статьи. Если Vagrant такой классный, зачем использовать
Основные преимущества виртуальной среды, созданной с помощью Vagrant:
Ваш компьютер для разработки не привязан к определенной среде. Вы можете разместить несколько
Когда сайт запускается, он загружается точно в ту же среду, в которой он был разработан.
Легко понять, почему разработчики хотят этого. Следующий шаг к Docker сохраняет эти преимущества, избегая при этом некоторых недостатков сред Vagrant/Virtual Machine.
Что не так с Вагрантом?
Несмотря на преимущества, среда разработки на основе Vagrant имеет свой собственный набор ограничений и проблем.
Системные ресурсы. Vagrant требует запуска совершенно другой операционной системы. Вам необходимо загрузить и установить операционную систему, работающую на вашем
Вы должны убедиться, что виртуальная машина и сервер синхронизированы. Всякий раз, когда вы обновляете сервер или изменяете конфигурацию сервера, вы должны помнить, что необходимо обновить локальную среду разработки с теми же изменениями.
Он плотно привязывает вас к серверной ОС и конфигурации. Перенос сайта с одного сервера на другой — непростая задача.
Существует очень ограниченный выбор доступных пакетов. В зависимости от того, какой дистрибутив Linux работает на вашем
Конфигурация сервера является глобальной. PHP имеет файл настроек с именем php.ini. Изменение этого параметра применяет обновленную конфигурацию ко всем
Версии пакетов являются глобальными на реальном сервере. Хотя на одном и том же
Хотя пункты 5 и 6 можно преодолеть на машине разработки, запустив разные виртуальные машины Vagrant, вам понадобится настоящий
Знакомство с Докером
Docker решает все перечисленные выше проблемы. Но что такое Docker и как он работает?
Начнем с вступления из Википедии:
Docker — это набор продуктов «платформа как услуга» (PaaS), которые используют виртуализацию на уровне ОС для доставки программного обеспечения в пакетах, называемых контейнерами. Контейнеры изолированы друг от друга и содержат собственное программное обеспечение, библиотеки и файлы конфигурации; они могут общаться друг с другом через четко определенные каналы.
Прежде чем углубляться в технические аспекты, практическое преимущество для нас, как
Весь код
«Разве это не то, что уже делает виртуальная машина?» Я слышу, как ты спрашиваешь. Да, но есть большая разница между тем, как Vagrant и Docker обрабатывают установку программного обеспечения.
С Vagrant, работающим на виртуальной машине, полная операционная система с определенной версией PHP, версией MySQL и (обычно) конфигурацией сервера клонируется с реального
Однако при использовании Docker версия PHP/MySQL/NGINX предоставляется в виде единого пакета, известного как образ, и сервер может запускать столько разных образов, сколько вам нужно.
Преимущество здесь в том, что
Кроме того, каждое изображение полностью отделено от другого изображения на сервере. Каждое изображение (по одному на
Это имеет небольшие накладные расходы на память, но гибкость, которую оно предоставляет, делает это очень выгодным компромиссом:
Весь
Вы можете запустить точно такой же образ на своем компьютере для разработки. Используя Vagrant, вы эффективно запускаете копию конфигурации/установленных пакетов сервера на том же компьютере. С Docker на вашем ПК для разработки запускается тот же образ, что и на сервере.
php.iniнастройки, nginx.confизменения конфигурации или обновление PHP до последней версии обрабатываются так же, как загрузка обновленного кода PHP на сервер. Вы обновляете приложение, и не имеет значения, изменяет ли это код PHP или обновляете php.ini.
Каждое изображение самодостаточно в так называемом «контейнере».
В отличие от виртуальной машины, если два разных
Поскольку каждое изображение является автономным, перенос
Вы можете запускать на сервере столько образов Docker, сколько захотите, каждый со своей версией PHP, программным обеспечением
Настройка вещей
Это теория из пути. Теперь давайте приступим и создадим сервер с помощью Docker.
Предпосылки
Прежде чем мы начнем, вам нужно скачать и установить Docker. Перейдите на
Если вы работаете в Linux, вам следует установить пакеты dockerи
Добавьте своего пользователя в dockerгруппу, как описано в руководстве по Docker здесь.
Запустите dockerслужбу systemctl start docker.serviceи включите ее с помощью systemctl enable docker.
Если вы используете Windows или macOS, установщик сделает это за вас.
Начиная
Есть несколько способов создания этих сервисов в Docker. Я расскажу о наиболее удобном для пользователя. Docker поддерживает создание файла конфигурации с использованием YAML (еще один язык разметки).
Хотя вы можете ввести все параметры в командной строке, я рекомендую использовать файл конфигурации YAML по нескольким причинам:
Это намного легче читать/понимать.
Вам не нужно повторно вводить несколько длинных команд каждый раз, когда вы хотите запустить сервер.
Вы можете отслеживать изменения в файле с помощью Git.
Docker предоставляет инструмент
version: '3'
services:
web:
image: nginx: latest
ports:
— «80:80»
Давайте рассмотрим конфигурацию построчно:
version: '3'
Это говорит о том
За следующей строкой services: будет следовать список всех служб, которые вы хотите запустить.
В нашем примере пока вызывается только одна служба web (вы можете называть ее как угодно) с использованием официального образа NGINX: latest. Обратите внимание, что отступы с использованием пробелов (не табуляции!) имеют значение. YAML полагается на уровень вложенности для определения структуры файла.
Если вы хотите указать другую версию NGINX, вы можете указать это здесь следующим образом:
version: '3'
services:
web:
image: nginx:1.18.0
ports:
— «80:80»
Я рекомендую использовать latest, если у вас нет веских причин использовать более раннюю версию.
Блок portsнастраивает переадресацию портов. Он перенаправляет 80на локальную машину 80на изображение. Любой запрос на
Запуск службы
Чтобы запустить сервер, вам нужно открыть терминал в вашей операционной системе и указать ему папку, содержащую ваш
Как только ваш терминал откроется в правильном месте, введите
вывод
Если вы получаете
Тестовая страница NGINX
Почему не Апач?
Прежде чем мы продолжим, вам может быть интересно, почему я не использую здесь Apache. Если вы использовали XAMPP или аналогичный пакет,
Apache в порядке, и он работает, но он существует всегда. Когда был создан Apache, Интернет был совсем другим местом. Apache большой, и есть много разных функций, которые появлялись и исчезали, но которые Apache все еще поддерживает. Интернет сильно изменился с тех пор, как был создан Apache, и хотя это мощный сервер, который будет работать нормально, большинство
Мой общий совет: если у вас уже есть
Размещение файлов на сервере
Теперь, когда сервер установлен и запущен через Docker, мы можем сделать наши файлы видимыми на сервере. Если вы привыкли к Apache, вы бы поместили их в папку httpdocs, htdocsили где- publicнибудь на вашем компьютере.
Поскольку сервер работает в контейнере, он не имеет доступа ни к одному файлу на вашем компьютере. Однако Docker позволяет вам указать том — файл или папку на вашем компьютере, которые используются совместно с контейнером. Вам понадобятся два тома: nginx.confфайл конфигурации (который мы еще не создали) и папка, в которой будут храниться файлы вашего
version: '3'
services:
web:
image: nginx: latest
ports:
— «80:80»
volumes:
-. /nginx.conf: /etc/nginx/conf.d/nginx.conf
-. /app: /app
Это делает файл nginx.confи appкаталог из той же папки, что и ваш,
Файл nginx.confс хоста помещается /etc/nginx/conf.d/nginx.confвнутрь контейнера. Это папка, из которой NGINX считывает файлы конфигурации. Папка appсоздается в корне контейнера /app, и в нее вы будете помещать все
Перед перезапуском сервера создайте файл nginx.confв том же каталоге, что и ваш,
server {
listen 80 default_server;
root /app/public;
}
Это говорит NGINX, что это конфигурация, которую он должен использовать для сервера по умолчанию и что он должен обслуживать файлы из каталога /app/public. Мы могли бы просто обслуживать файлы из /appкаталога, но рекомендуется держать большинство файлов PHP вне общедоступного каталога. Поскольку
Чтобы проверить его работу, создайте страницу «Hello, World» по адресу app/public/index.html, создавая каталоги по ходу работы. Содержимое может быть таким:
Hello, World!
Перезапустите сервер, вернувшись в свой терминал и нажав
Перезагрузите http: //127.0.0.1 в своем браузере, и вы увидите свой Hello, World! тестовая страница. Теперь у вас есть работающий
PHP
Если вы хотите запускать
version: '3'
services:
web:
image: nginx: latest
ports:
— «80:80»
volumes:
-. /nginx.conf: /etc/nginx/conf.d/nginx.conf
-. /app: /app
php:
image: php: fpm
volumes:
-. /app: /app
Появился новый сервис php, использующий изображение php:
Поскольку PHP потребуется доступ к вашим.phpфайлам из /appкаталога, вам необходимо смонтировать том в образе PHP так же, как вы сделали это для образа NGINX. PHP не нуждается в доступе к nginx.confфайлу конфигурации, поэтому нет необходимости предоставлять ему доступ к нему.
Папка appтеперь доступна на
Перед перезапуском сервера
server {
listen 80 default_server;
root /app/public;
index index.php index.html index.htm;
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Строка indexуказывает серверу искать index.phpвместо index.htmlстраницы по умолчанию. Блок locationуказывает NGINX запускать любой файл с.phpрасширением через службу PHP (fastcgi_pass php:9000, где phpимя службы, настроенной в
Создайте phpinfoфайл по адресу app/public/index.php:
<? php
phpinfo () ;
Перезапустите сервер, нажав
Информационная страница PHP
Предполагая, что ваш
Это немного сложнее, так как нам нужно установить пакеты в образ. К счастью, официальный образ PHP содержит скрипт для этого.
Мы возьмем php: fpmза основу официальный образ и установим в него драйвер PDO MySQL. Это требует создания собственного имиджа, но это не так сложно, как кажется.
Во- первых, измените свой,
version: '3'
services:
web:
image: nginx: latest
ports:
— «80:80»
volumes:
-. /nginx.conf: /etc/nginx/conf.d/nginx.conf
-. /app: /app
php:
build:
context:.
dockerfile: PHP.Dockerfile
volumes:
-. /app: /app
Вместо imageзаписи теперь есть buildстрока под php. Директива context— это папка, в которой находится файл конфигурации, в нашем случае это., текущий каталог (та же папка, что и у нас
Создайте PHP.Dockerfileв той же папке, что и ваша,
FROM php: fpm
RUN
Это установит pdo_mysqlрасширение для PHP. Директива FROMсообщает Docker, что он должен использоваться php: fpmв качестве базового образа, и эта RUNдиректива используется для запуска команд внутри образа. Здесь вы можете запустить любую команду Linux. В данном случае мы запускаем
Если вы хотите использовать библиотеку MySQLi (хотя вам, вероятно, следует использовать PDO), вы можете установить ее вместо или вместе с PDO:
FROM php: fpm
RUN
Перезагрузите сервер с помощью
Вы можете убедиться, что pdo_mysqlрасширение было установлено, просмотрев phpinfo () вывод на http: //127.0.0.1.
Пока мы устанавливаем расширения, давайте добавим xdebugрасширение для более приятных сообщений об ошибках на нашем сервере разработки:
FROM php: fpm
RUN
RUN pecl install xdebug &&
xdebugустанавливается через pecl, который предоставляется как часть официального образа PHP. Пересоберите образ с помощью
MySQL
Теперь мы готовы установить MySQL. Еще раз, мы добавим его как сервис в
version: '3'
services:
web:
image: nginx: latest
ports:
— «80:80»
volumes:
-. /nginx.conf: /etc/nginx/conf.d/nginx.conf
-. /app: /app
php:
build:
context:.
dockerfile: PHP.Dockerfile
volumes:
-. /app: /app
mysql:
image: mariadb: latest
environment:
MYSQL_ROOT_PASSWORD: 'secret’
MYSQL_USER: 'tutorial’
MYSQL_PASSWORD: 'secret’
MYSQL_DATABASE: 'tutorial’
volumes:
— mysqldata: /var/lib/mysql
ports:
— 3306:3306
volumes:
mysqldata: {}
Мы используем изображение mariadb: latest. Как и в случае с NGINX и PHP, при желании вы можете указать здесь конкретную версию MariaDB.
На этот раз есть environmentблок, который используется для передачи некоторых переменных в контейнер при его создании. Они используются для настройки базы данных со следующими параметрами. Установите собственные значения для следующих переменных:
MYSQL_ROOT_PASSWORD: пароль root для базы данных. Вы можете использовать это для входа в систему rootи управления базой данных.
MYSQL_USERи MYSQL_PASSWORD: имя и пароль для пользователя MySQL, который создается с ограниченными разрешениями. Вы захотите использовать это из своих
MYSQL_DATABASE: имя автоматически создаваемой схемы, к которой имеет доступ указанный выше пользователь.
В приведенном выше примере создается база данных с именем tutorial, доступ к которой можно получить с помощью пользователя tutorialи пароля secret.
Вы также заметите, что volumesвнизу есть запись. Это создает специальный тип тома, который не отображается в локальной файловой системе. Здесь будут храниться данные для MySQL — все ваши таблицы, записи и т. д.
Причина, по которой мы не хотим использовать папку в локальной файловой системе, заключается в том, что когда приложение загружается на реальный
Наконец, portsблок предоставляет порт 3306, поэтому мы можем подключиться к нему с помощью клиента, такого как MySQL Workbench, для управления базой данных. Я настоятельно рекомендую использовать это поверх PHPMyAdmin, если вы к этому привыкли, хотя вы можете поместить PHPMyAdmin в app/publicпапку и запустить его оттуда, если хотите.
Перезагрузите сервер. Первая загрузка и настройка MariaDB займет минуту или две. Затем в сценарии PHP попробуйте подключиться к MySQL с помощью PDO и выбранного вами имени пользователя, пароля и имени базы данных:
<? php
$pdo = new PDO ('mysql: dbname=tutorial; host=mysql’, 'tutorial’, 'secret’, [PDO: ATTR_ERRMODE => PDO: ERRMODE_EXCEPTION]) ;
$query = $pdo→query ('SHOW VARIABLES like «version»') ;
$row = $query→fetch () ;
echo 'MySQL version:'. $row['Value’];
Запустите этот скрипт на сервере. Если вы видите версию MySQL и никаких сообщений об ошибках, значит, вы подключены к серверу MySQL и все настроено правильно.
Готово!
Как вы только что обнаружили, Docker требует небольшой настройки, если вы делаете это самостоятельно. Если вы используете существующие
Когда вы запустите свой
Как только вы освоитесь, вы никогда не оглянетесь назад. Docker значительно упрощает процесс разработки