通过AJAX处理大型数据集不会带来任何速度优势

时间:2011-09-06 16:54:21

标签: php ajax database symfony1

我有几个耗时的数据库查询来运行。每个都是根据网页上选择的选项触发的。我认为通过几个AJAX请求解雇工作,我非常狡猾。

我假设多个请求将被分割为多个进程/线程,这意味着可以相对快速地为用户完成工作。

但是,请求似乎是串行处理,这意味着用户无法感受到速度优势。

更糟糕的是,更新页面的AJAX请求也排队等候,这意味着他们无法响应,直到之前的请求全部完成。

我有read这可能是由于PHP会话被锁定造成的。

此类问题的常用方法是什么?

  • 有没有办法强制AJAX请求异步工作?
  • 我可以阻止PHP锁定会话吗?
  • 我应该通过cron使用单独的过程来解决后台工作吗?

谢谢!

注意:这个项目是使用symfony框架构建的。

AJAX使用jQuery

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

1 个答案:

答案 0 :(得分:2)

如果您在任何给定的AJAX请求期间使用会话 ,它们将按请求顺序有效地执行。这是由于在操作系统级别锁定会话数据文件。使这些请求异步的关键是尽快关闭(或永不启动)会话。

您可以使用session_write_closedocs)尽快关闭会话。我想为此使用几个辅助函数,下面的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();
}

......但这仍然容易受到竞争条件的影响。