При работе с текущей стабильной веткой 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
Чего мы и добивались.
Не забудьте при этом заблокировать обновление нужных пакетов иначе после следующего обновления вы будете ставить их опять.