这是apache / threading如何工作的一个基本问题。 在这个假设中(阅读:有时候我会编写可怕的代码),我会编写一些进入其生命无限递归阶段的代码。然后,发生了什么。服务摊位。
即使我关闭标签,打开一个新标签,再次点击该网站(当然是本地),它什么都不做。即使我点击了一个不同的域名,我通过vhost声明主持,没有。我通常需要等待几秒钟才能再次开始处理流量。大多数时候我只是累了并手动重启服务器。
有人可以向我解释这个过程吗?我将php运行时设置'ignore_user_abort'设置为true,以允许启动的ajax调用即使关闭浏览器也会继续运行,但是这会被设置为false会影响它吗?
任何帮助将不胜感激。不知道该搜索什么。 感谢。
答案 0 :(得分:1)
ignore_user_abort()
允许你的脚本(和Apache)忽略用户断开连接(关闭浏览器/标签,离开页面,按ESC,esc ..)并继续处理。这在某些情况下很有用 - 例如在用户点击“是,下订单”时在购物车中。你真的不希望订单在整个过程中途死亡,例如订单在数据库中,但尚未将费用发送到付款设施。反之亦然。
然而,虽然这个脚本在“后台”中忙着逃跑,但它会锁定服务器上的资源,特别是会话文件 - PHP锁定会话文件以确保多个并行请求不会全部踩踏该文件,因此当您的无限循环在后台运行时,您将无法使用该站点的任何启用会话的其他部分。如果循环足够密集,它可能会占用足够的CPU,以至于Apache无法处理会话锁定可能不适用的其他托管站点上的任何其他请求。
如果它是一个无限循环,你将不得不等到PHP自己允许的最大运行时间(set_time_limit()
和max_execution_time()
)启动并杀死脚本。还有一些服务器端限制器,如Apache的RLimitCPU
和TimeOut
,可以处理这样的情况。
请注意,除了在Windows上,PHP不计算set_time_limit中的“外部”时间。因此,如果您的失控进程正在执行数据库操作,通过system()
等调用外部程序,那么运行这些外部调用所花费的时间不会计入父级的时间限制。
答案 1 :(得分:0)
如果您编写导致(有效)无休止循环的代码,那么apache将执行该循环,并且无法响应页面的任何其他新请求,因为它正在尝试确定页面内容(对于所提供的页面,通过执行(非终止)php代码导致无休止的循环。
解决方案:不要编写未终止的代码(在合理的时间内)。理解循环不变量。