Обработка больших наборов данных через AJAX не приносит никаких преимуществ по скорости

У меня есть несколько запросов на длительность базы данных для запуска. Каждый из них был создан для запуска с помощью опции, выбранной на веб-странице. Я думал, что я довольно хитер, уволив работу через несколько запросов AJAX .

Я предположил, что несколько запросов будут разделены на несколько процессов / потоков, что означает, что работа будет выполнена относительно быстро для пользователя.

Тем не менее, запросы, похоже, обрабатываются в последовательном порядке , а это означает, что пользователь не получает никаких преимуществ по скорости.

Хуже того, запросы AJAX для обновления страницы также ждут в очереди, то есть они не могут ответить до тех пор, пока все предыдущие запросы не будут завершены.

Я прочитал, что это может быть вызвано блокировкой сеансов PHP.

Каков обычный подход для такого рода вопросов?

  • Есть ли способ заставить AJAX-запросы работать асинхронно?
  • Могу ли я остановить PHP от блокировки сеансов?
  • Должен ли я использовать отдельный процесс через cron для работы фона?

Благодаря!

NB Этот проект был построен с использованием схемы symfony.

AJAX использует jQuery

// Get the content $.get('/ajax/itemInformation/slug/'+slug, function(data) { $('#modal-more-information').html(data); }); 

Если вы используете сеансы вообще во время любого из заданных запросов AJAX, они будут эффективно выполняться последовательно, в порядке запроса. Это связано с блокировкой файла данных сеанса на уровне операционной системы. Ключом к тому, чтобы эти запросы были асинхронными, – это как можно быстрее закрыть (или никогда не запускать) сеанс.

Вы можете использовать session_write_close ( docs ), чтобы как можно скорее закрыть сеанс. Мне нравится использовать несколько вспомогательных функций для этого, функция set_session_var ниже откроет сеанс, напишет var, а затем закроет сеанс – и выйдет как можно быстрее. Когда страница загружается, вы можете вызвать session_start чтобы получить переменную $_SESSION , а затем сразу вызовите session_write_close . С этого момента используйте только функцию set, чтобы писать.

Функция get полностью необязательна, так как вы можете просто ссылаться на глобальный $_SESSION , но мне нравится использовать это, потому что оно обеспечивает значение по умолчанию, и я могу иметь один менее тройной в основной части кода.

 function get_session_var($key=false, $default=null) { if ($key == false || strlen($key) < 0) return false; if (isset($_SESSION[$key])) $ret = $_SESSION[$key]; else $ret = $default; return $ret; } function set_session_var($key=false, $value=null) { if ($key == false || strlen($key) < 0) return false; session_start(); if ($value === null) unset($_SESSION[$key]); else $_SESSION[$key] = $value; session_write_close(); } с function get_session_var($key=false, $default=null) { if ($key == false || strlen($key) < 0) return false; if (isset($_SESSION[$key])) $ret = $_SESSION[$key]; else $ret = $default; return $ret; } function set_session_var($key=false, $value=null) { if ($key == false || strlen($key) < 0) return false; session_start(); if ($value === null) unset($_SESSION[$key]); else $_SESSION[$key] = $value; session_write_close(); } 

Имейте в виду, что есть целый новый набор соображений, как только AJAX-запросы действительно асинхронны. Теперь вам нужно следить за условиями гонки (вы должны быть осторожны с одним запросом, устанавливающим переменную, которая может повлиять на другой запрос) – поскольку вы видите, что с закрытыми сессиями изменения одного запроса в $_SESSION не будут видны другому запросу пока он не восстановит значения. Вы можете избежать этого путем «перестройки» переменной $_SESSION непосредственно перед критическим использованием:

 function rebuild_session() { session_start(); session_write_close(); } 

… но это все еще подвержено состоянию гонки.