Страница 1 из 1

Запуск нескольких версий PHP на OpenServer

Добавлено: 02 сен 2013, 12:40
Ganster41
Я уже как-то поднимал такой вопрос, т.к. у нас сейчас проекты постепенно переводятся с 5.2 на 5.4+, но старые периодически тоже приходить править, и потом конечно же тестировать...
Погуглив, пришел к выводу, что для старых проектов можно настроить запуск старых версий PHP через FastCGI. На вопросы о том, как это сделать, мне тут отвечали что это сложно, и зачем вообще нужно... В общем сделал сам, и делюсь с другими. Может кому тоже пригодится.

Описание содержимого архива:
domains - Здесь можно найти файлик Apache-2.4.4_vhost.conf, который является копией такого-же шаблона из папки userdata/config, но с изменениями, говорящими апачу о том, что для обработки PHP нужно использовать FastCGI handler. Файл этот положить в корневую папку домена, как и указано в документации OpenServer'а.

modules\http\Apache-2.4.4\modules - Тут собственно лежит модуль FastCGI для Apache. Достаточно просто распаковать его в папку modules вашего Apache;

modules\php\PHP-5.2.17 - Тут я ложу сгенерированный файл php.ini для PHP, который будет запускаться через FastCGI. К сожалению "шаблонизатор" OpenServer'а тут использовать нельзя, ноэтому только так. Проще всего его получить, временно переключив в настройках версию PHP на 5.2(или какую там вы настраиваете), и запустить сервер. Нужный нам файл будет в папке userdata\temp\config. Просто копируем его в папку PHP.

userdata\config - Сюда я положил пример основного конфига Apache, с подключением и настройкой модуля FastCGI. Если вы использовали оригинальный конфиг без изменений, то можно просто заменить его моим. Для тех, кто все-таки что-то менял, опишу изменения позже.

userdata\post_stop.tpl.bat - Скрипт убивающий процессы cgi-демона PHP при остановке сервера. Без него их при перезапуске наплодится тьма :)

Вроде бы все. Спрашиваем, если чего не понятно.

Добавлено спустя 24 минуты 50 секунд:
Ну и собственно сами изменения, если вносить вручную:

Apache-x.x.x_server.conf
Подключаем модуль FastCGI строчкой(просто добавить после других LoadModule...)
LoadModule fcgid_module modules/mod_fcgid.so
И куда-нибудь в конец файла добавляем собственно настройки модуля:
<IfModule mod_fcgid.c>
# Set PHP_FCGI_MAX_REQUESTS to greater than or equal to FcgidMaxRequestsPerProcess
# to prevent php-cgi process from exiting before all requests completed
FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000
# Maximum requests a process should handle before it is terminated
FcgidMaxRequestsPerProcess 1000
# Maximum number of PHP processes
FcgidMaxProcesses 15
# Number of seconds of idle time before a php-cgi process is terminated
FcgidIOTimeout 120
FcgidIdleTimeout 120
</IfModule>
Ложим файл mod_fcgid.so в папку modules\http\Apache-х.х.х\modules
На этом правка конфигов, имеющих отношение к самому OpenServer завершена.

Настраиваем нужный домен, для работы со своей версией PHP:
Копируем файл userdata\config\Apache-х.х.х_vhost.conf в корневую папку нужного домена, и добавляем в обе секции VirtualHost такие вот строки:
Options +ExecCGI
  FcgidInitialEnv PHPRC "%sprogdir%/modules/php/PHP-5.2.17/"
  AddHandler fcgid-script .php
  FcgidWrapper "%sprogdir%/modules/php/PHP-5.2.17/php-cgi.exe" .php
Переменная FcgidInitialEnv должна содержать путь к корневой папке нашего php. Там же PHP будет искать php.ini, который предварительно туда нужно положить. Проще всего его получить, временно переключив в настройках версию PHP на 5.2(или какую там вы настраиваете), и запустить сервер. Нужный нам файл будет в папке userdata\temp\config.
FcgidWrapper - Путь к файлу php-cgi.exe нашей версии PHP.

Ну и добавляем в файл userdata\post_stop.tpl.bat (или создаем его, если не создавали ранее) вот это:
taskkill /F /IM php-cgi.exe
Как я уже писал, это нужно для того, чтобы при остановке сервера, убивались процессы CGI-демона PHP. Более красивого способа, чем принудительное убийство процессов я не нашел, так что если вдруг ваш скрипт будет что-то писать в базу в момент остановки сервера - можете потерять данные! Будьте внимательны!