Эта статья описывает метод установки произвольного количества версий 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 года.