(не доработано) Речь в заметке пойдёт о модуле PHP7, покдлюченном как модуль апача на всём сервере, и PHP5.6, подключенном как PHP-CGI у нужных сайтов.
И речь пойдёт не о быстрой смене версии php на всём сервере, а именно о том, чтобы, например, все сайты на сервере работали с PHP7, а один или несколько, например с PHP5.
Скачиваем исходники PHP нужной версии, распаковываем и переходим в папку с ними
$ cd /tmp
$ wget -O php-5.6.16.tar.bz2 http://php.net/get/php-5.6.16.tar.bz2/from/this/mirror
$ tar -xvf php-5.6.16.tar.bz2
$ cd php-5.6.16
Собираем нужную версию php
Компилируем php тремя коммандами:
1.
./configure \
—enable-pdo \
—with-pdo-mysql \
—with-mysql \
—with-mysqli \
—enable-mbstring \
—with-curl \
—with-gd \
—with-mcrypt \
—with-vpx-dir \
—with-jpeg-dir \
—with-png-dir \
—with-freetype-dir \
—with-xpm-dir \
—with-zlib-dir \
—with-openssl \
—with-pear
Во время конфигурирования скорее всего будут ошибки. Они по большей части свидетельствуют о отсутствующих пакетах на сервере. Названия недостающих легко гугляться.
2.
$ make
3.
$ make install
Копируем получившийся бинарник
Файл /usr/local/bin/php-cgi надо переименовать и положить по пути /usr/lib/cgi-bin/php5
Настраиваем нужный VirtualHost апача для работы с нашим бинарником
Ну и самое главное — это заставить нужный хост не работать как модуль апача. Скажу честно, на поиск решения я потратил не мало времени.
Эти строчки нужно добавить в нужный VirtualHost
<FilesMatch \.php$>
SetHandler application/x-httpd-php5
</FilesMatch>
AddHandler application/x-httpd-php5 .php
Action application/x-httpd-php5 /cgi-bin/php5
Нюансы и возможные проблемы
- Ошибка: Invalid command ‘Action’, perhaps misspelled or defined by a module not included in the server configuration
Не включен модуль апача actions. Включаем:
$ a2enmod actions
$ service apache2 restart
- Файл php.ini будет погдружаться из папки /usr/local/lib/. Изменить это можно опцией —with-config-file-path с выбором при компиляции.
- Также должен быть включен конфиг апача serve-cgi-bin
$ a2enconf serve-cgi-bin $ service apache2 restar
Эта статья описывает метод установки произвольного количества версий 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/apache24/httpd.conf ScriptAlias /cgi-bin/ "/usr/local/www/apache24/cgi-bin/" Переходим в папку cgi-bin zg# cd /usr/local/www/apache24/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/apache24/httpd.conf Находим секцию <Directory "/usr/local/www/apache24/cgi-bin">. И заменяем (или добавляем) Options None на Options FollowSymLinks. У меня конфиг получился таким: <Directory "/usr/local/www/apache24/cgi-bin"> AllowOverride None Options FollowSymLinks Require all granted </Directory> Сохраняем файл и выходим из редактора. ------------------ V. Настройка папки с несколькими версиями PHP ----------------- Создаём конфиг для папки, в которой будет работать несколько версий пхп zg# ee /usr/local/etc/apache24/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 Require all granted </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 года.
Дополнительно
Скриншоты рабочей формы
Источник: https://anton-pribora.ru/articles/os/freebsd/freebsd-apache-multi-php/