Pull to refresh

Одновременная работа php 5.2 и php 5.3 на Ubuntu 12.04

Reading time 9 min
Views 22K
Original author: Maciej Zgadzaj
image
Искал решение данной проблемы, так как держать устаревшую версию ubuntu 10.04 на отдельном сервере казалось излишним. Время на установку ~1 час. Установка производилась на работающем dev сервере.
Актуально для разработчиков под Drupal 6 и 7 и всех кто всё еще использует PHP 5.2.

Не смотря на то, что Drupal 7 нормально работает на PHP 5.3, Drupal 6 по-прежнему чувствует себя гораздо лучше с PHP 5.2. Хотя ядро D6 давно совместимо с PHP 5.3, у большинства разработчиков возникает невыносимая икота, когда они получают запрос о обновлении модуля до новой версии. Поэтому разработка для D7 и D6, становится более удобной при одновременной работе обоих версий PHP. (прим. таже это невероятно упрощает администрирование и сопровождение dev серверов путем исключения сервера с 5.2)

Одним из способов решения данной проблемы является использование mod_php5 для обработки скриптов PHP 5.3, и использования FastCGI модуля при необходимости обработки скриптов под PHP 5.2. Соответственно, для Ubuntu 12.04, можно установить PHP 5.3 из репозитория и затем вручную скомпилировать и установить PHP 5.2. Установка PHP 5.3 из репозиториев является довольно простой операцией, которую вы, скорее всего, уже выполняли, так что давайте просто решим, что она выглядит примерно так:

sudo apt-get install php5 php5-common php5-cli php5-dev php5-mysql phpmyadmin php5-pgsql phppgadmin php5-gd php5-mcrypt php5-curl php-pear libapache2-mod-php5 php5-xdebug php5-codesniffer

Примечательно, хотя этот пост сосредоточен на том как установить PHP 5.2, обе версии работают одинаково хорошо.

Загрузка исходного кода PHP

Начнем с загрузки исходного кода с предыдущих неподдерживаемых выпусков

Я первоначально начал с версии 5.2.10 (эта версия была установлена на наших stage серверах) но был внеезапно остановлен ошибкой OpenSSL на этапе конфигурирования.

/usr/include/openssl/conf.h:132:7: note: expected 'struct lhash_st_CONF_VALUE *' but argument is of type 'int *'
make: *** [ext/openssl/openssl.lo] Error 1


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

Что ж, загрузим и распакуем исходники в папку ~/Downloads/php-5.2.17

mkdir -p ~/Downloads/php-5.2.17
cd ~/Downloads/php-5.2.17
wget museum.php.net/php5/php-5.2.17.tar.gz
tar zxf php-5.2.17.tar.gz


Configure

Пришло время приступить к конфигурированию пакета. Ниже приведен пример вызова скрипта ./configure:

./configure
sudo ./configure \
--prefix=/usr/share/php52 \
--datadir=/usr/share/php52 \
--mandir=/usr/share/man \
--bindir=/usr/bin/php52 \
--with-libdir=lib64 \
--includedir=/usr/include \
--sysconfdir=/etc/php52/apache2 \
--with-config-file-path=/etc/php52/cli \
--with-config-file-scan-dir=/etc/php52/conf.d \
--localstatedir=/var \
--disable-debug \
--with-regex=php \
--disable-rpath \
--disable-static \
--disable-posix \
--with-pic \
--with-layout=GNU \
--with-pear=/usr/share/php \
--enable-calendar \
--enable-sysvsem \
--enable-sysvshm \
--enable-sysvmsg \
--enable-bcmath \
--with-bz2 \
--enable-ctype \
--with-db4 \
--without-gdbm \
--with-iconv \
--enable-exif \
--enable-ftp \
--enable-cli \
--with-gettext \
--enable-mbstring \
--with-pcre-regex=/usr \
--enable-shmop \
--enable-sockets \
--enable-wddx \
--with-libxml-dir=/usr \
--with-zlib \
--with-kerberos=/usr \
--with-openssl=/usr \
--enable-soap \
--enable-zip \
--with-mhash \
--with-exec-dir=/usr/lib/php5/libexec \
--without-mm \
--with-curl=shared,/usr \
--with-zlib-dir=/usr \
--with-gd=shared,/usr \
--enable-gd-native-ttf \
--with-gmp=shared,/usr \
--with-jpeg-dir=shared,/usr \
--with-xpm-dir=shared,/usr/X11R6 \
--with-png-dir=shared,/usr \
--with-freetype-dir=shared,/usr \
--with-ttf=shared,/usr \
--with-t1lib=shared,/usr \
--with-ldap=shared,/usr \
--with-mysql=shared,/usr \
--with-mysqli=shared,/usr/bin/mysql_config \
--with-pgsql=shared,/usr \
--with-pspell=shared,/usr \
--with-unixODBC=shared,/usr \
--with-xsl=shared,/usr \
--with-snmp=shared,/usr \
--with-sqlite=shared,/usr \
--with-tidy=shared,/usr \
--with-xmlrpc=shared \
--enable-pdo=shared \
--without-pdo-dblib \
--with-pdo-mysql=shared,/usr \
--with-pdo-pgsql=shared,/usr \
--with-pdo-odbc=shared,unixODBC,/usr \
--with-pdo-dblib=shared,/usr \
--enable-force-cgi-redirect --enable-fastcgi \
--with-libdir=/lib/x86_64-linux-gnu \
--with-pdo-sqlite=shared \
--with-sqlite=shared \
--enable-ipv6 \
--with-mcrypt \
--with-imap-ssl

Очевидно, что вы можете приспособить его к конкретным потребностям путем добавления и/или удаления соответствующих опций. Вы можете узнать больше о опциях которые вам нужны (или не нужны) в документации для PHP.

Ошибки ./configure

Итак, это, вероятно, не работает из коробки, не так ли? В большинстве случаев причина в отсутствующих зависимостях. Вы можете попробовать решить эту проблему одним выстрелом, если вы не слишком беспокоитесь об установке лишних библиотек и пакетов:

sudo apt-get install libxml2-dev libpcre3-dev libbz2-dev libcurl4-openssl-dev libdb4.8-dev libjpeg-dev libpng12-dev libxpm-dev libfreetype6-dev libmysqlclient-dev postgresql-server-dev-9.1 libt1-dev libgd2-xpm-dev libgmp-dev libsasl2-dev libmhash-dev unixodbc-dev freetds-dev libpspell-dev libsnmp-dev libtidy-dev libxslt1-dev libmcrypt-dev

Вы также можете исправлять ошибки отсутствующих зависимостей одну за другой, и устанавливать только те пакеты, которые действительно необходимы.

Давайте рассмотрим некоторые из возможных ошибок, (вы можете перейти к следующему разделу, если скрипт ./configure выполнен без ошибок и получено сообщение
Thank you for using PHP at the end of its execution


configure: error: xml2-config not found. Please check your libxml2 installation.

Эта ошибка предлагает нам проверить наличие пакета libxml2. В действительности же, это значит, что отсутствует его dev версия.

Давайте найдем доступные пакеты, которые могут помочь решить данную проблему:
$ apt-cache search libxml2 | grep dev
libcroco3-dev - Cascading Style Sheet (CSS) parsing and manipulation toolkit
libxml++2.6-dev - C++ interface to the GNOME XML library (libxml2)
libxml2-dev - Development files for the GNOME XML library
libgdome2-cpp-smart-dev - C++ bindings for GDome2 DOM implementation
libgdome2-dev - Development files for libgdome2
libgdome2-ocaml-dev - OCaml bindings for GDome2 DOM implementation
libgtkmathview-dev - rendering engine for MathML documents
libsp-gxmlcpp-dev - S+P C++ wrapper for Gnome libxml2/libxslt


Нас интересует libxml2-dev, устанавливаем его:
sudo apt-get install libxml2-dev

Такая же процедура применяется для всех отсутствующих библиотек, поэтому я приведу только окончательные команды установки:

fixes
configure: error: Could not find pcre.h in /usr
sudo apt-get install libpcre3-dev

configure: error: Please reinstall the BZip2 distribution
sudo apt-get install libbz2-dev

configure: error: Please reinstall the libcurl distribution — easy.h should be in /include/curl/
sudo apt-get install libcurl4-openssl-dev

configure: error: DBA: Could not find necessary header file(s).
checking for db4 major version… configure: error: Header contains different version

sudo apt-get install libdb4.8-dev

configure: error: libjpeg.(a|so) not found.
sudo apt-get install libjpeg-dev

configure: error: libpng.(a|so) not found.
sudo apt-get install libpng12-dev

configure: error: libXpm.(a|so) not found.
sudo apt-get install libxpm-dev

configure: error: freetype.h not found.
sudo apt-get install libfreetype6-dev

You need to install postgresql-server-dev-X.Y for building a server-side extension or libpq-dev for building a client-side application.
configure: error: Cannot find libpq-fe.h. Please specify correct PostgreSQL installation path

sudo apt-get install postgresql-server-dev-9.1

checking for FreeType 1 support… no — FreeType 2.x is to be used instead
configure: error: Your t1lib distribution is not installed correctly. Please reinstall it.

sudo apt-get install libt1-dev

configure: error: Unable to find gd.h anywhere under /usr
sudo apt-get install libgd2-xpm-dev

configure: error: Unable to locate gmp.h
sudo apt-get install libgmp-dev

configure: error: Cannot find MySQL header files under /usr.
Note that the MySQL client library is not bundled anymore!

sudo apt-get install libmysqlclient-dev

configure: error: sasl.h not found!
sudo apt-get install libsasl2-dev

configure: error: Please reinstall libmhash — I cannot find mhash.h
sudo apt-get install libmhash-dev

checking for unixODBC support… configure: error: ODBC header file '/usr/include/sqlext.h' not found!
sudo apt-get install unixodbc-dev

configure: error: Directory /usr is not a FreeTDS installation directory
sudo apt-get install freetds-dev

configure: error: Cannot find pspell
sudo apt-get install libpspell-dev

configure: error: SNMP sanity check failed. Please check config.log for more information.
sudo apt-get install libsnmp-dev

configure: error: Cannot find libtidy
sudo apt-get install libtidy-dev

configure: error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distribution
sudo apt-get install libxslt1-dev

configure: error: mcrypt.h not found. Please reinstall libmcrypt.
sudo apt-get install libmcrypt-dev

configure: error: Cannot find OpenSSL's libraries
Добавьте следующее в опции ./configure:
--with-libdir=/lib/x86_64-linux-gnu

configure: error: You've configured extension pdo_sqlite to build statically, but it depends on extension pdo, which you've configured to build shared. You either need to build pdo_sqlite shared or build pdo statically for the build to be successful.
Добавьте следующее в опции ./configure
--with-pdo-sqlite=shared
--with-sqlite=shared



Make
Все настроено правильно и без ошибок? Тогда пришло время для компиляции (и чашечки кофе во время его выполнения):

sudo make
Теперь можно, попивая кофе, ждать приближение ошибок.

Ошибки make

Да, весьма вероятно, что здесь все может пойти наперекосяк.
Вот две ошибки и один ворнинг, которые вы всего скорее всего получите:

fixes
ext/openssl/.libs/xp_ssl.o: In function `php_openssl_setup_crypto':
ext/openssl/xp_ssl.c:357: undefined reference to `SSLv2_server_method'
ext/openssl/xp_ssl.c:337: undefined reference to `SSLv2_client_method'


Это связано с багом #54736 которые лекго решаются применением патча прикрепленного к этому багрепорту

Скачайте этот патч в папку ~/Downloads/php-5.2.17 и выполните следующее:
patch -p1 < debian_patches_disable_SSLv2_for_openssl_1_0_0.patch.patch

Вы должны увидеть сообщение об успешном применении патча, наподобии этого:
patching file ext/openssl/xp_ssl.c
Hunk #1 succeeded at 332 (offset 4 lines).
Hunk #2 succeeded at 354 (offset 4 lines).
Hunk #3 succeeded at 583 (offset -50 lines).
Hunk #4 succeeded at 819 (offset -98 lines).


ext/gmp/gmp.c: In function ‘zif_gmp_random’:
ext/gmp/gmp.c:1399:69: error: ‘__GMP_BITS_PER_MP_LIMB’ undeclared (first use in this function)
ext/gmp/gmp.c:1399:69: note: each undeclared identifier is reported only once for each function it appears in


Пришло время исправить баг #50990
В одном из комментариев susan dot smith dot dev at gmail dot com предлагается следующее работающее решение, которое делает магию:

Я решила проблему заменой устаревшей постоянной определения __GMP_BITS_PER_MP_LIMB на GMP_LIMB_BITS, которая присутствует во всех предыдущих версиях и MPIR определяет тоже.


Вам нужно отредактировать файл ext/gmp/gmp.c и заменить __GMP_BITS_PER_MP_LIMB на GMP_LIMB_BITS. В моем случае это было строке 1399.

ext/zip/lib/.libs/zip_dirent.o: In function `memset':
/usr/include/x86_64-linux-gnu/bits/string3.h:82: warning: memset used with constant zero length parameter; this could be due to transposed parameters


Последний баг #53568 который довольно легко исправляется: откройте файл ext/zip/lib/zip_dirent.c и замените строкй 478:
memset(&tm, sizeof(tm), 0);
на
memset(&tm, 0, sizeof(tm));
Больше ошибок нет!


Install
Простейший вариант установки вашей блеcтящей новой версии PHP 5.2 является следующая команда:
sudo make install
Кроме того, если вы планируете повторить ту же установку еще раз на других машинах, или просто хотите сохранить файл пакета установки на будущее, вы можете запустить:
sudo checkinstall

которая вместе с установкой PHP? также создаст deb пакет в текущем каталоге.
Теперь, какой бы путь вы не выбрали, у вас установленЗРЗ 5.2 в /usr/bin/php52

Конфигурационные файлы Apache

Конфигурационный каталог /etc/php52/apache2/ уже должен быть создан в процессе установки (создайте его, если он отсутствует). Теперь нужно настроить PHP 5.2 на использование тех же расширений и модулей, которые использует PHP 5.3,

sudo ln -s /etc/php5/conf.d /etc/php52
sudo ln -s /etc/php5/cli /etc/php52


Скопируйте файл php.ini-recommended в новый каталог (который будет определен в следующем шаге)
sudo cp php.ini-recommended /etc/php52/apache2/php.ini
и если нужно, внесите необходимые настройки.

Apache и FastCGI

Следующая вещь, которую мы сделаем, будет настройка apache для запуска PHP 5.2 используя FastCGI. Начнем установку fastcgi модуля:
sudo apt-get install libapache2-mod-fastcgi

Убедитесь, что все требуемые модули включены и перезапустите Apache:
sudo a2enmod cgi fastcgi actions
sudo service apache2 restart


Создайте исполняемый скрипт php52-cgi для запуска FastCGI версии PHP и поместите его в /usr/lib/cgi-bin/:
#!/bin/sh
PHPRC="/etc/php52/apache2/"
export PHPRC
PHP_FCGI_CHILDREN=4
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_MAX_REQUESTS
exec /usr/bin/php52/php-cgi


PHPRC этот параметр указывает на php.ini
PHP_FCGI_CHILDREN количество потоков
PHP_FCGI_MAX_REQUESTS лимит запросов
Вы можете узнать больше об этом на сайте FastCGI.

Дайте права на запуск:
sudo chmod +x /usr/lib/cgi-bin/php52-cgi

Наконец создайте новый файл /etc/apache2/php52.conf который будет использоваться для виртуальных хостов, которые требую использования PHP 5.2:
# Include file for virtual hosts that need to run PHP 5.2

<FilesMatch "\.php">
SetHandler application/x-httpd-php5


ScriptAlias /php52-cgi /usr/lib/cgi-bin/php52-cgi
Action application/x-httpd-php5 /php52-cgi
AddHandler application/x-httpd-php5 .php

FilesMatch переопределяет обработчик php файлов.
ScriptAlias задет путь к CGI скрипту
AddHandler регистрирует новый обработчик
Action активизирует CGI-скрипт для работы с файлами переданных от обработчика.

Почти всё!

Осталось только одно: для всех хостов, для которых вы хотите использовать PHP 5.2 нужно добавить в конфигурационный файл следующую строку:

Include php52.conf
и перегрузить новую конфигурацию:
sudo service apache2 reload

Поздравляю! Теперь у вас есть есть сервер с одновременно работающими версиями PHP 5.2 и PHP 5.3!

P.S. Все опечятки и замечания прошу отправлять в ПМ. v
Tags:
Hubs:
-1
Comments 31
Comments Comments 31

Articles