Ubuntu18.04升级后PHP7.2.5连接MSSQL失败的解决方法
解决Ubuntu 18.04 LTS升级后PHP7.2连接MSSQL失效的问题
我之前在升级Ubuntu版本后也碰到过一模一样的sqlsrv连接故障,结合你的PHP7.2环境,分享几个靠谱的排查修复步骤:
1. 重新适配安装sqlsrv扩展
Ubuntu18.04自带的sqlsrv扩展版本可能和PHP7.2不匹配,建议手动安装微软官方适配的版本:
- 先导入微软的软件源密钥:
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - - 添加Ubuntu18.04对应的微软PHP源:
curl https://packages.microsoft.com/config/ubuntu/18.04/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list - 更新软件源并安装依赖:
sudo apt-get update sudo ACCEPT_EULA=Y apt-get install msodbcsql17 mssql-tools unixodbc-dev - 安装适配PHP7.2的sqlsrv和pdo_sqlsrv扩展:
sudo pecl install sqlsrv pdo_sqlsrv - 最后将扩展添加到PHP配置文件(注意区分CLI和Web环境的php.ini,比如Apache用
/etc/php/7.2/apache2/php.ini,CLI用/etc/php/7.2/cli/php.ini):echo "extension=pdo_sqlsrv.so" | sudo tee -a /etc/php/7.2/apache2/php.ini echo "extension=sqlsrv.so" | sudo tee -a /etc/php/7.2/apache2/php.ini - 重启Web服务(比如Apache):
sudo systemctl restart apache2
2. 验证ODBC驱动是否正确安装
sqlsrv依赖ODBC驱动,Ubuntu18.04需要用ODBC Driver 17 for SQL Server,执行以下命令检查:
odbcinst -j
输出里应该能看到ODBC Driver 17 for SQL Server的条目,如果没有,回到第一步重新安装msodbcsql17。
3. 排查网络和连接参数问题
- 先测试服务器连通性,用nc命令检查MSSQL默认端口1433是否开放:
nc -zv IP_OF_MY_SERVER 1433 - 简化你的测试代码,添加更直观的错误输出:
$serverName = "IP OF MY SERVER"; $connectionOptions = array( "Database" => "DB NAME", "Uid" => "USER", "PWD" => "PASSWORD" ); // 建立连接并直接输出错误 $conn = sqlsrv_connect($serverName, $connectionOptions); if( $conn === false ) { die( print_r( sqlsrv_errors(), true)); } // 执行测试查询 $tsql = "SELECT @@Version as SQL_VERSION"; $getResults = sqlsrv_query($conn, $tsql); if ($getResults == FALSE) { die(print_r(sqlsrv_errors(), true)); } // 输出查询结果 while($row = sqlsrv_fetch_array($getResults, SQLSRV_FETCH_ASSOC)) { echo $row['SQL_VERSION']; } sqlsrv_free_stmt($getResults); sqlsrv_close($conn);
4. 检查权限和环境变量
- 确保运行PHP的用户(比如Apache的
www-data)有读取ODBC配置文件的权限,执行:sudo chmod 644 /etc/odbcinst.ini /etc/odbc.ini - 如果遇到动态链接库找不到的错误,可以在Web服务配置里添加环境变量,比如在Apache的
/etc/apache2/envvars里添加:
添加后重启Apache生效。export LD_LIBRARY_PATH=/opt/mssql-tools/lib64/
按以上步骤操作后,大部分升级后的sqlsrv连接问题都能解决。
内容的提问来源于stack exchange,提问作者Diego de Lima
相关产品推荐
相关产品推荐

