我有一个非常大的json(约30mb),它与IIS进行了gzip映射(因此大小约为6mb)。由于未知的原因,gzip在大多数情况下都能工作,但有时不行,在获得gzip中的文件之前,我必须刷新页面好几次。
中国的用户似乎从来没有gzip格式的文件,在代理和其他东西后面,加载时间太长了。(他给我发了一个打印屏幕,显示4分钟内下载了12mb)。
该文件是用php生成的,并用javascript显示在客户端。我当时的第一个(也是唯一的)解决方案是在将查询返回的数据放入文件之前,自己对其进行gzip。
我搜索发现PHP上有gzcompress
、gzencode
和gzdeflate
,最重要的是gzcompression应该返回zlib
格式,这样我就可以在javascript上使用zlib
库。
PHP方面:
file_put_contents('data/data2.json', gzcompress($res, 9));
需要file_put_contents,因为我每20分钟刷新一次同一个文件。
Javascript端:
$.ajax({
type: 'GET',
url: "data/data2.json",
headers: { "Content-Encoding" : "gzip", "Content-type": "text/plain" },
dataType: "text",
async: false,
success: function(data) {
let inflate = new zlib.inflate(data);
});
不幸的是,这不起作用。
如果我像示例一样编写let inflate = new zlib.inflate(data).toString('utf8');
,它将返回"[Object object]"
,如果我删除了toString部分,它将恢复e…s.inflate {}
。
我的猜测是gzcompress
和zlib
之间的编码不一样(谢谢队长),所以zlib无法转换,但我无法修复
TL;DR为什么gzip每次都不起作用?如何在PHP上压缩json并在Javascript上解压缩它?
我首先要检查您的IIS服务器是否正确配置为gzip http响应
之后,我会提出一个简单的请求,并检查我的网络,看看响应是否正确地进行了gzip映射。
一旦所有这些都正常工作,就可以删除手动php压缩
file_put_contents('data/data2.json', gzcompress($res, 9));
和javascript解压缩,因为浏览器会为您解压缩,没有任何额外的逻辑。