确定/规避AJAX请求是否超时的方法

Way to determine/circumvent if an AJAX request timed out?

本文关键字:超时 方法 是否 请求 规避 AJAX 确定      更新时间:2023-09-26

我有一个简单的网页(PHP, JS和HTML),显示以说明计算正在进行中。该计算由执行实际计算的php脚本的 JavaScript ajax请求触发。详情请参阅

实际计算是什么并不重要,所以为了简单起见,它只是一个sleep()命令。

当我在本地执行相同的代码时(浏览器在localhost: linux, apache, php-mod下调用网站),它工作得很好,独立于睡眠时间

然而,当我让它在不同的机器上运行时(不是本地主机,而是Linux, apache, php-mod), php脚本确实运行(创建结果),但是ajax请求没有得到任何响应,因此如果睡眠时间>= 900秒,则没有"onreadystatechange"。当睡眠时间<900秒,它也工作得很好,ajax请求被正确终止(readyState==4, status==200)。

apache和php配置或多或少是默认的,我已经验证了关键选项(max_execution_time等),但似乎没有一个在这里是有效的,因为它们要么更短(<1分钟),要么更大,例如对于垃圾收集器(24分钟)。

所以我很困惑是什么导致了这个。我认为这可能与网络有关,尽管我在路由器上没有找到任何合适的选项。也没有错误报告在apache日志或PHP(错误登录到文件)。

让带有ajax请求的JavaScript显示请求。状态成功返回时,令人惊讶的是,当我在睡眠结束后在浏览器窗口中按"Esc"时,我也得到状态"200"显示,但不是自动的,因为它应该这样做。

无论如何,我希望你能想出一个办法来解决这个问题。也许客户端和服务器之间每10分钟左右进行一些虚拟通信可能会奏效,但我不知道如何最好地做到这一点,特别是让这对用户透明并且不干扰执行计算/睡眠的实际工作。

,

影子

注:我引用的帖子是由我写的,但似乎传递了这样的想法,即它可能与一些配置选项有关,似乎不是就是这种情况。这就是我在这里写这篇文章的原因,基本上是在寻求一种方法来绕过这样的问题,而不管它的起源。

我来自你提到的另一个帖子!

现在我知道更多关于你想做的事情:监控一个可能长时间运行的服务器作业,我可以推荐一些应该会更好的东西,它不是对你的问题的直接回答,但它是一个设计考虑,包括其本质上更合适的解决方案。

基本上,从监控其进度中取消"启动"服务器端任务的操作。

  • execute.php在服务器上启动后台作业,并立即返回。
  • 另一个脚本/URL(我们称之为status.php)可以用来检查execute.php执行的任务的进度。
    • 当status.php被请求时,它不会返回,直到它有东西要报告,除非30秒(或其他固定的)时间过去,在这一点上它返回一个值,你知道的意思是"再次检查"。在循环中执行此操作,可以立即通知您后台任务何时完成。

类似的方法的更多细节:http://billhiggins.us/blog/2011/04/27/resty-long-ops

我希望这有助于给你一些设计思路来解决你的问题!