我有一个由超时的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调用的?
由于
答案 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 变量。