14

我有一个由超时的 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 调用的?

谢谢

4

6 回答 6

36

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

set_time_limit(0);
ignore_user_abort(1);
于 2008-12-13T18:34:02.903 回答
4

根据手册

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

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

于 2008-12-13T18:39:37.463 回答
2

您的 php 是否在安全模式下运行?引用set_time_limit 的 PHP 手册

当 PHP 在安全模式下运行时,此功能无效。除了关闭安全模式或更改 php.ini 中的时间限制之外,没有其他解决方法。

于 2008-12-13T17:57:22.650 回答
0

假设您在 linux 上,基于 Debian 的系统对 mod_php/php cgi 和 php-cli 有单独的配置。在不分离 cgi/cli 配置的不同 linux 系统上进行设置应该不会太难。

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

于 2008-12-13T18:10:02.750 回答
0

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

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

于 2008-12-13T18:10:05.090 回答
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 变量。

于 2021-01-18T17:50:58.663 回答