Несколько Версий Php На Хосте С Использованием Docker

Разработчики PHP часто сталкиваются с задачей протестировать работу веб-приложения под несколькими версиями интерпретатора.

Ее можно решить разными способами.

Можно просто установить на один хост разные версии PHP, но это чревато конфликтами библиотек и другими сложностями.

Вторая крайность — создание нескольких изолированных виртуальных машин с разным окружением, но сделать это невозможно без чрезмерного использования аппаратных ресурсов и лишней траты времени на настройку рабочего окружения.

На данный момент самый простой способ решить эту проблему — использовать Docker.

Несколько версий 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

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.