У меня есть несколько запросов на длительность базы данных для запуска. Каждый из них был создан для запуска с помощью опции, выбранной на веб-странице. Я думал, что я довольно хитер, уволив работу через несколько запросов AJAX .
Я предположил, что несколько запросов будут разделены на несколько процессов / потоков, что означает, что работа будет выполнена относительно быстро для пользователя.
Тем не менее, запросы, похоже, обрабатываются в последовательном порядке , а это означает, что пользователь не получает никаких преимуществ по скорости.
Хуже того, запросы AJAX для обновления страницы также ждут в очереди, то есть они не могут ответить до тех пор, пока все предыдущие запросы не будут завершены.
Я прочитал, что это может быть вызвано блокировкой сеансов PHP.
Каков обычный подход для такого рода вопросов?
Благодаря!
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(); }
… но это все еще подвержено состоянию гонки.