以 gzip 格式发送数据导致 ajax 进度暂时停止
Sending data in gzip format caused the ajax progress stopped for a while
我正在通过 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 阶段吗,我不明白这种行为的原因。
提供帮助会非常有帮助。如果您需要更多信息,请告诉我。
对我来说,这种行为似乎与 gzip 压缩的工作方式有关。
您所看到的时间不能用与 w/o gzip 压缩相同的方式来解释,因为您有更多事情正在发生:
- 在服务器端缓冲数据以进行压缩
- 缓冲完成后进行实际压缩
- 将更小的压缩数据发送到客户端
- 客户端正在缓冲压缩数据,需要等到它获得所有数据才能解压缩
- 客户端终于可以解压数据了,这比压缩时间快多了
您可能需要在“网络监控”选项卡中启用 "Use Large Request Rows" 才能查看更详细的计时。也许这也会有所帮助。
我们无法告诉您服务器内部或您与服务器之间的网络发生了什么。我们无法评论您代码中的特定问题,因为您没有向我们展示任何问题。然而...
您是否测量过服务器本身的响应配置文件?
禁用压缩?
压缩和 PHP 的输出缓冲被禁用?
为什么要在 php 中压缩而不是在网络服务器上压缩?或者在 SSL 层?
您是否对代码进行了检测以识别执行进度?
你分析过你的代码了吗?
您的代码是否明确执行 ob_end_flush() 后立即退出(在已注册的关闭函数中处理任何清理)?
- 如果您提供了代码的关键部分(或全部),您将得到真正匹配的答案。
- 你没有提到你做了多少次试验。如果经常出现这种情况,那才需要调查。
- 服务器似乎很好地响应客户端并发送数据。因此,您的客户使用了一种自我削弱的代码。
- 如果你不使用异步数据模式,那么结果是显而易见的。但即使使用异步模式,也会出现延迟,因为提取也是进度的一部分。
- 第 4 步应该只持续几秒钟,因此罪魁祸首甚至可能与您的脚本无关。您是否尝试过在不压缩的情况下使用您的代码?总是先使用简单的方法,然后再尝试复杂的方法。
- 您是否认为 JSON 数据提取需要时间? 100kb gzipped json 文件!! json 文件需要处理大量数据。我猜这可能是你故事中的反派。
我正在通过 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 阶段吗,我不明白这种行为的原因。
提供帮助会非常有帮助。如果您需要更多信息,请告诉我。
对我来说,这种行为似乎与 gzip 压缩的工作方式有关。
您所看到的时间不能用与 w/o gzip 压缩相同的方式来解释,因为您有更多事情正在发生:
- 在服务器端缓冲数据以进行压缩
- 缓冲完成后进行实际压缩
- 将更小的压缩数据发送到客户端
- 客户端正在缓冲压缩数据,需要等到它获得所有数据才能解压缩
- 客户端终于可以解压数据了,这比压缩时间快多了
您可能需要在“网络监控”选项卡中启用 "Use Large Request Rows" 才能查看更详细的计时。也许这也会有所帮助。
我们无法告诉您服务器内部或您与服务器之间的网络发生了什么。我们无法评论您代码中的特定问题,因为您没有向我们展示任何问题。然而...
您是否测量过服务器本身的响应配置文件?
禁用压缩?
压缩和 PHP 的输出缓冲被禁用?
为什么要在 php 中压缩而不是在网络服务器上压缩?或者在 SSL 层?
您是否对代码进行了检测以识别执行进度?
你分析过你的代码了吗?
您的代码是否明确执行 ob_end_flush() 后立即退出(在已注册的关闭函数中处理任何清理)?
- 如果您提供了代码的关键部分(或全部),您将得到真正匹配的答案。
- 你没有提到你做了多少次试验。如果经常出现这种情况,那才需要调查。
- 服务器似乎很好地响应客户端并发送数据。因此,您的客户使用了一种自我削弱的代码。
- 如果你不使用异步数据模式,那么结果是显而易见的。但即使使用异步模式,也会出现延迟,因为提取也是进度的一部分。
- 第 4 步应该只持续几秒钟,因此罪魁祸首甚至可能与您的脚本无关。您是否尝试过在不压缩的情况下使用您的代码?总是先使用简单的方法,然后再尝试复杂的方法。
- 您是否认为 JSON 数据提取需要时间? 100kb gzipped json 文件!! json 文件需要处理大量数据。我猜这可能是你故事中的反派。