如何避免浏览器超时(长PHP脚本)

问题描述 投票:3回答:3

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

有人可以提供示例代码关于如何确保浏览器不会超时(或详细说明如何操作)吗?最好的方法是什么?阿贾克斯?

谢谢。

编辑:

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

所以,我可以简单地通过Ajax调用较长的PHP脚本,然后将其运行多长时间而无需超时(即使该脚本未返回任何内容)?

php javascript ajax browser timeout
3个回答
7
投票

这实际上取决于脚本的工作方式以及它发回的内容,但是如果可以使用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
}

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

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

这将释放用户在脚本运行时继续浏览您的网站的权限,并且不会迫使他们坐在一页上盯着加载指示器。


2
投票

您需要通过AJAX请求启动主流程,然后连续轮询服务器以检查进度。无法告诉浏览器不要超时。 (并且可以理解的是。如果我的浏览器挂了5分钟,我会很困惑。)

我建议为脚本的每次运行分配唯一的ID,然后将其传回AJAX请求。然后,在将来的状态轮询中,只需传递该ID,轮询脚本即可返回状态。您如何处理状态信息取决于实际发生的情况。


0
投票

如果您不希望浏览器超时,那么这是我可能为您想到的唯一解决方案...。请知道这一点:我将php设置为在10秒后超时。如果处理所需的时间比以前更长,那么该脚本不适合访问我的网站的用户。

1)优化您的代码-找出代码中哪些部分花费的时间太长,并确定可以做些什么以使其更快。

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

3)创建单独的例程,这些例程需要单独的ajax样式方法调用。调用例程1以启动一段脚本。调用例程2来发出另一个Ajax请求,并启动第二个after,第一个已经返回。等

4)老实说-我会找到另一个解决方案。显然,如果您的脚本执行需要花费很长时间,则terribly错误...


0
投票

请有人可以帮助我。我正在使用Internet Explorer。有人可以向我解释如何停止我的浏览器超时。但更加简化。请。请请请。

© www.soinside.com 2019 - 2024. All rights reserved.