设置 MySQLi 查询执行超时

问题描述 投票:0回答:2

我正在探索在 PHP 和 MySQLi 中设置超时/停止特定查询的可能性。

稍微修改了来自 php.net 的示例:

if ($stmt = $mysqli->prepare("INSERT NESTED MYSQL QUERY HERE.")) {
    $stmt->bind_param("s", $city);
    $stmt->execute();
    $stmt->set_timeout("50000"); //hypothetical, will not work
    $stmt->bind_result($district);
    while($stmt->fetch()){ 
        //to do
    }
}
$mysqli->close();

这可能吗?

理想的实现:

  1. 在 PHP 代码内部而不是通过 MySQL 服务器的配置
  2. 只能针对选定的查询实现,而不是针对所有查询
  3. (至少)适用于 MySQL 5.6 及更高版本
  4. 可以通知最终用户,例如

这个过程比预期的要长。尝试将您的数据集拆分为 片段。

php mysql mysqli timeout
2个回答
0
投票
function querylimit($Link,$Query,$Limit){
    $Link->query($Query,MYSQLI_ASYNC);
    $retries = 0;
    do{
        $changed[] = $errored[] = $empty[] =$Link;
        $poll_result = mysqli_poll($changed,$errored,$empty,1);
        if($poll_result === false){
            return true;
        }
        if($poll_result > 0 && !empty($changed)){
            return true;
        }
        if($retries++ >= $Limit){
            $Link->kill($Link->thread_id);
            return false;
        }
    }while(true);
}

querylimit($mysqli,"select sleep(30)",5);

-1
投票

参考这个

http://mysqlserverteam.com/server-side-select-statement-timeouts/

对于只读 SELECT 语句

SELECT 
MAX_STATEMENT_TIME = 2000 --in milliseconds
* 
FROM table;
© www.soinside.com 2019 - 2024. All rights reserved.