Решил я сделать сборку PHP 5.2.10 для продакшена ибо в официальных репозиториях Centos последняя версия 5.1.6, а из неофициальных брать не очень хочется. Решил собрать так, основной php без каких либо расширений, а нужные расширения подгружать динамически из so файлов.
Но не тут то было. Найти пошаговое руководство на удалось. Долгие поиски, сборка разрозненных данных из сети и куча опытов позволили все же выяснить, как это лучше осуществить.
Качаем исходники нужной версии, я их распаковал в /root/php-5.2.10.
PHP устанавливается:
- исходники находятся: /root/php-5.2.10/
- директория установки: /opt/php/5.2.10/
- директорию файла конфига: /opt/php/5.2.10/etc/
- дополнительные файлы конфига: /opt/php/5.2.10/etc/php.d/
- директория файлов модулей: /opt/php/5.2.10/modules/
Конфигурируем:
./configure --prefix=/opt/php/5.2.10 --exec-prefix=/opt/php/5.2.10 --sysconfdir=/etc --with-libdir=/usr/lib64 --disable-rpath --with-apxs2=/usr/sbin/apxs --with-config-file-path=/etc/php/5.2.10 --with-config-file-scan-dir=/etc/php/5.2.10/php.d --disable-all
- prefix - директория установки архитектурно независимых файлов;
- exec-prefix - директорию установки архитектурно зависимых файлов, если не указывается, то равно prefix;
- sysconfdir - директория с файлами конфигурации;
- with-libdir - расположение библиотек;
- disable-rpath - директива запрещает поиск библиотек испольняемых файлов в дополнительных каталогах;
- with-apxs2 - директива позволяет компилировать PHP как совместно используемый модуль Apache 2.0.X, применяя инструментарий apxs;
- with-config-file-path - директива указывает каталог, в котором размещён файл конфигурации PHP php.ini;
- with-config-file-scan-dir - директива устанавливает путь сканирования файлов конфигурации;
- disable-all - директива отключает все устанавливаемые модули по умолчанию.
Несмотря на явно заданный аргумент disable-all после make install в /opt/php/5.2.10/bin/php у нас будет собрано 3 модуля:
# /opt/php/5.2.10/bin/php -m
[PHP Modules]
date
Reflection
standard
[Zend Modules]
Поэтому включать их в php.ini как so уже не нужно.
До этого все было достаточно очевидно, но вот как теперь собирать расширения в виде модулей? Оказывается достаточно просто. Тут нам поможет phpize который для расширений может создавать свои configure файлы (к слову, он же позволить собрать модули из PECL). Но для начала не забываем его сделать исполняемым. Теперь собираем bcmath:
# chmod 0744 /root/php-5.2.10/scripts/phpize
# cd /root/php-5.2.10/ext/bcmath
# /root/php-5.2.10/scripts/phpize
# ./configure --prefix=/opt/php/5.2.10 --exec-prefix=/opt/php/5.2.10 --sysconfdir=/etc --with-libdir=/usr/lib64 --disable-rpath --with-config-file-path=/etc/php/5.2.10 --with-config-file-scan-dir=/etc/php/5.2.10/php.d --enable-bcmath=shared --disable-static
И все вроде проходит нормально, но тут меня ждала подстава. После make install модуль установился в /opt/php/5.2.10/lib/php/extensions/no-debug-non-zts-20060613/. Просмотрев не один раз описание опций компиляции так и не нашел, каким же образом заставить проводить установку в нужную мне директорию. Но выход найден был.
В scripts есть файл php-config. Открываем его в любом редакторе, находим директиву extension_dir и прописываем нужно нам значение. Соответственно, у меня получилось extension_dir='/opt/php/5.2.10/modules'. Теперь делаем файл исполняемым и при сборке расширений просто указываем его в аргументе with-php-config:
# ./configure --with-php-config=/root/php-5.2.10/scripts/php-config --enable-bcmath=shared --disable-static
И все. Данный флаг позволяет подгрузить опции из указанного файла, что очень удобно. Теперь для компиляции модуля нужно дополнительно указать специфичные для расширения опции и все, можно делать сборку и установку.
Надеюсь приведенная инфа окажется полезной и сэкономит не один час копания в дереве исходников ;)