XHR-запросы не выполняются после истечения срока действия KeepAliveTimeout только при использовании соединения 4G - PullRequest
0 голосов
/ 21 ноября 2018

Я написал REST API и заметил проблему, которая, по-видимому, влияет на Chrome и Safari при подключении через 4G и при подключении телефона к Mac и использовании там Chrome.При использовании Firefox на Mac, привязанном к телефону, проблем нет.

Пока не тестируется в Windows.

При использовании Chrome на Android через 4G проблема возникает.

Бэкэнд на основе Apache / PHP / Slim Framework.Интерфейс на основе JQuery, выполняющий вызовы $ .ajax () через HTTPS.

Запрос POST остается на стадии «Задержка» в течение различного времени, прежде чем завершится с ошибкой net :: ERR_TIMED_OUT

Chrome DevTools

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

В chrome: // net-internals / # события, которые я вижу длясоответствующий запрос:

REQUEST_ALIVE --> net_error = -7 (ERR_TIMED_OUT)

Поскольку это этап на стороне клиента в процессе выполнения запроса, я задался вопросом, виноват ли мой код на стороне клиента, и последовал совету:

https://stackoverflow.com/a/27514611/6315532

Я добавил заголовок cache:false и Cache-Control с no-cache, no-store, must-revalidate среди нескольких других вещей, и это, похоже, не имело никакого эффекта.

Я также попробовал это: https://stackoverflow.com/a/367827/6315532

Проблема исчезает при использовании домашнего Wi-Fi, предполагая, что это как-то связано с сетью 4G, но поскольку Chrome придерживается предсетевой фазы выполнения запроса, яЯ озадачен.

Он успешно работает примерно в 1/3 временикогда на 4G, и кажется надежным, когда на домашнем WiFi.

Заранее спасибо!

РЕДАКТИРОВАТЬ: я обнаружил, что если я изменю конфигурацию KeepAlive в Apache, эту проблему можно уменьшить,

Если я отклоняю запросы до истечения времени ожидания KeepAlive, он работает нормально.Если KeepAlive завершает свою работу (нет запросов за период), первый последующий запрос будет остановлен на несколько минут, а затем завершится ошибкой с ERR_TIMED_OUT, и последующие запросы будут успешно работать, пока не истечет время ожидания KeepAlive.Есть ли что-то, что я мог бы сделать неправильно, чтобы вызвать это?

Я настроил KeepAliveTimeout, чтобы иметь более высокое значение, и это снижает вероятность того, что приложение столкнется с проблемой, но если его оставить в покое больше, чем время ожиданиязнаю, что он снова потерпит неудачу, не говоря уже о проблемах использования памяти, если сайт будет занят.

...