Установка нескольких независимых версий PHP на одном веб-сервере Apache

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

Суть метода состоит в использовании CGI-обработчиков, которые привязываются по расширению к php-файлам. К примеру, файлы .php449 будут обрабатываться четвёртым PHP, а файлы .php600 шестой версией, и т.д.

Для реализации данного метода требуется уже настроенный веб-сервер Apache, а также доступ в Интернет. Способ установки веб-сервера описан в статье Установка web-сервера (FAMP).

Внимание! CGI-обработчики могут быть "дырой" в безопасности. Если сервер находится под "нагрузкой", то позаботьтесь о дополнительных мерах безопасности. Более подробная информация находится по адресу http://php.net/security.cgi-bin.

------------------ I. Подготовка системы  -----------------

Создём папку, где будут лежать архивы с дистрибутивами пхп
zg# mkdir /usr/local/php-dist

Сами архивы можно скачать по следующим адресам
 - текущие релизы        http://www.php.net/downloads.php
 - релиз-кандидаты       http://qa.php.net/
 - устаревшие релизы     http://www.php.net/releases/
 - сборки разработчиков  http://snaps.php.net/

Будте внимательны! Те ссылки, которые приведены здесь, могут не работать.
Это связано с тем, что актуальность некоторых сборок с течением времени
становится крайне мала. Только релизы, как правило, имеют постоянное место
размещения. Девелоперские сборки и релиз-кандидаты устаревают очень быстро.

------------------ II. Установка PHP 4.4.9  -----------------

Переходим в папку с дистрибутивами пхп
zg# cd /usr/local/php-dist/

Скачиваем исходный код нужной версии пхп
zg# fetch -o php-4.4.9.tar.bz2 http://ru2.php.net/get/php-4.4.9.tar.bz2/from/this/mirror

Распаковываем архив в текущую апаку
zg# tar xf php-4.4.9.tar.bz2

Переходим в папку с исходным кодом
zg# cd php-4.4.9

Конфигурируем пхп с нужными параметрами (опция --disable-cli обязательна!)
zg# ./configure --prefix=/usr/local/php/4.4.9 --disable-cli

Устанавливаем пхп
zg# make install clean

Устанавливаем конфиг php.ini
zg# cp php.ini-dist /usr/local/php/4.4.9/lib/php.ini

------------------ III. Установка PHP 5.3.1RC1 -----------------

Переходим в папку с дистрибутивами пхп
zg# cd /usr/local/php-dist/

Качаем нужную версию пхп
zg# fetch -o php-5.3.1RC1.tar.bz2  http://downloads.php.net/johannes/php-5.3.1RC1.tar.bz2

Распаковываем архив
zg# tar xf php-5.3.1RC1.tar.bz2

Переходим в папку с исходным кодом
zg# cd php-5.3.1RC1

Конфигурируем пхп
zg# ./configure --prefix=/usr/local/php/5.3.1RC1

Устанавливаем пхп
zg# make install clean

Устанавливаем конфиг
zg# cp php.ini-production /usr/local/php/5.3.1RC1/lib/php.ini

------------------ IV. Установка PHP 6 -----------------

Для шестого пхп требуется ICU. У меня его в системе не было, поэтому я его устанавливаю 
перед установкой пхп.
zg# pkg_add -r icu

Переходим в папку с дистрибутивами пхп
zg# cd /usr/local/php-dist/

Качаем девелоперскую сборку пхп 6
zg# fetch http://snaps.php.net/php6.0-200909050830.tar.bz2

Распаковываем архим
zg# tar xf php6.0-200909050830.tar.bz2

Переходим в папку с исходным кодом
zg# cd php6.0-200909050830/

Конфигурируем
zg# ./configure --prefix=/usr/local/php/6.0.0

Устанавливаем
zg# make install clean

Устанавливаем конфиг
zg# cp php.ini-production /usr/local/php/6.0.0/lib/php.ini

------------------ IV. Настройка папки cgi-bin -----------------

Определяем текущее положение папки cgi-bin
zg# grep "ScriptAlias /cgi-bin" /usr/local/etc/apache22/httpd.conf
    ScriptAlias /cgi-bin/ "/usr/local/www/apache22/cgi-bin/"

Переходим в папку cgi-bin
zg# cd /usr/local/www/apache22/cgi-bin/

Создаём символические ссылки на CGI-исполняемые файлы пхп
zg# ln -s /usr/local/php/4.4.9/bin/php php449
zg# ln -s /usr/local/php/5.3.1RC1/bin/php-cgi php531RC1
zg# ln -s /usr/local/php/6.0.0/bin/php-cgi php600
zg# ln -s /usr/local/bin/php-cgi phpLOCAL

Редактируем конфиг апача, чтобы разрешить символические ссылки в cgi-bin
zg# ee /usr/local/etc/apache22/httpd.conf

Находим секцию <Directory "/usr/local/www/apache22/cgi-bin">. 
И заменяем (или добавляем) Options None на Options FollowSymLinks.
У меня конфиг получился таким:

<Directory "/usr/local/www/apache22/cgi-bin">
    AllowOverride None
    Options FollowSymLinks
    Order allow,deny
    Allow from all
</Directory>

Сохраняем файл и выходим из редактора.

------------------ V. Настройка папки с несколькими версиями PHP -----------------

Создаём конфиг для папки, в которой будет работать несколько версий пхп
zg# ee /usr/local/etc/apache22/Includes/multi-php.conf

Alias /multi-php/ "/usr/local/www/multi-php/"

<Directory "/usr/local/www/multi-php/">
    # Привязываем разные расширения файлов к разным типам
    AddType x-httpd-php-449    .php449
    AddType x-httpd-php-531rc1 .php531rc1
    AddType x-httpd-php-600    .php600
    AddType x-httpd-php-local  .phplocal

    # Для каждого типа создаём соответствующий CGI-обработчик
    Action x-httpd-php-449     /cgi-bin/php449
    Action x-httpd-php-531rc1  /cgi-bin/php531RC1
    Action x-httpd-php-600     /cgi-bin/php600
    Action x-httpd-php-local   /cgi-bin/phpLOCAL

    Order Deny,Allow
    Allow from all
</Directory>

Создаём папку
zg# mkdir -p /usr/local/www/multi-php/

Переходим в папку
zg# cd /usr/local/www/multi-php/

Качаем небольшую формочку для более удобного запуска пхп кода
zg# fetch //anton-pribora.ru/files/multi-php-eval-form.tar.bz2

Распаковываем архив
zg# tar xf multi-php-eval-form.tar.bz2

Создаём ссылки разных типов на единый файл запуска
zg# ln -s run.php run.php449
zg# ln -s run.php run.php531rc1
zg# ln -s run.php run.php600
zg# ln -s run.php run.phplocal

Перезапускаем апач
zg# apachectl graceful

Теперь можно зайти на http://ваш_адрес/multi-php/ , там должна отобразиться формочка 
с возможностью выбора, в какой версии PHP выполнять код.

Дата публикации: 6 сентября 2009 года.

Дополнительно

Скриншоты рабочей формы

Скриншот рабочей формы


Скриншот рабочей формы


Скриншот рабочей формы