有一个未记录的选项: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');
?>