情况如下:
服务器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的指示。 在这种情况下,您可以尝试增加连接超时作为短期修复,并长期解决拥塞问题。