PHP连接Microsoft SQL Server遇HYT00登录超时错误求助
先看你的PHP代码里一个极易忽略的核心问题:PDO连接字符串用了单引号,导致变量无法被解析。PHP中,单引号包裹的字符串不会自动替换变量值,所以你的连接字符串实际是sqlsrv:Server=$server,1433; Database=$db,而非String.php里定义的真实服务器地址和数据库名。这大概率是连接失败的首要原因。
第一步:修复连接字符串的变量解析问题
把单引号改成双引号,或者用字符串拼接(更直观):
// 方法1:改用双引号(支持变量解析) $this->db = new PDO("sqlsrv:Server=$server,1433; Database=$db", $user, $pass); // 方法2:字符串拼接(避免引号歧义) $this->db = new PDO('sqlsrv:Server=' . $server . ',1433; Database=' . $db, $user, $pass);
修复后先测试,如果仍超时,继续排查以下网络和配置问题。
第二步:检查Linux服务器到SQL Server的网络连通性
本地能正常连接说明数据库本身无问题,但Linux服务器的出站流量可能被拦截,或者Gearhost的SQL Server防火墙未允许你的服务器IP访问。
测试端口连通性
在Linux服务器上用telnet或nc(netcat)测试1433端口是否可达:
# 使用telnet telnet your-sql-server-host 1433 # 或使用nc(若已安装) nc -zv your-sql-server-host 1433
如果连接失败(如Connection refused或超时),说明:
- 你的Linux服务器防火墙(如iptables、ufw)禁止了出站1433端口,需添加规则允许;
- Gearhost的SQL Server防火墙未将你的Linux服务器IP加入白名单,需登录控制台添加允许的IP地址。
第三步:验证驱动与PHP版本的兼容性
你使用的是PHP7.0.30,需确保安装的ODBC Driver 17 for SQL Server、pdo_sqlsrv、sqlsrv驱动版本兼容。PHP7.0对应的sqlsrv驱动版本应为4.0.x至5.3.x(官方兼容矩阵)。
可通过以下方式查看已安装的驱动版本:
// 在PHP脚本中执行 print_r(PDO::getAvailableDrivers()); phpinfo();
查看输出中pdo_sqlsrv和sqlsrv的版本,确认与PHP7.0匹配。若版本不兼容,需卸载现有驱动,安装对应PHP7.0的适配版本。
第四步:尝试调整连接超时参数
网络延迟可能导致超时,可在连接字符串中增加超时参数:
$this->db = new PDO("sqlsrv:Server=$server,1433; Database=$db; ConnectionTimeout=30; LoginTimeout=30", $user, $pass);
延长超时时间后再次测试连接。
建议先从修复字符串变量解析问题入手,这是最快速见效的排查点。若修复后仍无法连接,再逐一验证网络和驱动兼容性问题。
内容的提问来源于stack exchange,提问作者Michele La Ferla

