以gzip格式发送数据导致ajax进度停止了一段时间

时间:2018-05-03 09:42:49

标签: javascript php jquery ajax gzip

我正在通过jquery调用ajax调用,而在服务器端我正在使用PHP。目的是从服务器端带来一个大的JSON数据。由于JSON大小很大,这就是我在发送数据时使用gzip压缩的原因。

在服务器端;

ob_start('ob_gzhandler');
header('Content-Encoding: gzip');

现在我看到正在传输的数据量大幅减少。但是我看到ajax调用进程暂停了一段时间(我正在通过chrome网络监控区域进行检查)。

观察结果如下;

1 即可。呼叫状态显示未决约23秒(这是完美的,因为它与生成JSON完全相同)

2 即可。数据传输从第24秒开始,并在接下来的5到6秒内继续传输94.4 kB数据

第3 即可。之后它几乎停滞了20秒,当时间没有增加时,我的意思是它显示同一时间停留在第2点。

4 即可。然后它突然显示ajax调用完成,我得到完整的数据和时间显示直接到56秒左右。并且数据大小保持不变,即94.4 kb,这意味着在第3阶段和第4阶段没有传输额外数据

那么请你解释我的第3阶段和第4阶段,我没有得到这种行为的原因。

那种帮助会非常有帮助。如果您需要更多信息,请告诉我。

3 个答案:

答案 0 :(得分:2)

对我来说,这种行为似乎与gzip压缩的工作方式有关。

您所看到的时间不能像没有gzip压缩一样解释,因为您发生了更多事情:

  • 缓冲服务器端的数据以进行压缩
  • 在缓冲完成后进行实际压缩
  • 将更小的压缩数据发送到客户端
  • 客户端现在正在缓冲压缩数据,需要等到它完全解压缩才能解压缩
  • 最后客户端可以解压缩比压缩时间快得多的数据

您可能需要在网络监控选项卡中启用“使用大型请求行”以查看更详细的时序。也许这也会有所帮助。

enter image description here

(image source)

答案 1 :(得分:2)

  1. 如果您提供了关键部分(或全部)代码,那么您将获得真正匹配的答案。
  2. 你没有提到你做了多少次试验。如果这种情况一直发生,那么只有这样才能进行调查。
  3. 服务器似乎很好地回答客户端并发送数据。因此,您的客户使用的代码会使自己陷入瘫痪。
  4. 如果您不使用异步数据模式,那么很明显会发生什么。但即使使用异步模式,也会导致延迟,因为提取也是进步的一部分。
  5. 步骤4应该只持续几秒钟,因此罪魁祸首甚至可能与您的脚本无关。您是否尝试过不使用压缩的代码?始终首先使用普通方法,然后尝试复杂方法。
  6. 您是否认为JSON数据提取需要时间? 100kb gzipped json文件!!这是从json文件中获取的大量数据。我想这可能是你故事中的恶棍。

答案 2 :(得分:1)

我们无法告诉您服务器内部或您与服务器之间网络上发生的情况。我们无法对您的代码中的特定问题发表评论,因为您尚未向我们展示任何问题。然而...

您是否测量过服务器本身的响应配置文件?

禁用压缩?

压缩和PHP的输出缓冲是否已禁用?

为什么要在php中压缩而不是在Web服务器上压缩?或者在SSL层?

您是否已检测过代码以确定执行进度?

你有没有想过你的代码?

您的代码是否显式执行ob_end_flush()后紧跟一个退出(在已注册的关闭函数中处理任何清理)?