当无法访问服务器时,PHP的PDO忽略了MySQL的ATTR_TIMEOUT选项

tim*_*fly 19 php mysql connection pdo

我正在测试无法通过随机IP尝试连接来访问mysql服务器的场景.我将PDO的选项设置为在使用一秒后超时PDO::ATTR_TIMEOUT => 1.但是,抛出异常仍需要30秒.我猜这个超时只适用于实际的mysql连接时间,而不适用于运行mysql的服务器.

我需要更改什么PHP选项来超时连接到mysql服务器?

Rob*_*bie 11

刚刚放

ini_set("default_socket_timeout", 2);
Run Code Online (Sandbox Code Playgroud)

在您的PDO()连接字符串之前.

(在Windows上测试,在Linux上也应该没问题.)


为什么?

通过手册追逐这个:

mysqlnd驱动程序使用套接字进行底层连接,并设置超时使用套接字(流)超时函数.(参考:http://php.net/manual/en/mysqlnd.notes.php)

使用mysqlnd意味着使用PHP流进行底层连接.对于mysqlnd,应该在超时设置等详细信息上查询PHP流文档(Streams),而不是MySQL Client Library的文档.


如果你想要更多的控制,那么你可能能够更具体地控制实际的套接字:我没有测试过它,因为它只是unix.要设置mysqlnd使用的套接字,可以使用ini设置指定套接字(参考:http://php.net/manual/en/ref.pdo-mysql.connection.php )

如果针对mysqlnd编译PDO_MYSQL,则可以通过pdo_mysql.default_socket设置设置默认套接字.

有关该设置,请参见http://php.net/manual/en/ref.pdo-mysql.php#ini.pdo-mysql.default-socket

您可以使用http://php.net/manual/en/function.stream-set-timeout.php设置超时.

但是可能更容易设置默认值,然后在完成后重置...


Akr*_*res 5

php.ini你可以更新这个配置变量:

mysql.connect_timeout = 1
Run Code Online (Sandbox Code Playgroud)