Разработчики PHP часто сталкиваются с задачей протестировать работу веб-приложения под несколькими версиями интерпретатора.
Ее можно решить разными способами.
Можно просто установить на один хост разные версии PHP, но это чревато конфликтами библиотек и другими сложностями.
Вторая крайность — создание нескольких изолированных виртуальных машин с разным окружением, но сделать это невозможно без чрезмерного использования аппаратных ресурсов и лишней траты времени на настройку рабочего окружения.
На данный момент самый простой способ решить эту проблему — использовать Docker.
Ниже я опишу рабочее решение для Ubuntu 18, где в качестве стека используется комбинация Nginx + PHP-FPM. Это решение легко масштабируется: контейнер с PHP-FPM занимает всего 300 МБ памяти, а добавлять контейнеры с другими версиями интерпретатора можно тремя командами (или, в зависимости от ваших предпочтений, даже одной — run).
Вторым преимуществом такого решения является то, что разработчику не нужно переключать веб-сервер между интерпретаторами, поскольку они уже разделены на разные контейнеры (используется один и тот же код приложения).
Дополнение: Судя по комментариям, некоторые читатели так и не поняли, для каких случаев подходит описанное решение.
Поэтому хотелось бы обратить ваше внимание на то, что все изложенное ниже предназначено для использования ИСКЛЮЧИТЕЛЬНО на рабочей станции разработчика, а также может подойти, с некоторыми оговорками, для сценического сервера.
Итак, начнем…
1. Установите Докер
sudo apt update sudo apt install ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt update sudo apt install docker-ce
2. Установите контейнеры с необходимыми версиями PHP.
В качестве примера создания рабочей среды мы использовали PHP версий 7.1 и 7.2 из официального PHP-репозиторий Docker .
По аналогии, если у вас есть образ, вы можете установить любую понравившуюся версию PHP: sudo docker pull php:7.1.25-fpm-stretch
sudo docker create --name=fpm71 -p 127.0.0.1:9071:9000 -v /var/www:/var/www php:7.1.25-fpm-stretch
sudo docker start fpm71
sudo docker pull php:7.2.13-fpm-stretch
sudo docker create --name=fpm72 -p 127.0.0.1:9072:9000 -v /var/www:/var/www php:7.2.13-fpm-stretch
sudo docker start fpm72
PHP-FPM по умолчанию работает на порту 9000. При создании образов мы опубликовали порты 9000-го контейнера в свободные 9071 и 9072 порты хост-машины (номера были взяты произвольно из непривилегированного диапазона).
Далее мы будем проксировать запросы на обработку PHP на эти порты (параметр fastcgi_pass в конфигурации виртуальных хостов Nginx).
Также нужно было пробросить директорию проекта (/var/www) внутрь контейнеров, иначе PHP-FPM жалуется, что не видит файлы (если вы знаете, как это лучше/правильно сделать, то напишите в комментариях).
Проверяем, что контейнеры запущены и порты опубликованы корректно: sudo docker ps -a
sudo netstat -lpn
3. Настройка среды для виртуальных хостов
Добавьте следующие строки в /etc/hosts: 127.0.0.1 project.local.php71 ### php 7.1
127.0.0.1 project.local.php72 ### php 7.2
Создайте каталог для проекта:
sudo mkdir -p /var/www/project.local
echo '<Эphp phpinfo(); ?>' | sudo tee /var/www/project.local/index.php
Имя для проекта (project.local) и виртуальных хостов (project.local.php71/72) я взял произвольное, но вы можете использовать удобные для вас имена (только не забудьте изменить настройки виртуальных хостов ).
Изначально в индексный файл была включена только одна команда phpinfo; после настройки и проверки работоспособности системы index.php нужно будет заменить на тот, который используется в проекте.
4. Установите nginx и настройте виртуальные хосты.
sudo apt install nginx
Создать файл /etc/nginx/sites-available/project.local.php71 с описанием первого виртуального хоста (на нем будет тестироваться работа проекта под PHP v.7.1): server {
listen 80;
server_name project.local.php71;
index index.php;
root /var/www/project.local;
location / {
try_files $uri $uri/ =404;
}
location ~ \.
php$ {
fastcgi_pass 127.0.0.1:9071;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Точно такой же файл /etc/nginx/sites-available/project.local.php72 для второго виртуального хоста: server {
listen 80;
server_name project.local.php72;
index index.php;
root /var/www/project.local;
location / {
try_files $uri $uri/ =404;
}
location ~ \.
php$ {
fastcgi_pass 127.0.0.1:9072;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Теперь мы создаем символические ссылки на созданные выше конфигурации виртуального хоста и перезагружаем Nginx: cd /etc/nginx/sites-enabled
sudo ln -s .
/sites-available/project.local.php71 sudo ln -s .
/sites-available/project.local.php72
sudo systemctl reload nginx
5. Проверьте
curl --silent http://project.local.php71/index.php | grep -o "PHP Version [0-9\.
]\{1,\}"
curl --silent http://project.local.php72/index.php | grep -o "PHP Version [0-9\.
]\{1,\}"
В результате мы должны получить версию PHP (в результате обработки команды phpinfo интерпретаторами разных версий).
Теперь осталось только загрузить свой проект в папку /var/www/project.local и проверить его работу в интерпретаторе PHP 7.1 по адресу http://project.local.php71 и PHP 7.2 http://project.local.php71 .
Дополнительные материалы 1. Полное практическое руководство по Docker Теги: #Виртуализация #Nginx #Системное администрирование #docker #php
-
Точная Копия
19 Oct, 24 -
Как Заработать Больше В Сфере It В России?
19 Oct, 24 -
Как Выбрать Платформу Для Вебинара?
19 Oct, 24 -
Долой Языковой Барьер – 2
19 Oct, 24 -
Прогнозы — Дело Неблагодарное
19 Oct, 24