klink0v (klink0v) wrote,
klink0v
klink0v

MS ODBC Driver 13 + PHP 7.0 + Debian 9

В продолжение предыдущего псто. Таки заставил я работать этот несчастный MSSQL-драйвер для PHP7. Это называется "среди багов нащупал дорогу".

Во-первых, отвечаю на вопрос из комментов, почему не годится PDO_DBLIB. Наш программист говорит, что он слишком неинформативен. То есть, ему по долгу службы и в соответствии с принятой парадигмой построения решений приходится формировать сложные навороченные SQL-запросы. И в "стандартном" механизме "коробочных" PHP-коннекторов нет никакой возможности отследить, а не возникло ли какой-нибудь ошибки в процессе выполнения этого запроса. Стандартный пример: посылаем в одном запросе два SELECT-а, один из существующей таблицы, второй — из несуществующей. В зависимости от порядка следования этих SELECT-ов мы можем либо получить, либо не получить ссылку на результирующий Dataset. И единственной возможностью контролировать всё это дело является парсинг stdout-а от SQL Server-а на предмет наличия в нём Warning-ов, зачастую совершенно неинформативных. Что ни разу не удобно. Поэтому меня и попросили подключить "родной" ODBC-шный коннектор.

Далее, краткая инфа и ссылки, чтобы прежде всего самому потом не забыть как это делается. Речь идёт о дистрибутиве Debian 9 (Stretch) amd64.

Во-первых, 7-ая "пыха" полноценно появилась только в Stretch-е. И раз уж решено с оным связываться, то городить смесь из стабильного и тестируемого дистрибутива нет никакого смысла. Проще уж сразу целиком разворачивать тестируемый. Баги попадаются, да. Но по мере приближения к релизу их всё меньше. Во-вторых, MS принципиально отказалась от поддержки i386, так что придется брать amd64. И даже если каким-то макаром удастся собрать сам PHP-коннектор из исходников, то вот ODBC-драйвер по-любому придется ставить бинарный. Может я плохо искал, но сырцов его я пока не встретил.

Теперь о подводных камнях. Вроде бы по зависимостям там ничего особо экзотического нет. Но нужно иметь в системе установленные пакетики: libcurl3, unixodbc и внезапно... libssl1.0.0 из репозитория Jessie. Вот так неочевидно, ага. Со штатными libssl1.0.2 и libssl1.1 оно заводиться не хочет, требует обязательно версию потухлее. Еще из неочевидных моментов — нужно позаботиться о том, чтобы в системе присутствовала локаль "en_US.UTF-8". Без неё почему-то никак и никуда. Также если SQL-сервер слушает на нестандартном порту, то в строке подключения его нужно указывать через запятую, а не через двоеточие.

Где брать.


  1. На момент написания этого псто актуальной версией ODBC-библиотеки была 13-ая. Подходит от 16-ой убунты. Ссылки на DEB-пакеты: раз, два. Ставятся "как обычно", дополнительных зависимостей с сайта MS за собой не тянут, работают "из коробки".

  2. Сами PHP-шные коннекторы. Бинарники тут (версия релиза 4.0.8). В архиве лежит четыре разных библиотеки: "обычная", PDO (PHP Data Object), "NTS" (non thread-safe) и "TS" (thread-safe). Зачем они так собирают непонятно, потому что для Linux-а thread-safe версии неактуальны.

Так что берем из архива "php_sqlsrv_7_nts.so", редактируем права на доступ к файлу, копируем в "/usr/lib/php/20151012/" и создаем ini-конфиги для подключения модуля в "/etc/php/7.0/mods-available", а также символические ссылки на них. Вроде больше ничего шаманить не надо. Если же что-то не работает, то проверяем выхлоп команд

ldd /usr/lib/php/20151012/php_sqlsrv_7_nts.so
ldd /opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.4.0

на предмет нехватающих библиотек.

Эх, чего только не сделаешь для этих беспомощных программистов... (шутка)

Tags: debian, it, linux, администрирование, работа
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 7 comments