0

我有一个非常小的服务器(内存不到 1GB),我在上面运行 MySQL 和 apache。存在一个运行 MySQl 查询并显示数据的 php 脚本。我修改了查询,使返回的结果为数百万行。虽然查询本身并不复杂,但鉴于我的服务器资源有限,MySQL 需要很长时间才能将数据传递回 PHP。

尽管在 php.ini 中设置为max_execution_time并在my.cnf中同时设置了 和,但服务器仍然允许脚本卡住几分钟。当我在 MySQL 上运行时,我看到查询处于“发送数据”阶段。30wait_timeoutinteractive_time30show full processlist

我的问题:如何限制“发送数据”阶段的持续时间?

4

1 回答 1

1

您可以使用MySQL 5.7+PDO::MYSQL_ATTR_INIT_COMMAND和PDO 执行此操作MAX_EXECUTION_TIME

工作示例

$pdo = new \PDO('mysql:the_rest_of_dns;', 'usrname', 'passwd', [
    // Set time in miliseconds
    \PDO::MYSQL_ATTR_INIT_COMMAND => 'SET SESSION MAX_EXECUTION_TIME=200;'
]);

$result = $pdo->query("SELECT * FROM answers");

/* 
 Catch mysql exception
*/
if(($error = $pdo->errorInfo())[0] !== "00000") {

    /*
     Query execution was interrupted, maximum statement execution time exceeded
     exception exception handler
     */
    if($error[1] === 3024) {
        // Die with default error message
        die($error[2]);
    }
}

// If everything working fine, get the result
print_r($result->fetchAll());

一个重要的注意事项

超时仅适用于只读 SELECT 查询。

如果您不想在所有查询上设置超时,您可以使用以下命令输入提示:

SELECT /*+ MAX_EXECUTION_TIME(1000) */ status, count(*) FROM articles GROUP BY status ORDER BY status;

第二个例子取自这里

于 2019-09-22T00:31:06.770 回答