ini_set(“max_execution_time”,0)是一个坏主意吗?

php
2022-08-30 09:17:47

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

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

ini_set('max_execution_time', 0);

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

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

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

但也继续说:

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

我们在 Apache 下运行,因此超时设置适用。有什么理由不在全球范围内设置为零?我主要好奇的是,当没有将其设置为零时,我是否忽略了一些好处。max_execution_time


答案 1

冒着刺激你的风险;

你问错了问题。您不需要一个理由来避免偏离默认值,而是相反。你需要一个这样做的理由。在运行 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()

希望这不会太傲慢和烦人。就像我说的,在你的特定情况下可能没关系,但不要假设你的环境是唯一的真实环境是一种很好的做法。就这样。:)


答案 2

原因是具有除零以外的某些值。一般的做法是让它全局短,长工作脚本,如解析器,爬虫,转储器,导出和导入脚本等。

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

推荐