Ситуация проста: на новый и очаровательный сервер с Ubuntu 10.04+ и современным (когда-то) PHP 5.3, пригодным для всех актуальных версий CMS, вдруг требуется подселить старый-старый сайт, начинающий сыпать ошибками при попытке запуска на PHP 5.3 (подавай ему чего-нибудь постарше, например, PHP 5.2). Кто виноват — понятно. Но что делать?

Не паниковать! На одном сервере с одним Apache2 прекрасно заводятся и соседствуют PHP 5.2 (через fastcgi) и PHP 5.3 (как модуль Apache2). Мы далее решим проблему так, что указать какой именно PHP использовать можно будет на уровне настроек виртуального хоста.

Эта статья была обновлена до актуального состояния. В частности, ссылки на PHP 5.2 тут рабочие (он переехал в музей старых версий). Мануал не годен для Ubuntu 13.10, поскольку там при сборке php не удаётся подцепить
libjpeg62

. В общем, коли уж вам приходится заниматься некрофилией, то выбирайте для этого и систему постарее (разумеется, в отдельной виртуалке или на отдельном ни на что более не годном VPS).

Скачиваем дистрибутив php 5.2:

wget http://museum.php.net/php5/php-5.2.17.tar.gz

Распаковываем архив:

tar zxvf php-5.2.17.tar.gz

Заходим в директорию:

cd php-5.2.17

Устанавливаем зависимости:

sudo aptitude install libxml2-dev libmysqlclient-dev libcurl4-gnutls-dev libpng12-dev libjpeg62-dev make
Конфигурируем, собираем и ставим из исходников наш php 5.2 в директорию
/opt/php5.2

:

./configure --prefix=/opt/php5.2 --with-config-file-path=/opt/php5.2 --with-mysqli --with-mysql --with-curl --with-gd --with-jpeg-dir --enable-cli --enable-fastcgi --enable-discard-path --enable-force-cgi-redirect
make
sudo make install
Мы, убунтоводы, избалованы готовыми пакетами, так что наберитесь терпения: с непривычки может показаться, что сборка (по команде
make

) занимает много времени 🙂

Когда всё установиться, можно убедиться в том, что на вашем сервере теперь появилась нужная версия php такой командой:

/opt/php5.2/bin/php -v

Однако, про этот php пока ничего не знает наш уважаемый веб-сервер Apache2. Мы их познакомим через fastcgi.

Ставим:

sudo aptitude install apache2-suexec libapache2-mod-fcgid

Включаем нужные модули Apache2:

sudo a2enmod cgi fcgid actions

Перезапускаем Apache, чтобы модули подцепились:

sudo service apache2 restart
Теперь создадим файл (он будет просто обёрткой, вызывающей наш исполнимый бинарник
/opt/php5.2/bin/php-cgi

, но с нужными настройками, которые вы можете изменить или дополнить):

sudo nano /usr/lib/cgi-bin/php52-cgi

И туда поместим буквально следующее:

#!/bin/sh
PHPRC="/opt/php5.2/"
export PHPRC
PHP_FCGI_CHILDREN=4
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_MAX_REQUESTS
exec /opt/php5.2/bin/php-cgi

Сделаем файл исполнимым:

sudo chmod +x /usr/lib/cgi-bin/php52-cgi

Теперь создадим необходимую часть конфига для виртуальных хостов, которым потребуется php 5.2:

sudo nano /etc/apache2/php52.conf

Поместим в файл следующее:

<FilesMatch ".php">
SetHandler application/x-httpd-php5
</FilesMatch>
ScriptAlias /php52-cgi /usr/lib/cgi-bin/php52-cgi
Action application/x-httpd-php5 /php52-cgi
AddHandler application/x-httpd-php5 .php

Теперь давайте пойдём в конфиг того виртуального хоста, который должен работать с php 5.2 и добавим в него следующую строку (например, после DocumentRoot...):

...
Include php52.conf
...

Перезапустим Apache, чтобы подцепились новые настройки виртуального хоста:

sudo service apache2 restart

Готово! Идите на нужный хост и проверяйте: он теперь обслуживается php 5.2.

Необязательный бонус. Прикручиваем к этому барахлу Zend Optimizer

Скачать совместимую с 5.2.17 версию пока ещё можно тут: http://www.zend.com/en/products/guard/downloads-prev?platform=Linux (потребуется регистрация)

Полученный архив скидывайте на сервер и доставайте из него файл
ZendOptimizer.so
из директории
./ZendOptimizer-3.3.9-linux-glibc23-i386/data/5_2_x_comp/

Создавайте директорию для хранения библиотеки:

mkdir /usr/local/lib/Zend

Перемещайте туда файл библиотеки (если вы распаковывали на сервере, то он уже будет исполнимым, если нет, то сделайте его таковым):

mv ZendOptimizer.so /usr/local/lib/Zend/

Создайте файл с конфигурацией для php:

sudo nano /opt/php5.2/etc/php.ini

Добавьте туда строки:

zend_extension=/usr/local/lib/Zend/ZendOptimizer.so
zend_optimizer.optimization_level=15
Сохраните файл. Теперь добавьте загрузку .ini файла при старте php. Для этого редактируем файл
sudo nano /usr/lib/cgi-bin/php52-cgi
Последнюю строку
exec /opt/php5.2/bin/php-cgi
меняем на
exec /opt/php5.2/bin/php-cgi -c /opt/php5.2/etc/php.ini
Теперь при выводе
phpinfo();

вы увидите заветные строчки:

phpinfo-with-zend-optimizer