Yandex Metrika
sanches.free

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 дней гарантии