Microsoft SQL Server on MAC (mssql on mac)

Расширение MSSQL для MAMP на MAC OSX

У меня возникла необходимость пообщаться из PHP с базой данных Microsoft SQL, как оказалось на Маке это не так то и просто сделать. Готового расширения вы не найдете. Создадим заметку как же это сделать:

Стоит отметить, что чтобы все прошло гладко, у нас должен быть установлен autoconf, его можно установить командой

brew install autoconf

Если у вас не установлен brew, то поищите как это можно сделать, труда особого не составит.

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

xcode-select —install 

если не выполняли ее ранее.

Нам понадобится Утилита FreeTDS

Скачиваем ее, распаковываем, переходим в итоговую папку с помощью команды cd и выполняем следующее

$ sudo ./configure —prefix=/private/etc/freetds —with-tdsver=8.0 —sysconfdir=/private/etc/freetds/conf
$ sudo make
$ sudo make install 

Далее нам нужно узнать какая версия PHP используется, в MAMP это можно увидеть на вкладке PHP (Default Version)

Просмотр версии PHP в MAMP PRO
Просмотр версии PHP в MAMP PRO

После чего скачиваем исходники PHP конкретно вашей версии с сайта php — http://php.net/releases/

Внимательно ищите свою версию, они там расположены не по порядку!

Извлекаем архив, переходим в итоговую папку и выполняем

$ ./configure —with-php-config=/usr/bin/php-config
$ make
Теперь переходим в папку mssql исходников и создадим расширение
$ cd ext/mssql/
$ /usr/bin/phpize
$ ./configure —with-php-config=/usr/bin/php-config —with-mssql=/private/etc/freetds
$ make
Модуль будет доступен в папке модулей
$ cd modules/
Теперь нам нужно переместить созданный модуль в удобную папку и подключить его в ini файле, его можно найти по адресу Applications/MAMP/bin/php/php<версия вашего php>/conf/php.ini
Открываем и смотрим параметр extension_dir, например extension_dir = «/Applications/MAMP/bin/php/php5.6.2/lib/php/extensions/no-debug-non-zts-20121212/»
Именно в эту папку нам нужно скопировать полученное расширение. Копируем его!
$ cp mssql.so /Applications/MAMP/bin/php/php5.6.2/lib/php/extensions/no-debug-non-zts-20121212/ (не забывайте, что адрес должен быть ваш, а не тот что у меня в примере)
Ну и осталось в ini файле прописать расширение, для чего находим в нем строку ; Extensions и видим, что под ней перечисленны расширения, добавляем
extension=mssql.so
Перезапускаем php и на всякий случай смотрим log файл на предмет ошибок, если их нет, то смотрим phpinfo() и убеждаемся, что там есть модуль mssql.
Внимание! Скорее всего MAMP использует другой файл ini в своей директории, чтобы его найти в проводнике заходим в папку программ (/Applications/) находим MAMP или MAMP PRO в зависимости от того, что вы используете, открываем, нажимаем на иконку приложения правой кнопкой и выбираем «Показать содержимое пакета», там переходим в папку Contents/Resources, находим ini файл вашей версии php и именно туда вставляем строку extension=mssql.so, как было описано выше. Не забудте перезагрузить PHP!
И еще одно замечание. У меня например не получалось запустить модуль из под php 5.6.2 в консоли появлялась ошибка
PHP Warning: PHP Startup: mssql: Unable to initialize module
Module compiled with module API=20121212
PHP compiled with module API=20131226
These options need to match
in Unknown on line 0
Так вот, как я понял это связано с версией phpize, она у меня просто была не обновлена и не обеспечивала новый API. Я, кстати, просто проделал все то же самое с версией на одну назад — 5.5.18 и все заработало!
И еще одна интересная ошибка. При попытке соединения с работающим модулем выдается ошибка
Warning: mssql_connect(): Unable to connect to server
Здесь, как оказалось, дело во freetds. Конечно если вы проверили, что сервер слушает, порт открыт и база настроена на прием внешних соединений, если вы соединяетесь извне.

Если все работает и открыто, то смотрим в сторону freetds, находим на компьютере freetds.conf, у меня он находился в папке

/Applications/XAMPP/xamppfiles/etc, и откроем его для редактирования.

Можно раскомментировать строки

dump file = /tmp/freetds.log
debug flags = 0xffff

чтобы включить ведение лога.

Но главное внимание стоит обратить на

tds version = 4.2

Эта версия должна быть совместима с вашей базой, в моем случае заработала версия 7.0 (строку нужно раскомментировать).

И существует еще одна возможность — настроить alias, как они настраиваются показано в самом файле, но для примера

[my_mssql_server]
host = 127.0.0.1
port = 1433
tds version = 7.0
client charset = UTF-8

Теперь в функцию mssql_connect в первом параметре вы можете передать ‘my_mssql_server’ и подключение будет произведено с соотвествующими настройками из freetds.conf .

Иногда для подключения берется неправильный файл freetds.conf, чтобы заставить php кушать именно то, что нужно добавляем переменные в коде до вызова mssql_connect

putenv('FREETDSCONF=/Applications/XAMPP/xamppfiles/etc/freetds.conf';
putenv('FREETDS=/Applications/XAMPP/xamppfiles/etc/freetds.conf');
Теперь уже все должно заработать. Если и опять нет, то Google вам в помощь :)
Надеюсь эта информация кому-нибудь поможет.
Конектитесь к MSSQL! Используйте MAC! =)