У меня есть очень большой JSON (~ 30 МБ), который поставляется с IIS (благодаря этому размер около 6 МБ). По неизвестной причине gzip работает большую часть времени, но иногда это не так, мне приходится несколько раз обновлять страницу, прежде чем получить файл в gzip.
У пользователя в Китае, кажется, никогда нет файла в формате gzip и за прокси-серверами и прочим, время загрузки слишком велико. (Он прислал мне распечатанный экран, показывающий 12 Мб, загруженных за 4 минуты)
Файл генерируется с помощью php и отображается на стороне клиента с помощью javascript.
Мое первое (и уникальное) решение в то время — это сжать в одиночку данные, возвращаемые моим запросом, перед тем, как поместить их в файл.
Я искал и нашел там gzcompress
, gzencode
а также gzdeflate
на PHP, и больше всего gzcompress должен возвращать zlib
формат, чтобы я мог использовать zlib
библиотека на javascript.
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 не работает каждый раз? Как сжать JSON на PHP и распаковать его на Javascript?
Я бы сначала проверил, что ваш сервер IIS правильно настроен на gzip http ответы
После этого я бы сделал простой запрос и проверил свою сеть, чтобы увидеть, правильно ли получен ответ.
После того, как все это работает хорошо, вы можете удалить ручное сжатие PHP
file_put_contents('data/data2.json', gzcompress($res, 9));
И Javascript распаковать, так как браузер разархивирует для вас, без какой-либо дополнительной логики.
Других решений пока нет …