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

时间:2012-03-02 20:36:00

标签: php javascript ajax browser timeout

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

有人可以提供示例代码,了解如何确保浏览器没有超时(或者详细说明要做什么)?什么是最好的方法? Ajax的?

感谢。

修改

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

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

3 个答案:

答案 0 :(得分:6)

这实际上取决于你的脚本正在做什么以及它发送回来的内容,但是如果你可以使用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
}

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

然后,您需要做的就是制作一个在您网站的页面上运行的脚本,让用户知道您正在做什么,并且/或者为他们提供文件/输出等等。

这样可以让用户在脚本运行时释放您的网站,并且不会强迫他们坐在单个页面上,盯着加载指示器。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

1)优化代码 - 找出代码的哪些部分花费的时间太长,并确定如何使代码更快。

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

3)创建需要单独的ajax样式方法调用的单独例程。调用例程1来启动一段脚本。调用例程2进行另一个ajax请求并在之后启动第二个,第一个已经返回它完成。等

老实说 - 我只是找到另一种解决方案。很明显,如果你的脚本需要很长时间才能执行,那么非常错误......