MSSQL из PHP: пакеты, FreeTDS, ODBC и быстрая диагностика
Цель и оговорки
Нужен рабочий доступ к Microsoft SQL Server из PHP на Linux: либо унаследованный стек с расширением Sybase/FreeTDS, либо универсальный путь через ODBC. Ниже — практическая последовательность проверок; для новых проектов чаще смотрят на официальные драйверы Microsoft (sqlsrv/pdo_sqlsrv) под поддерживаемую версию PHP, но схема «FreeTDS + ODBC» по-прежнему встречается на старых серверах и в Docker-образах без проприетарных пакетов.
Вариант через пакетный менеджер (Debian/Ubuntu)
Типовой набор для классического контура FreeTDS + ODBC (имена пакетов подбирайте под свою ветку PHP):
sudo apt-get update
sudo apt-get install -y freetds-bin tdsodbc unixodbc unixodbc-dev
# расширение под вашу версию PHP, например:
# sudo apt-get install -y php-sybase php-odbcПосле установки убедитесь, что нужные функции видны интерпретатору:
php -r 'var_dump(function_exists("mssql_connect"));'
php -r 'var_dump(function_exists("odbc_connect"));'На современных дистрибутивах устаревший mssql_* может отсутствовать — тогда опирайтесь на ODBC или на драйверы Microsoft.
RHEL-подобные системы
Исторически в репозиториях встречался пакет вроде php-mssql; сейчас чаще подключают ремии PHP и ставят ODBC/FreeTDS отдельно. Проверка та же:
php -r 'var_dump(function_exists("odbc_connect"));'Обход без пересборки PHP: ODBC
Шаг 1. Убедитесь, что модуль ODBC загружен (см. выше).
Шаг 2. Установите и настройте FreeTDS как клиентский слой для TDS. Соответствие версии протокола TDS и выпуску SQL Server смотрите в актуальной таблице FreeTDS — для многих сцен достаточно tds version = 7.0 или выше для новых серверов.
Фрагмент /etc/freetds/freetds.conf (или путь после ручной установки в префикс):
[my_mssql]
host = 10.0.0.17
port = 1433
tds version = 7.4Имя секции затем используется как DSN-алиас или передаётся в tsql.
Проверка сети и авторизации через tsql
Перед тем как ковырять PHP, добейтесь успешного логина с хоста приложения:
tsql -S my_mssql -U "$SQLUSER"Приглашение вида 1> означает, что соединение и логин прошли. Если обрывается раньше, проверьте доступность порта:
nc -vz 10.0.0.17 1433и правила файрвола на стороне SQL Server и по пути маршрутизации.
Регистрация DSN в unixODBC
Добавьте источник в /etc/odbc.ini (пример):
[MSSQL_MYAPP]
Driver = FreeTDS
Servername = my_mssql
Database = MyDatabaseИ убедитесь, что в odbcinst.ini прописан путь к драйверу FreeTDS. Тест из shell:
isql -v MSSQL_MYAPP "$SQLUSER" "$SQLPASS"Минимальная проверка из PHP
Когда isql работает, тот же DSN можно открыть из PHP:
<?php
$conn = odbc_connect('MSSQL_MYAPP', 'user', 'password');
if (!$conn) {
exit('odbc_connect failed');
}
$res = odbc_exec($conn, 'SELECT @@VERSION AS v');
if ($res) {
var_dump(odbc_fetch_array($res));
}
odbc_close($conn);Логины и пароли не храните в репозитории; для продакшена — переменные окружения или секрет-хранилище.
Итог
Для инфраструктуры с 1С‑Битрикс на Linux и отдельным MSSQL полезна дисциплина: сначала tsql/isql, затем PHP. Это отделяет сетевые и учётные проблемы от ошибок в коде приложения и ускоряет раскатку на новый сервер или контейнер.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии