Ubuntu 环境下基于PHP语言启用SQLSRV 进行跨数据库操作

在日常工作中,涉及 Linux 环境下跨平台数据交互,特别是 PHP + SQL Server 的场景。

注意:在 Linux 中,SQLSRV 并不是直接“裸连” SQL Server,而是基于 ODBC 驱动再封装。

驱动链路如下:

PHP (sqlsrv 扩展 / pdo_sqlsrv 扩展)
        ↓
SQLSRV 驱动 (Microsoft Drivers for PHP for SQL Server)
        ↓
ODBC 驱动 (Microsoft ODBC Driver for SQL Server)
        ↓
SQL Server 数据库

1. 安装 ODBC 驱动和工具

确认系统版本(支持 16.04 / 18.04 / 20.04 / 22.04):

if ! [[ "16.04 18.04 20.04 22.04" == *"$(lsb_release -rs)"* ]]; then
    echo "Ubuntu $(lsb_release -rs) is not currently supported.";
    exit;
fi

添加微软源并安装:

curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc

curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list

sudo apt-get update

# 安装 ODBC 驱动
sudo ACCEPT_EULA=Y apt-get install -y msodbcsql17

# 可选:安装命令行工具 bcp 和 sqlcmd
sudo ACCEPT_EULA=Y apt-get install -y mssql-tools
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc

# 可选:安装 unixODBC 开发头文件
sudo apt-get install -y unixodbc-dev

2. 配置 ODBC

配置文件位置可能因系统不同而异,通常涉及:

  • /etc/odbcinst.ini → 驱动安装信息
  • /etc/odbc.ini → DSN 配置

/etc/odbc.ini 示例:

[SQLSRV]
Driver = /opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.6.so.1.1
Description = SQLSRV ODBC Driver DSN
Server = 192.168.1.100,1433   # 注意IP与端口之间用逗号
Port = 1433

测试连接:

isql -v SQLSRV 用户名 密码

3. 启用 PHP SQLSRV 扩展

下载 PHP 扩展(根据 PHP 版本选择合适的 release):

👉 msphpsql releases

确认扩展目录:

php -i | grep extension_dir

移动下载的 sqlsrv.sopdo_sqlsrv.so 到该目录,并在 php.ini 中启用:

extension=sqlsrv.so
extension=pdo_sqlsrv.so

4. 重启 PHP 服务

sudo systemctl restart php7.4-fpm   # 按实际版本替换

5. 常见问题

错误 08001 (SSL/TLS 相关问题)

修改 /etc/ssl/openssl.cnf

在文件首行添加:

openssl_conf = default_conf

[system_default_sect] 下调整:

# 可能默认是:
CipherString = DEFAULT:@SECLEVEL=2

# 修改为:
CipherString = DEFAULT:@SECLEVEL=0

🔑 总结

  • ODBC 驱动:底层与 SQL Server 通信,必须先安装。
  • SQLSRV 扩展:PHP 层接口,依赖 ODBC 驱动。
  • Linux 下必须同时存在 才能正常使用 PHP 操作 SQL Server。