Я занимаюсь разработкой веб-приложения и использую jQuery для выполнения асинхронных HTTP-запросов к моему API.У меня есть подробный вид, где вы можете увидеть много информации о конкретном объекте, хранящемся в базе данных.Поскольку существует много информации и данных, связанных с другими объектами, я выполняю различные вызовы своего API для сбора различной информации для своих представлений.
В «подробном представлении» у меня есть некоторые виджеты, которыепоказать запрашиваемую информацию.Для этого я делаю около 5-7 запросов HTTP GET к своему API.При использовании отладчика (как Safari, так и Firefox) я вижу, что некоторые запросы блокируют другие запросы, и страница занимает много времени, пока все не будет загружено и показано пользователю.
Я делаю запрос какthis:
$.get("api/api.php?object=myobject&endpoint=someendpoint", function(data) {
// data is JSON formatted
$("#my-widget input").val(data["name"]);
});
И еще один, например, такой:
$.get("api/api.php?object=anotherobject&endpoint=anotherendpoint", function(data) {
// data is JSON formatted
$("#other-widget input").val(data["somekey"]);
});
Если первый запрос длится немного дольше, он блокирует второй запрос до функции обратного вызова первогоЗапрос завершен.Но почему?Я думал, что эти вызовы асинхронные и неблокирующие.
Я хочу создать быстрое веб-приложение для компании, где запросы только выполняются внутри локальной сети, поэтому запрос должензаймет около 10-50 мс (или даже меньше).Но страница занимает около 10 секунд, чтобы показать всю информацию.
Я что-то не так делаю?Или есть JavaScript-фреймворк, который можно использовать именно для этой проблемы?Любая помощь приветствуется!
РЕДАКТИРОВАТЬ: Как вы можете видеть на скриншоте, запросы должны подождать несколько секунд, и если запрос выполняется, потребуется несколько секунд, пока ответ не вернется.
Если я вызываю URL-адрес прямо в браузере или выполняю GET-запрос, используя curl
, это намного быстрее.
![Screenshot of timeline](https://i.stack.imgur.com/zbWa2.png)
EDIT2:Спасибо @CBroe!Проблема была в блокировке записи файла сеанса.Пока файл сеанса заблокирован, никакой другой сценарий не может быть запущен, пока предыдущий сценарий не завершится.Я только что позвонил session_write_close()
сразу после session_start()
, и теперь он работает намного быстрее.
Внимание: Используйте session_write_close()
, только если вам не нужно записывать в массив $_SESSION
.После этого возможно чтение, но нет записи.(См. Эту тему для получения дополнительной информации: https://stackoverflow.com/a/50368260/1427878)