Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止浏览器超时(长PHP脚本)_Php_Javascript_Ajax_Browser_Timeout - Fatal编程技术网

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

如何防止浏览器超时(长PHP脚本),php,javascript,ajax,browser,timeout,Php,Javascript,Ajax,Browser,Timeout,PHP脚本需要25秒才能完成(对于一个人来说),如果流量大,可能需要更长的时间。我不希望浏览器超时(PHP不会-I设置时间限制(0);) 是否有人可以提供示例代码,说明如何确保浏览器不会超时(或者详细解释如何执行)?最好的方法是什么?阿贾克斯 谢谢 编辑: Brian Graham说,“一旦javascript启动ajax请求,它将一直运行到完成、退出或出错。据我所知,如果用户离开页面,它甚至应该这样做。” 因此,我可以简单地通过Ajax调用长PHP脚本,然后它将运行多长时间而不会超时(即使脚本

PHP脚本需要25秒才能完成(对于一个人来说),如果流量大,可能需要更长的时间。我不希望浏览器超时(PHP不会-I
设置时间限制(0);

是否有人可以提供示例代码,说明如何确保浏览器不会超时(或者详细解释如何执行)?最好的方法是什么?阿贾克斯

谢谢

编辑:


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


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

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


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

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

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

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

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


4) 老实说,我只是想找到另一个解决办法。显然,如果您的脚本执行时间太长,则会出现严重错误…

这实际上取决于您的脚本正在执行什么以及它将返回什么,但如果您可以使用AJAX,这将是一条可行之路。它不仅可以让您长时间运行请求,而且不会占用浏览器,让用户在请求完成之前可以继续使用当前页面

我发现实现类似的功能的最好方法是设置ignore\u user\u 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启动这个过程,然后每隔几秒钟使用Ajax从服务器请求一个像素gif(任何保持连接活动的东西)。这会使脚本保持连接吗?(我将使用onreadystatechange来了解流程何时完成)。一旦javascript启动ajax请求,它将一直运行到完成、退出或出错。据我所知,如果用户离开页面,它甚至应该这样做。保持活动的连接将挂起大请求。持久连接在移动到下一个请求之前完成一个请求。处理过程的最简单的方法(虽然也许不是最好的)(尽管你应该考虑Jonathon Hibbard的一些建议,试图找出脚本为什么需要这么长时间),但是在脚本的开头创建一个名为状态ID的文件,然后在脚本末尾删除文件。然后,您的状态检查将是:如果文件存在,仍在运行,否则,完成。@BrianGraham我可以通过Ajax启动长脚本,并且无论花费多长时间(甚至几分钟),它都会完成吗?对于每个浏览器?我不确定关闭浏览器是否会杀死正在运行的php进程,但只要ajax与所有浏览器兼容,就不会有任何问题。如果有的话,可以使用php
system
passthru
命令将其踢到php的后台,而不需要用户在场(保证)。大多数时间(大约3/4)都是联系远程服务器-我无法控制其速度。同样,这是您想要分离出来的。创建一个由守护进程/cron脚本处理的队列,或者您想做的任何事情,这就是您“控制”它的方式。在一天结束时,你必须问自己这样一个问题:用户是要等到我得到回复,还是在我给他们回复之前他们就要离开我的页面。希望他们能等待——脚本实际上是用来处理订单的!这就是为什么我要确保浏览器不会超时。谢谢你的邀请