Несколько версий php windows

Несколько версий PHP под одним Apache на Windows

Некоторое время назад мне потребовалось иметь на одном веб-сервере разные версии PHP. Все мануалы, что удалось найти беглым взглядом, подразумевали linux-дистрибутивы, на которые мне не хотелось переносить выношенную в муках конфигурацию apache, установленную на виртуальной Windows Server 2012 R2 (x64). Результат моего удавшегося эксперимента представляю на ваш суд.

Первым делом нужно определиться, какой разрядности (х86 или х64) мы хотим от нашего веб-сервера. С недавних пор, а именно — версии PHP5.5, разработчик стал выпускать стабильные сборки под х64, тогда как ранее подобные билды выпускались энтузиастами. Для наибольшего возможного разброса версий PHP и для наглядного примера остановимся на х86 сборке. Далее я буду указывать версии ПО, заработавшие в моём конкретном случае.

1. Скачиваем Apache 2.4.10 Win32 VC11 на www.apachelounge.com/download
ВНИМАНИЕ! Необходимо иметь на компьютере установленную Visual C++ Redistributable for Visual Studio 2012
Выбор версии обусловлен тем, что сборки VC11 не имеют (согласно отзывам) проблем с производительностью как у VC9, VC10, и могут запускать модули, написанные под оные. Старые версии апача не тестировались.

Установка и базовая настройка веб-сервера разжевана и без меня, поэтому её опускаем.

2. Берём бинарники PHP, windows.php.net/download
Нас интересуют x86 Thread Safe версии. Берем все стабильные версии, которые вас интересуют. Лично у меня заработали начиная с 5.3 до 5.6. Архивные версии так же работают.
Для удобства раскладываем всё по соседним папкам:

3. Лезем в конфиги apache.

3.1.1 httpd.conf — Выключаем PHP, если он настроен как модуль к Apache:

3.1.2 httpd.conf — Включаем модуль FastCGI

Включаем использование его конфигурации:

3.2 conf/extra/httpd-fcgid.conf — Оставляем стандартные настройки, кроме первого абзаца:

3.3 conf/extra/httpd-vhost.conf — Прописываем для каждого виртуального хоста настройки (выделено с помощью «||»):

Если всё раскладывать по соседним папкам как у меня, то в конфиге виртуального хоста меняем только последние цифры в пути PHP.

Как итог: получаем разные версии PHP на разных виртуальных хостах на одном сервисе Apache.

Несколько версий PHP на Windows машине

Весьма актуальная задача: Иметь возможность по клику мыши менять версию PHP на Windows машине. Ранее была подобная статья, в которой создаётся 3 копии httpd.conf. Зачем? Когда есть наипростейшее решение.

Скачиваем архив с Apache HTTPd и распаковываем его в папку, например, C:\a\apache. В папке C:\a\apache\conf создаём два файла конфигурации…

… и добавляем строку:

В файл C:\a\apache\conf\httpd.conf после всех LoadModule.

Создаём символическую ссылку php.conf php5.conf

Скачиваем необходимые версии PHP…

  • PHP 5.6.26
  • PHP 7.0.11

… и распаковываем их в папки C:\a\php56 и C:\a\php70 соответственно.

Ранее, в конфигах Apache, мы указали, что PHP следует цеплять из директории C:\a\php, по-этому создаём символическую ссылку php php56:

Теперь инсталируем сервис…

… и создаём bat’ники для выбора версии PHP:

Теперь, для удобства, создаём ярлыки для bat’ников, и указываем в свойствах каждого «Запуск от имени администратора».

Спасибо за внимание!

По подсказке gewisser сделал немного иначе:

В папке C:\a\apache\conf создал два конфигурационных файла:

… а из файла httpd.conf удалил строку

И поменял bat’ники для запуска:

Читайте также:  Срок хранения журналов windows

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

Многие знакомы с многочисленными WAMP-комплектами, однако, судя по тому, что подобных статей не мало, можно сделать вывод, что не все хотят ими пользоваться.

Если общество не против, пишите в комменты ссылки на подобные комплекты и подобные статьи, я их прикреплю к своей статье.

Запуск нескольких версий PHP на одном сервере с помощью Apache и PHP-FPM в Ubuntu 20.04

Веб-сервер Apache использует виртуальные хосты для управления несколькими доменами в рамках одного сервера. Точно так же для управления несколькими версиями PHP в рамках одного сервера PHP-FPM использует специальный демон. Объединив эти возможности Apache и PHP-FPM, вы можете одновременно разместить на одном сервере несколько веб-приложений PHP, каждое из которых будет использовать индивидуальную версию PHP. Это удобно, потому что для разных приложений могут потребоваться разные версии PHP, но обычно серверные стеки (например, стандартный LAMP) могут управлять только одной версией. Сочетание Apache с PHP-FPM – экономное решение, ведь вам не придется размещать каждое приложение на отдельном сервере.

PHP-FPM также предлагает параметры для логирования stderr и stdout, аварийных перезапусков и адаптивного порождения процессов, что полезно для сайтов с высоким трафиком.

Фактически связка Apache+PHP-FPM – один из лучших стеков для размещения приложений PHP, особенно когда дело касается производительности. PHP-FPM не только позволяет запускать несколько версий PHP одновременно, он также предоставляет множество дополнительных функций, что полезно для сильно загруженных сайтов.

В этом мануале мы покажем, как запустить два сайта PHP на одном сервере. Каждый сайт будет использовать свой собственный домен, каждый домен будет развертывать свою собственную версию PHP. Первый, site1.your_domain, использует PHP 7.2; второй, site2.your_domain, использует версию PHP 7.3.

Требования

  • Сервер Ubuntu 20.04 (1GB RAM минимум), настроенный по этому мануалу, включая пользователя sudo и включенный брандмауэр.
  • Веб-сервер Apache, установить который вам поможет этот мануал.
  • Доменные имена, направленные на ваш сервер. В данном мануале мы используем два условных домена: site1.your_domain и site2.your_domain. Для каждого домена нужно создать DNS-запись А.

1: Установка PHP 7.2 и PHP 7.3

Выполнив предварительные требования к мануалу, мы можем установить PHP версий 7.2 и 7.3, а также PHP-FPM и несколько дополнительных расширений. Для начала нам необходимо включить репозиторий Ondrej PHP.

Прежде чем добавить репозиторий в свою систему, установите software-properties-common:

sudo apt-get install software-properties-common -y

Этот пакет предоставляет команду apt-add-repository, с помощью которой вы сможете добавить PPA-репозиторий ondrej/php.

Теперь добавьте репозиторий ondrej/php в вашу систему. Этот PPA (Personal Package Archive) содержит более современные версии PHP, чем официальные репозитории Ubuntu, а также позволит вам установить несколько версий PHP в одной системе.

sudo add-apt-repository ppa:ondrej/php

sudo apt-get update -y

Затем установите php7.2, php7.2-fpm, php7.2-mysql, libapache2-mod-php7.2 и libapache2-mod-fcgid с помощью следующей команды:

sudo apt-get install php7.2 php7.2-fpm php7.2-mysql libapache2-mod-php7.2 libapache2-mod-fcgid -y

  • php7.2 – это метапакет, который можно использовать для запуска приложений PHP.
  • php7.2-fpm предоставляет интерпретатор Fast Process Manager, который работает как демон и принимает запросы Fast/CGI.
  • php7.2-mysql подключает PHP к базе данных MySQL.
  • libapahce2-mod-php7.2 предоставляет PHP модуль для веб-сервера Apache.
  • libapache2-mod-fcgid содержит идентификатор mod_fcgid, который запускает несколько экземпляров программы CGI для обработки одновременных запросов.

Теперь повторите весь процесс для PHP версии 7.3. Установите php7.3, php7.3-fpm, php7.3-mysql и libapache2-mod-php7.3:

sudo apt-get install php7.3 php7.3-fpm php7.3-mysql libapache2-mod-php7.3 -y

Читайте также:  Настройка macbook для windows

После установки обеих версий PHP запустите сервис php7.2-fpm:

sudo systemctl start php7.2-fpm

Затем проверьте статус этого сервиса с помощью следующей команды:

sudo systemctl status php7.2-fpm

Вы увидите следующий результат:

php7.2-fpm.service — The PHP 7.2 FastCGI Process Manager
Loaded: loaded (/lib/systemd/system/php7.2-fpm.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2020-06-05 11:25:07 UTC; 1min 38s ago
Docs: man:php-fpm7.2(8)
Main PID: 13703 (php-fpm7.2)
Status: «Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec»
Tasks: 3 (limit: 2353)
Memory: 6.2M
CGroup: /system.slice/php7.2-fpm.service
├─13703 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf)
├─13719 php-fpm: pool www
└─13720 php-fpm: pool www
Jun 05 11:25:07 ubuntu systemd[1]: Starting The PHP 7.2 FastCGI Process Manager.
Jun 05 11:25:07 ubuntu systemd[1]: Started The PHP 7.2 FastCGI Process Manager.

Повторите этот процесс для версии 7.3; запустите сервис php7.3-fpm:

sudo systemctl start php7.3-fpm

А затем проверьте состояние сервиса с помощью следующей команды:

sudo systemctl status php7.3-fpm

Вы увидите следующий результат:

php7.3-fpm.service — The PHP 7.3 FastCGI Process Manager
Loaded: loaded (/lib/systemd/system/php7.3-fpm.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2020-06-05 11:26:33 UTC; 56s ago
Docs: man:php-fpm7.3(8)
Process: 23470 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/7.3/fpm/pool.d/www.conf 73 (code=ex>
Main PID: 23452 (php-fpm7.3)
Status: «Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec»
Tasks: 3 (limit: 2353)
Memory: 7.1M
CGroup: /system.slice/php7.3-fpm.service
├─23452 php-fpm: master process (/etc/php/7.3/fpm/php-fpm.conf)
├─23468 php-fpm: pool www
└─23469 php-fpm: pool www
Jun 05 11:26:33 ubuntu systemd[1]: Starting The PHP 7.3 FastCGI Process Manager.
Jun 05 11:26:33 ubuntu systemd[1]: Started The PHP 7.3 FastCGI Process Manager.

В заключение вам нужно включить пару модулей, чтобы сервис Apache2 мог поддерживать несколько версий PHP одновременно:

sudo a2enmod actions fcgid alias proxy_fcgi

  • actions используется для выполнения сценариев CGI на основе типа медиа или метода запроса.
  • fcgid – это высокопроизводительная альтернатива mod_cgi, которая запускает достаточное количество экземпляров программы CGI для обработки одновременных запросов.
  • alias обеспечивает отображение различных частей файловой системы хоста в дереве документов и перенаправление URL.
  • proxy_fcgi позволяет Apache перенаправлять запросы в PHP-FPM.

Перезапустите Apache, чтобы изменения вступили в силу:

sudo systemctl restart apache2

Теперь на вашем сервере есть две версии PHP. После этого мы можем создать структуру каталогов для каждого сайта, который должен обслуживаться этим сервером.

2: Создание структуры каталогов для сайтов

Теперь мы создадим корневые каталоги для каждого сайта, который будет развернут на этом сервере. В нашем мануале мы развернем 2 сайта: site1.your_domain и site2.your_domain. Создавая каталоги, укажите домены ваших сайтов.

sudo mkdir /var/www/site1.your_domain
sudo mkdir /var/www/site2.your_domain

По умолчанию веб-сервер Apache запускается как пользователь и группа www-data. Чтобы убедиться, что права собственности и доступа на корневые каталоги сайтов установлены верно, выполните следующие команды:

sudo chown -R www-data:www-data /var/www/site1.your_domain
sudo chown -R www-data:www-data /var/www/site2.your_domain
sudo chmod -R 755 /var/www/site1.your_domain
sudo chmod -R 755 /var/www/site2.your_domain

Затем внутри каждого корневого каталога мы создадим файл info.php. Позже он поможет нам отобразить информацию о версии PHP каждого веб-сайта. Начните с site1:

sudo nano /var/www/site1.your_domain/info.php

Добавьте в файл следующую строку:

Сохраните и закройте файл. Теперь скопируйте созданный вами файл info.php для site2:

sudo cp /var/www/site1.your_domain/info.php /var/www/site2.your_domain/info.php

Теперь у вас есть корневые каталоги, необходимые каждому сайту для обслуживания данных. Затем мы настроим свой веб-сервер Apache для поддержки двух разных версий PHP.

3: Настройка Apache для поддержки двух сайтов

В этом разделе мы создадим два конфигурационных файла виртуального хоста. Это позволит двум веб-сайтам одновременно работать с двумя разными версиями PHP.

Читайте также:  Openoffice для windows 10 не устанавливается

Чтобы Apache обслуживал этот контент, необходимо создать файл виртуального хоста с правильными директивами. Вместо того чтобы редактировать стандартный виртуальный хост /etc/apache2/sites-available/000-default.conf, мы создадим два новых файла в каталоге /etc/apache2/sites-available/.

Сначала создайте конфигурационный файл виртуального хоста для сайта site1.your_domain. Здесь мы настроим Apache для обработки контента с помощью php7.2.

sudo nano /etc/apache2/sites-available/site1.your_domain.conf

Вставьте в файл следующие строки. Убедитесь, что вы указали правильный путь к корневому каталогу, ServerName и версию PHP.

ServerAdmin admin@site1.your_domain
ServerName site1.your_domain
DocumentRoot /var/www/site1.your_domain
DirectoryIndex info.php

Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all

# From the Apache version 2.4.10 and above, use the SetHandler to run PHP as a fastCGI process server
SetHandler «proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost»

ErrorLog $/site1.your_domain_error.log
CustomLog $/site1.your_domain_access.log combined

В DocumentRoot укажите путь к корневому каталогу вашего веб-сайта. В ServerAdmin укажите адрес электронной почты для администратора сайта your_domain. В директиве ServerName определяется URL-адрес первого поддомена. Директива SetHandler позволяет запускать PHP как процесс fastCGI.

Сохраните и закройте файл.

Затем создайте новый конфигурационный файл виртуального хоста для сайта site2.your_domain. Этот поддомен будет обслуживаться версией php7.3.

sudo nano /etc/apache2/sites-available/site2.your_domain.conf

Добавьте следующий код в файл. Убедитесь, что путь к корневому каталогу, ServerName и версия PHP соответствуют вашей конфигурации.

ServerAdmin admin@site2.your_domain
ServerName site2.your_domain
DocumentRoot /var/www/site2.your_domain
DirectoryIndex info.php

Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all

# 2.4.10+ can proxy to unix socket
SetHandler «proxy:unix:/run/php/php7.3-fpm.sock|fcgi://localhost»

ErrorLog $/site2.your_domain_error.log
CustomLog $/site2.your_domain_access.log combined

Сохраните и закройте файл. Затем проверьте конфигурации Apache на наличие синтаксических ошибок с помощью следующей команды:

sudo apachectl configtest

Если ошибок нет, вы увидите вывод:

Теперь включите новые виртуальные хосты:

sudo a2ensite site1.your_domain
sudo a2ensite site2.your_domain

Отключите стандартный виртуальный хост, так как в дальнейшем он нам не понадобится:

sudo a2dissite 000-default.conf

После этого можно перезапустить сервис Apache, чтобы изменения вступили в силу:

sudo systemctl restart apache2

Теперь, когда мы настроили Apache для обслуживания каждого сайта, мы должны протестировать сайты и убедиться, что все работает правильно.

4: Тестирование настройки

Итак, мы уже настроили два веб-сайта, которые работают на двух разных версиях PHP. Давайте проверим результаты.

Откройте браузер и посетите оба сайта.

Вы увидите две страницы с информацией о PHP. Обратите внимание на заголовки этих страниц. На первой странице указано, что site1.your_domain использует PHP версии 7.2. Вторая страница сообщает, что site2.your_domain развернул PHP версии 7.3.

Теперь, когда вы проверили свои сайты, удалите файлы info.php. Они содержат конфиденциальную информацию о вашем сервере и доступны неавторизованным пользователям – следовательно, они представляют собой уязвимость системы безопасности. Чтобы удалить оба файла, введите:

sudo rm -rf /var/www/site1.your_domain/info.php
sudo rm -rf /var/www/site2.your_domain/info.php

Теперь у вас есть сервер Ubuntu 20.04, обслуживающий два веб-сайта с двумя разными версиями PHP.

Заключение

В этом мануале вы научились объединять виртуальные хосты и PHP-FPM для обслуживания нескольких веб-сайтов и нескольких версий PHP на одном сервере. Единственное практическое ограничение на количество сайтов PHP и версий PHP, которые может обрабатывать Apache, – это вычислительная мощность вашего экземпляра.

Здесь вы можете изучить более продвинутые функции PHP-FPM, такие как адаптивное порождение процессов или возможности логирования sdtout и stderr. Кроме того, теперь вы можете защитить свои сайты с помощью бесплатных сертификатов TLS/SSL от Let’s Encrypt.

Оцените статью