Пересборка php 5.3.x с клиентскими библиотеками MariaDB 10.x

При работе с текущей стабильной веткой MariaDB 10.x часто возникает проблема несовместимости клиентских библиотек. Выражается это вот так например:

mysql_connect(): Headers and client library minor version mismatch.

На эту тему есть даже отдельная статья по устранению неисправностей при работе с MariaDB из PHP 5. Для всех нормальных людей подходит рекомендуемый совет из той статьи: использовать mysqlnd-драйвер. Однако проблема в том, что старые версии PHP, а именно 5.3.x не имеют этот драйвер в своем составе по-умолчанию. Приходится либо переходить на более новую версию php с ожидаемыми глюками работы древних клиентских сайтов, либо вручную пересобирать клиентские библиотеки PHP. Это кстати один из предложенных способов решения проблемы по вышеприведенной ссылке. Вот как раз второе мы и рассмотрим в этой статье.

Пересборка делается довольно легко. Для этого понадобится только организовать соответствующее окружение. С недавнего времения я делаю это в контейнерах Docker. Как оказалось — это очень удобный инструмент подобного класса задач.

Итак, для начала создаем контейнер и ставим туда весь необходимый софт:

docker run -it centos:centos6 /bin/bash

Попав внуть контейнера обновляем и ставим необходимый для сборки софт:

yum -y update && yum -y groupinstall "Development Tools" && yum -y install yum-utils rpmdevtools rpmbuild

Конечно создание этого образа можно автоматизировать с помощью соответствующего Dockerfile, что я и предлагаю сделать вам в качестве домашнего задания. Далее нам нужно установить клиентские библиотеки MariaDB. Для чего добавляем в /etc/yum.repos.d/ файл MariaDB.repo такого содержания:

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.0/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

и устанавливаем нужные библиотеки:

yum -y install MariaDB-devel MariaDB-common MariaDB-compat MariaDB-shared

Скачиваем нужные исходные тексты в виде *.src.rpm. Мы же не совсем дикари и соберем цивилизованные пакеты, чтобы можно было обновлять из по мере надобности. Скачать пока они есть можно тут. Натравливаем на него yum-builddep для того чтобы скачать все зависимости для сбоки этого пакета:

yum-builddep  php-5.3.3-27.el6_5.src.rpm

Далее создаем пользователя сборки пакета (т.к. официальная документация не рекомендует собирать пакеты от рута):

useradd phpbuilder

Входим под его именем:

su - phpbuilder

И создаем окружения для сборки:

rpmdev-setuptree

Устанавливаем *.src.rpm внутрь этого дерева сборки:

rpm -i php-5.3.3-27.el6_5.src.rpm

И запускаем процесс сборки:

rpmbuild -ba ~/rpmbuild/SPECS/php.spec

и… напарываемся на первые грабли:

[убраный вывод]
checking for MySQLi support... yes, shared
checking whether to enable embedded MySQLi support... no
mysql_config not found
configure: error: Please reinstall the mysql distribution
error: Bad exit status from /var/tmp/rpm-tmp.Ib5uRV (%build)

Конфигурационный скрипт не может найти mysql_config. Ищем его: whereis mysql_config и видим, что он находися тут: /usr/bin/mysql_config. Где же его ищет конфигуратор? Для этого смотрим в php.spec и видим:

# Use the arch-specific mysql_config binary to avoid mismatch with the
# arch detection heuristic used by bindir/mysql_config.
%define mysql_config %{_libdir}/mysql/mysql_config

Т.е. его конфигуратор ищет в %{_libdir}/mysql/ или в нашем случае /usr/lib64/mysql/ Скорее всего создатели MariaDB сознательно изменили место этого бинарника, чтобы в случае использования нескольких «движков» БД на одной машине иметь возможность выбирать. Исправляем ситуацию запустив от имени root:

ln -s /usr/bin/mysql_config /usr/lib64/mysql/mysql_config

И снова возвращаемся к сборке. У меня больше никаких проблем не вылезло при сборке. В результате в ~/rpmbuild/RPMS мы имеем нужный набор пакетов:

 php-5.3.3-27.el6.x86_64.rpm
 php-bcmath-5.3.3-27.el6.x86_64.rpm
 php-cli-5.3.3-27.el6.x86_64.rpm
 php-common-5.3.3-27.el6.x86_64.rpm
 php-dba-5.3.3-27.el6.x86_64.rpm
 php-debuginfo-5.3.3-27.el6.x86_64.rpm
 php-devel-5.3.3-27.el6.x86_64.rpm
 php-embedded-5.3.3-27.el6.x86_64.rpm
 php-enchant-5.3.3-27.el6.x86_64.rpm
 php-fpm-5.3.3-27.el6.x86_64.rpm
 php-gd-5.3.3-27.el6.x86_64.rpm
 php-imap-5.3.3-27.el6.x86_64.rpm
 php-intl-5.3.3-27.el6.x86_64.rpm
 php-ldap-5.3.3-27.el6.x86_64.rpm
 php-mbstring-5.3.3-27.el6.x86_64.rpm
 php-mysql-5.3.3-27.el6.x86_64.rpm
 php-odbc-5.3.3-27.el6.x86_64.rpm
 php-pdo-5.3.3-27.el6.x86_64.rpm
 php-pgsql-5.3.3-27.el6.x86_64.rpm
 php-process-5.3.3-27.el6.x86_64.rpm
 php-pspell-5.3.3-27.el6.x86_64.rpm
 php-recode-5.3.3-27.el6.x86_64.rpm
 php-snmp-5.3.3-27.el6.x86_64.rpm
 php-soap-5.3.3-27.el6.x86_64.rpm
 php-tidy-5.3.3-27.el6.x86_64.rpm
 php-xml-5.3.3-27.el6.x86_64.rpm
 php-xmlrpc-5.3.3-27.el6.x86_64.rpm
 php-zts-5.3.3-27.el6.x86_64.rpm

Из них выбираем нужные и устанавливаем их. Проверяем, какие версии API у нас теперь:

php -i | grep API

И видим:

Client API version => 10.0.14-MariaDB
Client API library version => 10.0.14-MariaDB
Client API header version => 10.0.14-MariaDB
Client API version => 10.0.14-MariaDB

Чего мы и добивались.

Не забудьте при этом заблокировать обновление нужных пакетов иначе после следующего обновления вы будете ставить их опять.

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.