为什么 mysqli_connect 不尊重 MYSQLI_OPT_CONNECT_TIMEOUT?
Why mysqli_connect doesn't respect MYSQLI_OPT_CONNECT_TIMEOUT?
下面的代码将卡在 real_connect()
100%。 set_time_limit
和 default_socket_timeout
和 MYSQLI_OPT_CONNECT_TIMEOUT
已经设置,但没有工作。
我在 PHP 5.6 和 PHP 7.1 上进行了测试。 mysql driver 是 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);
问题:
- 当使用主机地址
www.baidu.com
和端口号 80
时,为什么 PHP 进程卡在 real_connect
上?
- 为什么
MYSQLI_OPT_CONNECT_TIMEOUT
和其他超时设置不起作用?
- 对于这种特殊情况,有什么方法可以设置超时吗?
找到原因了。在我的例子中,超时是读取超时,而不是连接超时。因此 MYSQLI_OPT_CONNECT_TIMEOUT
不起作用。解决方法是在php.ini
文件中设置mysqlnd.net_read_timeout
。参数值在seconds.Such中为:
mysqlnd.net_read_timeout = 3
有两种超时设置。一个是MYSQLI_OPT_CONNECT_TIMEOUT
and the other one is 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 设置只是 MYSQLI_OPT_READ_TIMEOUT
的默认值,因此无论您选择哪种方式都可以。
下面的代码将卡在 real_connect()
100%。 set_time_limit
和 default_socket_timeout
和 MYSQLI_OPT_CONNECT_TIMEOUT
已经设置,但没有工作。
我在 PHP 5.6 和 PHP 7.1 上进行了测试。 mysql driver 是 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);
问题:
- 当使用主机地址
www.baidu.com
和端口号80
时,为什么 PHP 进程卡在real_connect
上? - 为什么
MYSQLI_OPT_CONNECT_TIMEOUT
和其他超时设置不起作用? - 对于这种特殊情况,有什么方法可以设置超时吗?
找到原因了。在我的例子中,超时是读取超时,而不是连接超时。因此 MYSQLI_OPT_CONNECT_TIMEOUT
不起作用。解决方法是在php.ini
文件中设置mysqlnd.net_read_timeout
。参数值在seconds.Such中为:
mysqlnd.net_read_timeout = 3
有两种超时设置。一个是MYSQLI_OPT_CONNECT_TIMEOUT
and the other one is 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 设置只是 MYSQLI_OPT_READ_TIMEOUT
的默认值,因此无论您选择哪种方式都可以。