【问题标题】:How to keep a php script from timing out because of a long mysql query由于长时间的mysql查询,如何防止php脚本超时
【发布时间】:2010-09-26 19:13:57
【问题描述】:

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

代码大致如下所示。很简单:

// $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 调用的?

谢谢

【问题讨论】:

  • 您是否收到“错误”输出?如果是这样,则导致问题的是 MySQL 而不是 PHP。

标签: php mysql timeout


【解决方案1】:

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

set_time_limit(0);
ignore_user_abort(1);

【讨论】:

  • 2008 年回答。2013 年仍然帮助我。非常感谢先生。
  • 很高兴找到这个答案! ^ 快 2014 年了,它仍然有帮助!
  • 2016 年 8 月也适合我!
【解决方案2】:

根据manual

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

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

【讨论】:

  • 补充您所说的内容:它修复了这些其他问题,因为脚本恰好在查询完成之前超时。所以,这就是为什么这个解决方案有效,但它实际上不是一个正确的解决方案。
  • 您遗漏了“注意”的这一重要部分:在测量时间是真实的 Windows 上,这不是真的。
【解决方案3】:

您的 php 是否在安全模式下运行?引用PHP manual of set_time_limit:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 虽然这有助于 PHP 不超时,但与 MySql 没有任何关系。
      【解决方案6】:

      我在我的一个 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 变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-23
        • 2015-03-10
        • 2014-07-02
        • 1970-01-01
        相关资源
        最近更新 更多