Linux CentOS 7环境下PHP连接SQL Server的特殊配置问题咨询
解决方案
一、优先解决PDO_ODBC连接超时问题(无需额外安装扩展)
你CLI下isql/tsql可以正常连接,证明ODBC和FreeTDS配置本身没有问题,报错主要是PHP调用逻辑和权限限制导致:
- 连接串写法修正
你第一种连接串里Port:24115是语法错误,ODBC驱动单独配置端口需要用PORT=24115,更简单的方式是直接复用你已经配置好的ODBC DSN(就是你CLI调用的MSSQL名称),无需重复写驱动、IP、端口配置:
如果你不想用DSN要直接写全量配置,先执行$conn = new PDO("odbc:MSSQL", "username", "password");odbcinst -q -d确认你的驱动名称和连接串内完全一致,正确写法如下:$conn = new PDO("odbc:Driver={ODBC Driver 13 for SQL Server};SERVER=192.168.99.237,24115;DATABASE=dbname;", "username", "password"); - 排查SELinux权限限制
CentOS7默认开启SELinux,默认禁止httpd/PHP-FPM进程发起远程数据库连接,执行以下命令开放权限:# 允许HTTP进程连接数据库 setsebool -P httpd_can_network_connect_db 1 # PHP-FPM模式额外执行 setsebool -P httpd_can_network_connect 1
二、dblib驱动报错解决方法
报could not find driver是因为你没有安装pdo_dblib扩展,CentOS7下对应PHP7.3的安装命令如下:
# 你安装PHP7.3应该已经配置过remi源,直接执行安装即可 yum install php73-php-pdo-dblib # 安装完成后重启PHP-FPM/Apache systemctl restart php-fpm # 用Apache的话执行 systemctl restart httpd
安装完成后执行php -m | grep pdo_dblib确认扩展生效,就可以正常使用dblib连接串,直接写IP端口的写法如下:
$conn = new PDO("dblib:host=192.168.99.237:24115;dbname=dbname;charset=utf8", "username", "password");
三、额外排查验证
你可以先在CLI下执行PHP脚本测试连接,判断是否只有web请求时报错:
<?php // 新建test.php文件,命令行执行 php test.php 测试 try { $conn = new PDO("odbc:MSSQL", "username", "password"); echo "连接成功"; } catch (PDOException $e) { echo $e->getMessage(); } ?>
如果CLI执行PHP脚本可以正常连接、web请求报错,100%是SELinux或者PHP运行用户的权限问题。
内容的提问来源于stack exchange,提问作者moin
相关产品推荐
相关产品推荐

