在 MySQL 和 PHP 中捕获并处理超时错误

内德·赫尔顿

寻找并处理 MySQL 超时错误。现有代码:

$conn = mysqli_connect("localhost", "user", "pass", "db");

$conn->query('SET SESSION MAX_EXECUTION_TIME = 10'); // time in milliseconds

$sql = "SELECT COUNT(1) FROM table WHERE..."

$results = $conn->query($sql);

像下面这样的东西?

if ($results == false){    
if ($conn->errno == 3024){        
echo "too slow";    
}else{
echo "unkown error";
}else{ \\carry on trucking

如何$conn->query($sql);在 IF 语句中包装并仍然访问$results变量?

比尔·卡尔文

根据https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html#optimizer-hints-execution-time,最大执行时间以毫秒为单位,而不是秒。

如果查询超时,则返回错误:

mysql> select /*+ MAX_EXECUTION_TIME(1000) */ * from bugs where sleep(1)=0;
ERROR 3024 (HY000): Query execution was interrupted, maximum statement execution time exceeded

你必须检查mysqli抛出的异常,然后检查$e->getCode()它是什么错误。那应该是3024。


回复您的评论:

这是我必须使用 PHP 8.1.6 进行的测试。

<?php

$conn = mysqli_connect("localhost", "root", "...", "test2");

请注意,参数的顺序与您的示例显示的不同。请参阅文档。

$conn->query('SET SESSION MAX_EXECUTION_TIME = 1000'); // time in milliseconds

try {
    $results = $conn->query("SELECT COUNT(1) FROM dual WHERE SLEEP(2) = 0");
    print_r($results->fetch_all());
} catch (mysqli_sql_exception $e) {
    if ($e->getCode() == 3024) {
        echo "query timed out"; // here is your handling code
    } else {
        throw $e; // Other error
    }
}

输出:

查询超时

请注意,由于 PHP 8.1 mysqli 默认抛出异常,这使您的代码清晰一致。如果您的 PHP 版本较低,则必须显式添加错误模式:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = mysqli_connect("localhost", "user", "pass", "db");
...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章