有一个未记录的选项:MYSQLI_OPT_READ_TIMEOUT。理论上,这类似于MYSQLI_OPT_CONNECT_TIMEOUT,但应用略有不同。连接超时仅指定初始TCP连接的等待时间。一旦创建,超时就不再适用。但是,读取超时是从创建TCP连接到收到第一包实际数据的时间。在某些情况下,可以建立TCP连接,但MySQL服务器无限期地停滞,阻止执行返回PHP。指定读取超时可以缓解这种情况,而连接超时则不行。
如果未定义MYSQLI_OPT_READ_TIMEOUT常量,则仍然支持在没有此常量的版本中使用。您可以在旧版本的PHP中使用以下代码自行定义它。
<?php
if (!defined('MYSQLI_OPT_READ_TIMEOUT')) {
define ('MYSQLI_OPT_READ_TIMEOUT', 11);
}
?>
然后,您可以像使用连接超时一样使用读取超时。请注意,由于这两个值是针对整个连接过程的不同部分的两个不同的超时值,因此超时会累加(例如:10秒连接超时 + 10秒读取超时 = 最大可能的20秒超时)
<?php
// 创建对象
$connection = mysqli_init();
// 指定连接超时
$connection->options(MYSQLI_OPT_CONNECT_TIMEOUT, 10);
// 指定读取超时
$connection->options(MYSQLI_OPT_READ_TIMEOUT, 10);
// 使用先前指定的超时启动与服务器的连接
$connection->real_connect('server', 'user', 'pass', 'database');
?>