如何防止PHP脚本因超长的mysql查询而超时

时间:2008-12-13 17:52:28

标签: php mysql timeout

我有一个由超时的cron任务运行的更新查询。在navicat中执行时,查询平均需要五分钟才能执行。

代码看起来大致如此。这很简单:

// $db is a mysqli link
set_time_limit (0); // should keep the script from timing out
$query = "SLOW QUERY";
$result = $db->query($query);
if (!$result)
    echo "error";

即使脚本不应该超时,等待sql调用所花费的时间似乎仍然会超时。

是否可以使用异步调用?或者调整超时?

超时是否不同,因为它是从命令行而不是通过Apache调用的?

由于

6 个答案:

答案 0 :(得分:34)

我在某个地方遇到了同样的问题,并使用以下代码(我的文件的前两行)“解决”了它:

set_time_limit(0);
ignore_user_abort(1);

答案 1 :(得分:4)

根据manual

  

注意:set_time_limit()函数和配置指令max_execution_time仅影响脚本本身的执行时间。在确定脚本运行的最长时间时,不会包括在执行脚本之外发生的任何活动,例如使用system()的系统调用,流操作,数据库查询等。

所以它不太可能与PHP的时间限制有任何关系。超时时你得到什么信息?也许涉及MySQL设置。

答案 2 :(得分:2)

你的php是否在安全模式下运行?引自PHP manual of set_time_limit

  

这个函数在PHP时没有效果   正在安全模式下运行。没有   除了关闭安全之外的解决方法   模式或更改时间限制   php.ini中。

答案 3 :(得分:0)

假设您使用的是Linux,基于Debian的系统具有针对mod_php / php cgi和php-cli的单独配置。这不应该太难以在不分离cgi / cli配置的不同Linux系统上进行设置。

一旦你有单独的配置,我会调整你的PHP cli配置。禁用安全模式以及任何时间限制和限制。

答案 4 :(得分:0)

查看php,ini中的一些资源限制变量: max_execution_time,max_input_time,memory_limit

您还可以在PHP中设置脚本的时间限制: http://ca3.php.net/set_time_limit

答案 5 :(得分:0)

我在我的一个 PHP 脚本中遇到了类似的问题,我在执行慢查询之前添加了这个内联:

$timeout_seconds = 3153600; // 1 year... 

// Make sure the PHP script doesn't time out
set_time_limit(0);
ignore_user_abort(1);

// Make sure the PHP socket doesn't time out
ini_set('default_socket_timeout', $timeout_seconds);
ini_set('mysqlnd.net_read_timeout', $timeout_seconds);

// Make sure the MySQL server doesn't time out
// Assuming your $link is a MySQLi object:
$link->query("SET SESSION connect_timeout=" . $timeout_seconds);
$link->query("SET SESSION delayed_insert_timeout=" . $timeout_seconds);
$link->query("SET SESSION have_statement_timeout='NO'");
$link->query("SET SESSION net_read_timeout=" . $timeout_seconds);
$link->query("SET SESSION net_write_timeout=" . $timeout_seconds);

显然,您需要适当地设置秒数,但我根本不希望我的脚本超时。

PHP 初始化指令:https://www.php.net/manual/en/ini.list.php

MySQL 服务器变量:https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html

注意:查看文档以获取更多信息,并验证变量是否与您使用的 PHP 和 MySQL 版本匹配。我使用的是 PHP 7.3 和 MySQL 5.7。

** 编辑:为我的脚本设置 PHP 超时是不够的,我还必须添加 MySQL SESSION 变量。