为什么mysqli_connect不尊重MYSQLI_OPT_CONNECT_TIMEOUT?



下面的代码将100%停留在real_connect()上。set_time_limitdefault_socket_timeout以及MYSQLI_OPT_CONNECT_TIMEOUT已经被设置,但是不工作。

我在PHP 5.6和PHP 7.1上进行了测试。mysql驱动程序是mysqlnd。

set_time_limit(30);
ini_set('default_socket_timeout', 10);
$mysql = new mysqli();
$mysql->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);
$mysql->real_connect('www.baidu.com', 'root', 'xxx', 'xxx', 80);

问题:

  1. 使用主机地址www.baidu.com和端口号80时,为什么PHP进程卡在real_connect
  2. 为什么MYSQLI_OPT_CONNECT_TIMEOUT和其他超时设置不起作用
  3. 对于这种特殊情况,有没有办法设置一个可以工作的超时

我找到了原因。在我的情况下,超时是读取超时,而不是连接超时。因此MYSQLI_OPT_CONNECT_TIMEOUT不起作用。解决方案是在php.ini文件中设置mysqlnd.net_read_timeout。参数值以秒为单位。例如:mysqlnd.net_read_timeout = 3

有两种超时设置。一个是MYSQLI_OPT_CONNECT_TIMEOUT,另一个则是MYSQLI_OPT_READ_TIMEOUT。第二个选项的文档很差,但可以通过两种方式设置此选项。

使用mysqli::set_opt:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli();
$mysqli->set_opt(MYSQLI_OPT_READ_TIMEOUT, 3); // 3 seconds
$mysqli->connect('example.com', 'user', 'pass', 'db');
$mysqli->set_charset('utf8mb4'); // always set the charset

或者使用INI确认设置。在php.ini文件中设置:

mysqlnd.net_read_timeout =  3

如果没有通过mysqli::set_opt提供ini设置,则ini设置只是MYSQLI_OPT_READ_TIMEOUT的默认值,因此无论您选择哪种方式都可以。

相关内容

  • 没有找到相关文章

最新更新