Сборка php5.3 из исходников на Ubuntu 14.04

Имеется сервер на Ubuntu 14.04 с установленным php 5.5 и mariaDB 10, но при этом некоторые сайты в упор не хотят заводиться на новом php, и требуют более старую версию. Не вопрос, будем им php5.3, который мы собственноручно соберем из исходников.

Первым делом скачиваем последнюю доступную версию — PHP5.3.29. Про версии младше 5.3.16 смотрите ниже.

wget http://ua2.php.net/distributions/php-5.3.29.tar.gz

Распаковываем

tar -zxvf php-5.3.29.tar.gz

Переходим в папку

cd php-5.3.29

Готовим все необходимые зависимости:
apt-get install libxml2-dev libcurl4-openssl-dev pkg-config libbz2-dev libjpeg-dev libpng-dev libfreetype6-dev libgmp-dev libc-client2007e-dev libmcrypt-dev libmhash-dev libmariadbclient-dev postgresql-server-dev-9.3 libxslt-dev build-essential autoconf automake1.9 libtool flex bison debhelper binutils-gold

Небольшая заметка про  libmysqlclient-dev:
Если уже установлена MariaDB10, то можно получить следующую ошибку:
libmysqlclient-dev : Depends: libmysqlclient18 (= 5.5.32-0ubuntu0.12.04.1) but 10.0.0+maria-1precise is to be installed
В таком случае заменяем libmysqlclient-dev на libmariadbclient-dev.

Делаем необходимые симлинки:

ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so /usr/lib/libjpeg.so
ln -s /usr/lib/x86_64-linux-gnu/libpng.so /usr/lib/libpng.so
mkdir /usr/include/freetype2/freetype
ln -s /usr/include/freetype2/freetype.h /usr/include/freetype2/freetype/freetype.h
ln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h
ln -s /usr/lib/x86_64-linux-gnu/libkrb5.so /usr/lib/libkrb5.so
ln -s /usr/lib/x86_64-linux-gnu/libmariadbclient.so /usr/lib/libmysqlclient.so

Не забываем создать папку для старого php

mkdir /opt/php5.3

Далее конфигурируем php с нужными нам модулями:

./configure --prefix=/opt/php-5.3.29 \
--with-config-file-path=/opt/php-5.3.29/lib \
--enable-xml \
--enable-cgi \
--enable-cli \
--enable-gd-native-ttf \
--with-pgsql \
--with-pdo-pgsql \
--with-zlib-dir \
--with-freetype-dir=/usr \
--with-libxml-dir=/usr
--enable-soap \
--with-mcrypt \
--with-zlib \
--enable-mbstring \
--enable-pdo \
--with-curl \
--disable-debug \
--with-pic \
--disable-rpath \
--enable-inline-optimization \
--with-bz2 \
--with-zlib \
--enable-sockets \
--enable-sysvsem \
--enable-sysvshm \
--enable-pcntl \
--enable-mbregex \
--with-mhash \
--with-xsl \
--with-xmlrpc \
--enable-zip \
--with-pcre-regex \
--with-gd \
--with-pdo-sqlite \
--with-pdo-mysql \
--with-mysql-sock=/var/run/mysqld/mysqld.sock \
--with-sqlite \
--with-jpeg-dir=/usr \
--with-png-dir=/usr \
--with-mysql \
--enable-bcmath \
--enable-calendar \
--enable-exif \
--enable-ftp \
--with-gettext \
--with-imap \
--with-mysqli \
--with-openssl \
--with-kerberos \
--with-imap-ssl \
--with-gmp \
--enable-shmop \
--enable-wddx

Php будет собран как cgi-модуль для Apache. Если нужен fpm, замените —enable-cgi на —enable-fpm

Если все прошло прошло без ошибок выполняем:

make
make install

О 5.3.1 <= PHP <= 5.3.16.

На версиях PHP <= 5.3.16 будут гарантированные ошибки при сборке, т.к. эти версии не могут быть скомпилированы с библиотекой libxml2 >= 2.9.0. Но если очень-очень надо, то есть заплатка на этот случай. Т.е. если вы при выполнении команды make видите следующие ошибки:

In file included from /home/noam/.phpbrew/build/php-5.4.0/main/php.h:38:0,
from /home/noam/.phpbrew/build/php-5.4.0/ext/dom/node.c:26:
/home/noam/.phpbrew/build/php-5.4.0/ext/dom/node.c:1900:40: error: dereferencing pointer to incomplete type
RETVAL_STRINGL((char *) buf->buffer->content, ret, 1);
^
/home/noam/.phpbrew/build/php-5.4.0/Zend/zend_API.h:571:20: note: in definition of macro ‘ZVAL_STRINGL’
const char *__s=(s); int __l=l; \
^
/home/noam/.phpbrew/build/php-5.4.0/ext/dom/node.c:1900:5: note: in expansion of macro ‘RETVAL_STRINGL’
RETVAL_STRINGL((char *) buf->buffer->content, ret, 1);
^
make: *** [ext/dom/node.lo] Error 1

То нужно эту самую заплатку скачать и применить. В папке с php делаем следующее:

wget https://mail.gnome.org/archives/xml/2012-August/txtbgxGXAvz4N.txt | patch -p0
patching file ext/dom/node.c
patching file ext/dom/documenttype.c
patching file ext/simplexml/simplexml.c

После чего все должно нормально собраться и скомпилироваться.