如何防止浏览器超时(长PHP脚本)


How to keep browser from timing out (long PHP script)

PHP脚本需要25秒才能完成(对于1个人),而且在高流量的情况下可能需要更长的时间。我不希望浏览器超时(PHP不会-I set_time_limit(0);)。

有人能提供关于如何确保浏览器不会超时的示例代码吗(或者详细解释该怎么做)?最好的方法是什么?ajax

谢谢。

编辑:

BrianGraham说:"一旦javascript启动ajax请求,它就会一直运行到完成、退出或出错。据我所知,如果用户离开页面,它甚至应该这样做。"

那么,我可以简单地通过Ajax调用长PHP脚本,然后它将运行所需的时间,而不会超时(即使脚本没有返回任何内容)吗?

这实际上取决于你的脚本在做什么以及它要发回什么,但如果你能使用AJAX,那将是最好的选择。它不仅可以让你长时间运行请求,而且不会占用浏览器,让用户可以继续使用当前页面,直到请求完成。

实现我发现的类似功能的最佳方法是设置ignore_user_abort并关闭时间限制。通过这种方式,您可以让脚本在后台运行。这样,当用户浏览您的网站时,脚本可以继续运行。他们甚至不必保持一致。因此,您使用AJAX启动请求。在该脚本中有一个循环,用于更新用户会话的进度。

ini_set('session.use_cookies', 0); //don't spam the user with cookies for each session_start()
while( ... ) {
    session_start();
    //update status to the user's session
    session_write_close();
    //sleep or whatever
}

显然,这不一定是一个循环。您只需在开始处理信息之前关闭会话,然后打开它,设置状态,然后再次关闭它。一次只有一个脚本可以访问用户的会话,所以您需要确保这个过程不会占用时间。

然后,你所需要做的就是制作一个在网站页面上运行的脚本,让用户知道你所做的一切何时完成,并/或为他们提供文件/输出等。

这让用户可以在脚本运行时继续浏览您的网站,而不会强迫他们坐在一个页面上盯着加载指示器。

您需要使用AJAX请求启动主进程,然后不断轮询服务器以检查进度。没有办法告诉浏览器不要超时。(这是可以理解的。如果我的浏览器挂起5分钟,我会很困惑。)

我建议为每一次脚本运行分配一个唯一的id,然后将其传递回AJAX请求。然后,在未来的状态轮询中,只需传递该ID,轮询脚本就可以返回状态。如何处理状态信息将取决于具体发生了什么。

如果您不希望浏览器超时,那么以下是我可能为您考虑的唯一解决方案。。。。只要知道这一点:我将php设置为10秒后超时。如果处理时间比这长,那么这个脚本就不适合访问我网站的用户。

1) 优化你的代码-找出你的代码中哪一部分花费的时间太长,并确定你可以做些什么来加快它。

2) 使用推拉式解决方案。将请求推送到服务器,并告诉它执行应用程序。应用程序被放入要运行的队列中,服务器返回进程ID。服务器上的守护进程检查队列并从cli而不是浏览器执行脚本。

3) 创建需要单独ajax风格方法调用的单独例程。调用例程1来启动一段脚本。调用例程2发出另一个ajax请求,并在第一个请求返回完成后启动第二个。等

4) 老实说,我只是想找到另一个解决方案。很明显,如果你的脚本执行起来花了那么长时间,那么就出现了严重的错误。。。