云服务器迁移至本地后,无法通过PHP+ODBC连接SQL Server
解决Ubuntu Apache环境下ODBC Driver 17连接SQL Server的08001错误
关键线索:OpenSSL版本不兼容
你遇到的偶尔出现的SSL Provider: OpenSSL library could not be loaded错误是核心原因——ODBC Driver 17 for SQL Server仅支持OpenSSL 1.0或1.1版本,而Ubuntu新版本默认搭载的OpenSSL 3.x会导致驱动无法加载,进而触发SQL state 08001连接失败。
修复步骤
1. 安装并锁定兼容的OpenSSL版本
# 安装OpenSSL 1.1 sudo apt-get install -y openssl=1.1.1* libssl1.1 # 锁定版本防止自动升级 sudo apt-mark hold openssl libssl1.1
2. 修复ODBC驱动的库依赖链接
检查驱动是否能找到OpenSSL库:
ldd /opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.8.so.1.1 | grep ssl
如果输出显示not found,创建软链接:
sudo ln -s /usr/lib/x86_64-linux-gnu/libssl.so.1.1 /usr/lib/libssl.so.1.1 sudo ln -s /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 /usr/lib/libcrypto.so.1.1
3. 调整ODBC连接字符串
在你的PHP连接代码中添加明确的SSL参数,避免自动协商失败:
$conn = odbc_connect( "Driver={ODBC Driver 17 for SQL Server};Server=$serverName,1433;Database=$dbName;Uid={$connectionOptions['Uid']};PWD={$connectionOptions['PWD']};Encrypt=yes;TrustServerCertificate=no;", '', '' );
临时测试可将TrustServerCertificate设为yes,但生产环境需配置合法证书
4. 确保Apache进程能访问依赖库
- 验证Apache用户(www-data)的访问权限:
sudo -u www-data ls /usr/lib/x86_64-linux-gnu/libssl.so.1.1 - 在
/etc/apache2/envvars中添加库路径:export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH - 重启Apache生效:
sudo systemctl restart apache2
5. 用isql工具排除代码问题
直接用ODBC命令行工具测试连接,确认驱动和网络正常:
isql -v "Driver={ODBC Driver 17 for SQL Server};Server=你的数据库IP,1433;Database=你的库名;Uid=你的账号;PWD=你的密码"
如果isql能连接,说明问题出在PHP/Apache的环境配置;如果失败,继续排查防火墙或SQL Server的远程连接设置。
内容的提问来源于stack exchange,提问作者Sam Walker
相关产品推荐
相关产品推荐

