代码之家  ›  专栏  ›  技术社区  ›  onassar

当我输入错误并导致一个永无止境的循环时,为什么apache/server会死掉?

  •  1
  • onassar  · 技术社区  · 15 年前

    这是apache/threading如何工作的一个基本问题。 在这个假设中(读:有时我编写糟糕的代码),我编写了一些代码,这些代码进入了它生命中的无限递归阶段。然后,发生了预期的事情。服务摊位。

    即使我关闭标签,打开一个新的,并再次点击网站(当然,在本地),它也不会做任何事情。即使我通过vhost声明访问了另一个我托管的域,也没什么。在apache再次开始处理流量之前,我通常需要等待几秒钟。大多数时候我只是累了,然后手动重启服务器。

    有人能给我解释一下这个过程吗?我将php运行时设置“ignore_user_abort”设置为true,以允许ajax调用继续运行,即使这些调用关闭了浏览器,但是设置为false会影响它吗?

    任何帮助都将不胜感激。不知道该找什么。 谢谢。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Marc B    15 年前

    ignore_user_abort() 允许脚本(和Apache)忽略用户断开连接(关闭浏览器/选项卡,离开页面,单击ESC,ESC..)并继续处理。这在某些情况下很有用——例如,在用户点击“是,下订单”后,在购物车中。你真的不希望订单在整个过程中半途而废,例如订单在数据库中,但是费用还没有发送到支付工具。反之亦然。

    然而,当这个脚本在“后台”中忙碌地运行时,它会锁定服务器上的资源,特别是会话文件-PHP会锁定会话文件,以确保多个并行请求不会在文件上到处乱蹦乱跳,因此,当无限循环在后台运行时,您将无法使用任何启用了会话的场地的其他部分。如果循环足够密集,它可能会占用足够多的CPU,以至于Apache无法处理其他托管站点上的任何其他请求,在这些站点上会话锁可能不适用。

    如果是无限循环,则必须等待PHP自己允许的最大运行时间。 set_time_limit() 和 max_execution_time() )踢进去杀了剧本。还有一些服务器端的限制,比如Apache的 RLimitCPU 和 TimeOut 可以处理这种情况。

    请注意,除了在Windows上,PHP不在设置的时间限制内计算“外部”时间。所以如果你的失控进程正在做数据库工作,通过 system() 诸如此类,运行这些外部调用所花费的时间不计入父级的时间限制。

        2
  •  0
  •   Paul Sonier    15 年前

    如果您编写的代码导致了(有效的)neverending循环,那么apache将执行该循环,并且无法响应任何额外的页面新请求,因为它试图通过执行(非终止的)php代码来确定页面内容(对于导致neverending循环的服务页面)。

    解决方案:不要编写不终止的代码(在合理的时间内)。了解循环不变量。

    推荐文章