在PLESK CentOS7上PHP7.2+sqlsrv连接SQL Server报错求助
问题背景
在Plesk CentOS7环境中,使用PHP7.2的sqlsrv/pdo_sqlsrv扩展连接SQL Server时,始终报错提示缺少Microsoft ODBC Driver,但实际上已完成以下配置:
- 安装了msodbcsql包
- 安装了unixODBC-devel、make、gcc-c++等依赖
- 通过
/opt/plesk/php/7.2/bin/php -m | grep sqlsrv确认pdo_sqlsrv和sqlsrv模块已加载 - 重新读取PHP handlers及组件属性,模块在Plesk GUI中可见
- 重启了PHP-FPM主进程
- 确认unixODBC版本为2.3.11
- 在
/opt/plesk/php/7.2/etc/php.d路径配置了odbc.ini
报错信息:
string(237) "SQLSTATE[IMSSP]: This extension requires the Microsoft ODBC Driver for SQL Server to communicate with SQL Server. Access the following URL to download the ODBC Driver for SQL Server for x64: https://go.microsoft.com/fwlink/?LinkId=163712"
连接代码:
$params = [ "UID" => $username, "PWD" => $password, "Database" => $database, "TrustServerCertificate" => true ]; if(sqlsrv_connect($host, $params)) { echo "connected.."; } else { echo "Connection could not be established. DO not know why..sick!<br />"; echo "<pre>"; die( print_r( sqlsrv_errors(), true)); echo "</pre>"; }
同一服务器上的PHP8.0环境(不同站点)运行该代码可正常连接,已排除SQL Server远程访问问题,确认问题出在本地服务器配置。
排查与解决步骤
1. 验证ODBC驱动与PHP7.2的兼容性
sqlsrv扩展对ODBC驱动版本有严格匹配要求,PHP7.2需搭配特定版本的ODBC驱动(Driver 17适配性最佳,Driver 18可能与旧版PHP存在兼容问题)。执行以下命令查看已安装的msodbcsql版本:
rpm -qa | grep msodbcsql
若版本不匹配,卸载现有包后安装适配版本:
yum remove msodbcsql curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssql-release.repo ACCEPT_EULA=Y yum install msodbcsql17
2. 配置PHP7.2-FPM的环境变量
Plesk的PHP隔离环境可能未正确加载ODBC驱动的环境变量,需手动指定:
- 编辑PHP7.2的FPM配置文件(路径通常为
/opt/plesk/php/7.2/etc/php-fpm.d/www.conf,或对应站点的独立配置文件) - 在文件末尾添加:
env[ODBCSYSINI] = /opt/plesk/php/7.2/etc/php.d env[LD_LIBRARY_PATH] = /opt/microsoft/msodbcsql17/lib64:$LD_LIBRARY_PATH
- 重启PHP7.2-FPM进程:
systemctl restart plesk-php72-fpm
3. 跳过PHP直接测试ODBC连接
使用isql命令验证ODBC驱动本身是否可正常工作,排除PHP层面的问题:
isql -v <你的ODBC数据源名称> <SQL用户名> <SQL密码>
若isql也无法连接,检查odbc.ini中的驱动路径是否正确:
[ODBC Driver 17 for SQL Server] Description=Microsoft ODBC Driver 17 for SQL Server Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.10.so.2.1 UsageCount=1
可通过find /opt/microsoft -name libmsodbcsql*.so命令确认实际驱动文件路径,同步修改odbc.ini。
4. 重新编译适配的sqlsrv扩展
若使用预编译的扩展包存在兼容性问题,手动编译适配当前环境的版本:
- 下载对应PHP7.2的sqlsrv源码:
cd /tmp git clone https://github.com/microsoft/msphpsql.git cd msphpsql git checkout v5.9.0 # PHP7.2对应的稳定版本 cd source/sqlsrv
- 用PHP7.2的phpize编译:
/opt/plesk/php/7.2/bin/phpize ./configure --with-php-config=/opt/plesk/php/7.2/bin/php-config make && make install
- 同样编译pdo_sqlsrv:
cd ../pdo_sqlsrv /opt/plesk/php/7.2/bin/phpize ./configure --with-php-config=/opt/plesk/php/7.2/bin/php-config make && make install
- 重新启用模块并重启PHP-FPM。
5. 检查Plesk站点的PHP隔离配置
进入Plesk面板对应站点的「PHP设置」,确认:
- 站点确实使用PHP7.2版本
- 没有自定义php.ini覆盖ODBC相关环境变量配置
内容的提问来源于stack exchange,提问作者ButcherFromHell

