php的pdo连接无法build立,但mysql命令行客户端可以

情况如下:

服务器a上运行的php脚本(nginx + php-fpm)应该通过pdo库访问服务器b上的mysql,但是获取SQLSTATE [HY000] [2003]无法连接到'xxx.xxx .xxx.xxx'(4)

服务器一个centos 6.5,php 5.3; 服务器b centos 6.2,mysql 5.1

然而,mysql命令行客户端 – 作为非特权用户运行 – 可以完美连接,重现性好,稳定。

一旦mysql命令行客户端build立了服务器之间的成功连接,php脚本也成功运行了大约5-7分钟,据推测,直到mysql命令行客户端连接超时。

我错过了什么?

这里是testing脚本:

<?php try { $dbh = new PDO('mysql:host=111.111.111.111;dbname=myname;port=3306', 'myuser', 'mypass'); echo 'Connected to database'; } catch(PDOException $e) { echo $e->getMessage(); } 

所以事实certificate,这毕竟是一个路由问题。

我们正在使用静态路由networking,并且mysql服务器a没有定义回服务器b的路由。

networking设置有点麻烦,因为物理连接如下所示:服务器b(异地)> vpn gw>互联网>检查点fw> openwrt路由器>服务器a

显然mysql命令行客户端更宽容,并能够build立连接,但pdo库不是。

在添加路由之后,pdo库可以自己成功build立连接,并且在此之后很高兴地运行。

所以,即使ping / telnet / mysql连接似乎正常工作,请检查您的路由。

顺便说一句,错误“中断的系统调用”覆盖这种情况?

 $ perror 4 OS error code 4: Interrupted system call 

当你收到这个特定的错误时,你应该再试一次。

这可能是一个重载服务器/networking的指示。 在这种情况下,您可以尝试增加连接超时作为短期修复,并长期解决拥塞问题。