我有几个耗时的数据库查询来运行。每个都是根据网页上选择的选项触发的。我认为通过几个AJAX请求解雇工作,我非常狡猾。
我假设多个请求将被分割为多个进程/线程,这意味着可以相对快速地为用户完成工作。
但是,请求似乎是串行处理,这意味着用户无法感受到速度优势。
更糟糕的是,更新页面的AJAX请求也排队等候,这意味着他们无法响应,直到之前的请求全部完成。
我有read这可能是由于PHP会话被锁定造成的。
此类问题的常用方法是什么?
谢谢!
注意:这个项目是使用symfony框架构建的。
AJAX使用jQuery
// Get the content
$.get('/ajax/itemInformation/slug/'+slug, function(data) {
$('#modal-more-information').html(data);
});
答案 0 :(得分:2)
如果您在任何给定的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();
}
请注意,一旦AJAX请求真正异步,就会有一整套新的注意事项。现在你需要注意race conditions(你必须警惕设置一个可能影响另一个请求的变量的一个请求) - 因为你看,当会话关闭时,一个请求对$_SESSION
的更改将会在重建值之前,其他请求不可见。您可以通过在关键用途之前“重建”$_SESSION
变量来避免这种情况:
function rebuild_session() {
session_start();
session_write_close();
}
......但这仍然容易受到竞争条件的影响。