【问题标题】:Is ini_set('max_execution_time', 0) a bad idea?ini_set('max_execution_time', 0) 是个坏主意吗?
【发布时间】:2011-05-17 10:28:13
【问题描述】:

是否有充分的理由不将 PHP 配置变量 max_execution_time 设置为 0?

一位同事最近签入了对添加的文件的更改:

ini_set('max_execution_time', 0);

对于在将输出返回给用户之前进行了一些复杂处理的页面来说,默认值太低了。

手册指出设置的主要目的是:

防止编写不佳的脚本占用服务器。

但还要继续说明:

您的 Web 服务器可以有其他超时配置,这些配置也可能会中断 PHP 执行。 Apache 有一个 Timeout 指令,而 IIS 有一个 CGI 超时功能。两者都默认为 300 秒。有关具体详细信息,请参阅您的 Web 服务器文档。

我们在 Apache 下运行,因此 Timeout 设置适用。是否有任何理由不将max_execution_time 全局设置为零?我主要好奇将其设置为零时是否有我忽略的好处。

【问题讨论】:

  • 在 php 7 中,它是 ini_set('max_execution_time', '0'); (0 是一个字符串,否则你会得到一个 TypeError)。是的,如果您需要执行繁重的计算脚本,这在开发中是个好主意。

标签: php


【解决方案1】:

原因是有一些不是零的值。 一般的做法是在全局范围内缩短它,而对于解析器、爬虫、转储程序、导出和导入脚本等长时间工作的脚本来说,它是长期的。

  1. 你可以通过内存停止服务器,破坏其他人的工作 在不知不觉中使用脚本。
  2. 您不会看到错误 比方说,发生了无限循环的地方,这将更难诊断。
  3. 当请求执行时间长的页面时,此类网站可能很容易被单个用户 DoSed

【讨论】:

    【解决方案2】:

    冒着激怒你的风险;

    你问错问题了。您不需要理由不偏离默认值,反之亦然。你需要一个理由这样做。运行 Web 服务器时超时是绝对必要的,并且无缘无故禁用该设置本质上是违反良好做法的,即使它运行在恰好有自己的超时指令的 Web 服务器上。

    现在,至于真正的答案;在这种特殊情况下可能根本不重要,但是通过设置单独的系统来进行是不好的做法。如果脚本稍后在具有不同超时的不同服务器上运行怎么办?如果您可以放心地说它永远不会发生,那很好,但良好的做法主要是考虑看似不太可能发生的事件,而不是将完全不同系统的设置和功能不必要地捆绑在一起。忽略这些原则是软件世界中许多毫无意义的不兼容的原因。几乎每次都无法预料。

    如果稍后将 Web 服务器设置为运行仅从 Web 服务器继承超时设置的其他运行时环境怎么办?例如,假设您稍后需要一个 15 年前的 CGI 程序,该程序由搬到另一个大陆的人用 C++ 编写,除了 Web 服务器的超时之外,它不知道任何超时。这可能会导致需要更改超时,并且因为 PHP 毫无意义地依赖 Web 服务器的超时而不是它自己的超时,这可能会导致 PHP 脚本出现问题。或者反过来说,由于某种原因,您需要更短的 Web 服务器超时,但 PHP 仍然需要更高的超时时间。

    将 PHP 功能绑定到 Web 服务器并不是一个好主意,因为 Web 服务器和 PHP 负责不同的角色,并且应该尽可能地保持功能上的分离。当 PHP 端需要更多处理时间时,它应该是 PHP 中的一个设置,只是因为它与 PHP 相关,而不一定是 Web 服务器上的其他所有内容。

    简而言之,就是在没有必要的时候把事情混为一谈。

    最后但同样重要的是,“静止”是正确的;你至少应该使用set_time_limit() 而不是ini_set()

    希望这不是太傲慢和令人恼火。就像我说的,在你的具体情况下可能没问题,但最好不要假设你的情况是唯一的真实情况。就这样。 :)

    【讨论】:

    • 我主要是想首先了解默认设置的基本原理。仅仅因为它是默认值并不能使它变得更好。拥有一个默认的max_execution_time 设置仍然让我觉得拥有一个“无限循环检测器”。并且 PHP 实现(在 'cli' 下默认为 0,否则为 30)似乎与您的“不必要地将完全不同系统的设置和功能捆绑在一起”的论点相矛盾。尽管如此,您还是提供了一个写得很好的、有原则的答案,并附有很好的例子。谢谢。
    • 好吧,在命令行环境中,您永远不会摆脱与环境打交道的麻烦(因此 POSIX 合规性很重要),因此它不完全具有可比性。但即便如此,CLI PHP 还是相对较新的; PHP 直到版本... 4.5 甚至 5 才打算用作 CLI 环境,我认为。
    • 谁在“静止”,我在哪里可以找到他?
    • 很好奇,ini_set('max_execution_time', ...)set_time_limit(...) 有什么区别?我认为它们是相同的。
    • @SalmanAbbas 请参阅stackoverflow.com/questions/8914257/… - 不完全相同,但看起来足够接近。也许 2010 年的情况有所不同?
    猜你喜欢
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    相关资源
    最近更新 更多