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

Original author: Maciej Zgadzaj
  • Translation
  • Tutorial
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
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 31

    +6
    sudo make install
    
    За это хочется убивать.
    Еще за chmod -R 777 /path/to/www
      +7
      Справедливости ради — автор всё же указал на использование checkinstall.
      0
      ну chmod 777 это конечно крайность, а вот почему не стоит выполнять sudo make install , я не знал.
        +1
        Извращение. Виртуализация же есть
          0
          Извращение это виртуализация для запуска одного приложения. chroot на крайний случай.
            +1
            Если вам требуется 2 версии пхп, значит приложений уже как минимум 2.
            0
            Есть VDS, на котором нужны и 5.2 и 5.3 (или и 5.3, и 5.4) — предлагаете на нем ещё внутреннюю виртуализацию поднимать, держать два ядра, два вебсервера и т. д.?
              0
              А зачем нужен VDS, когда можно взять полноценный сервак? Если проектам требуются разные окружения, создавать виртуалки с разным окружениям.
                +2
                Дешевле.
                  0
                  Не существенно по сравнению с получаемыми плюшками. Десяток нормальных серверов + вдска для днс, вам будут стоить на уровне 1000 евро в месяц.
                    +1
                    На порядок дороже.
                      0
                      Зажигалка на порядок дороже спичек, но тем не менее курильщики пользуются зажигалками — удобнее ведь, да и разница в абсолютных величинах несущественная. Так же и тут
                        +2
                        Зажигалки («одноразовые») дешевле чем спички, это я вам как курильщик с 15 годами стажа говорю. Обычного коробка спичек ценой 1 рубль (а то и 2) мне хватает максимум на 3 пачки, самой простой зажигалки ценой рублей в 7 хватает на 30 пачек минимум (при покупке проверить уровень газа и минимальный уровень пламени). А если брать дешевые заправляемые пьезозажигалки (рублей 15-20) и дешевый баллон газа (рублей 100 максимум), то ещё дешевле выйдет, но тут, имхо, овчинка выделки не стоит — зажигалки теряются чаще чем кончаются.

                        А если для вас разница между 100 евро и 1000, да даже между 10 евро и 100, причем ежемесячно, несущественна, то остается только вам позавидовать.
                          0
                          Ну я же говорю с позиции ИТ-компании. Лично мне например вообще сервера не нужны
                            0
                            Ну и компании разные бывают. У нашей доход хорошо если 1000 евро.
            0
            Сжечь бы таких кто старается 5.2 сохранить и остаётся на нём!!!
              +1
              Вы предлагаете, с выходом каждого мажорного релиза, бросать все дела и засаживаться за перевод всего имеющегося кода на новую версию?=)

              У нас до сих пор 5.1 и даже 4 есть в некоторых живых и поддерживаемых проектах
                +3
                Примите мои соболезнования
                  –2
                  А к чему собственно соболезнования? Это нормальная ситуация=)
                    0
                    4 уж точно не нормальная. Бог с ним с администрированием, но если код нужно менять… Тут постоянно нарываешься на то, что 5.4 с 5.3 не совместимы.
                      0
                      Если проект работает — то миграция может быть финансово не обоснована.
                        0
                        Я не про финансовую сторону, а про поддержку программистами. Лично у меня производительность падает даже когда перехожу с 5.4 на 5.3. Например, чисто на автомате пишу [] вместо array() и получаю ошибку при тестах. И хорошо, если тесты это заметят, а не на продакшене ошибка вывалится :)
                          0
                          в Intelij Idea например с пхп плагином можно выбрать используемую версию компилятора, и ИДЕ автоматом подсветит использование неподдерживаемого синтаксиса. Тоже влюбился в короткую запись массивов =)
                            0
                            Она так много всего подсвечивает, что иногда глаз замыливается.
                            P.S. Только ради [] нужно переходить на 5.4 :)
              +1
              PHP 5.2 дыряв (дыры в самом PHP), рекомендую на него накладывать security-patch code.google.com/p/php52-backports/
              Скажем, в Debian/Ubuntu 8.04 где PHP 5.2 большинство патчей безопасности было наложено, также в RHEL 5.x где PHP 5.1 также периодически выходят обновления безопасности.

              А в целом все-таки лучше думать о миграции «боевых» сайтов на новое ПО, так как PHP 5.2 уже не поддерживается разработчиками PHP несколько лет
                0
                как по мне — попытка запустить что-то на 5.2 (да и сам 5.2) — это несерьезно.
                версия 5.3 вышла без малого 4 года назад. прекратите выкапывать стюардессу.
                  +1
                  Попытка запустить что-то новое — да. Переписывать работающий сайт из-за того, что хостер перестал 4 поддерживать далеко не всегда может быть оправдана экономически. Да и можно тупо не успеть за неделю переписать (про тестирование молчу), если хостер соблаговолил о прекращении поддержки сообщить за неделю, а то и вообще перед фактом поставил, причем об этом узнали от пользователей.
                  0
                  Я когда-то решал похожую задачу с помощью phpfarm.
                  Для быстрого старта наверное чуть интереснее будет. Там же описана настройка Апача.
                    +1
                    А комментарии на тему «php < 5.4 — старье» — глупость. Все равно умение поднять на рабочей машине / dev серваке вторую версию php не помешает. Я благодаря этому сумел быстро подключиться к работе над проектом, в котором нужно было СРОЧНО (впрочем, как всегда) начинать фиксить баги.
                      0
                      не за горами убунта 13.04, а вы ставите 5.3 из пакетов. Уже давно в пакетах версия 5.4. Так что очень скоро вам придётся переписывать статью (когда там 12.04 устареет?)
                      Вообще, я считаю идею с LTS-версиями Убунты порочной. Если вам на сервер, то можно же использовать, например, Дебиан. Если на десктоп, то многие разрабы забивают болт на старые версии дистра, даже если он называется LTS.
                        0
                        Есть нюансы, по которым Ubuntu LTS лучше примерно сравнимого по версиям пакетов Debian.

                      Only users with full accounts can post comments. Log in, please.