Отправка данных в формате gzip привела к тому, что процесс ajax на некоторое время остановился - PullRequest
0 голосов
/ 03 мая 2018

Я выполняю вызов ajax через jquery, а на стороне сервера я использую PHP. Цель состоит в том, чтобы принести большие данные JSON со стороны сервера. Поскольку размер JSON большой, поэтому при отправке данных я использую сжатие gzip.

На стороне сервера;

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

Теперь я вижу значительное уменьшение объема данных, которые передаются. Но я вижу, что процесс вызова ajax застревает на некоторое время (я проверяю через область мониторинга сети Chrome).

Наблюдение выглядит следующим образом;

1 . Состояние вызова отображается в ожидании около 23 секунд (что идеально, так как в это же время генерируется JSON)

2 . Передача данных начинается через 24 секунды и продолжается до 94,4 кБ данных в течение следующих 5–6 секунд

3 . После этого он застрял почти на 20 секунд, когда время не увеличивается даже, я имею в виду, что оно показывает то же самое время, которое остается в точке 2.

4 . И вдруг он показывает, что вызов ajax завершен, и я получаю полные данные, и время показывает прямо около 56 секунд. И размер данных остается тем же, что составляет 94,4 КБ, что означает, что на этапе 3 и этапе 4

дополнительные данные не были переданы

Так, пожалуйста, объясните мне стадию 3 и стадию 4, я не понимаю причину такого поведения.

И какая-то помощь будет очень полезна. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Мы не можем сказать вам, что происходит внутри вашего сервера или в сети между вами и сервером. Мы не можем комментировать конкретные проблемы в вашем коде, поскольку вы нам их не показывали. Однако ...

Вы измерили профиль ответа на самом сервере?

С отключенным сжатием?

Если сжатие и выходная буферизация PHP отключены?

Почему вы сжимаете в php, а не на веб-сервере? Или на уровне SSL?

Инструментировали ли вы свой код для определения хода выполнения?

Вы профилировали свой код?

Ваш код явно выполняет ob_end_flush () сразу после выхода (с любой обработкой, обработанной в зарегистрированной функции завершения работы)?

0 голосов
/ 14 мая 2018
  1. Если бы вы предоставили важные части (или весь) своего кода, у вас был бы действительно верный ответ.
  2. Вы не упомянули, сколько испытаний вы провели. Если это случается постоянно, то только тогда стоит разобраться.
  3. Сервер действительно хорошо отвечает клиенту и отправляет данные. Таким образом, ваш клиент использует код, который калечит его сам.
  4. Если вы не используете асинхронный режим данных, то очевидно, что произойдет. Но даже в асинхронном режиме задержки происходят из-за того, что извлечение также является частью прогресса.
  5. Шаг-4 должен длиться всего несколько секунд, поэтому виновник может даже не быть связан с вашими сценариями. Вы пытались использовать свой код без сжатия? Всегда сначала используйте простые методы, затем попробуйте сложные.
  6. Вы когда-нибудь думали, что извлечение данных JSON может занять много времени? 100kb сжатый файл JSON! Это очень много данных для продвижения из файла JSON. Наверное, это может быть злодей в твоей истории.
0 голосов
/ 08 мая 2018

Мне кажется, что такое поведение связано с тем, как работает сжатие gzip.

Время, которое вы видите, не может интерпретироваться так же, как без сжатия gzip, потому что у вас происходит больше вещей:

  • буферизация данных на стороне сервера для сжатия
  • выполнение фактического сжатия после завершения буферизации
  • отправка сжатых данных намного меньшего размера клиенту
  • клиент теперь буферизует сжатые данные и ему нужно подождать, пока он получит все эти данные, прежде чем он сможет распаковать их
  • наконец, клиент может распаковать данные, что происходит намного быстрее, чем время сжатия

Возможно, вам понадобится включить «Использовать большие строки запроса» на вкладке «Мониторинг сети», чтобы увидеть более подробное время Может быть, это тоже поможет.

enter image description here

(источник изображения)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...