gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:31:03 26 4
gpt4 key购买 nike

我有几个耗时的数据库查询要运行。每个都被构建为从网页上选择的选项触发。我认为我通过几个 AJAX 请求 来完成工作是相当狡猾的。

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

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

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

我有read这可能是由 PHP session 被锁定引起的。

对于此类问题通常的处理方法是什么?

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

谢谢!

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

AJAX 使用 jQuery

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

最佳答案

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

您可以使用 session_write_close ( docs ) 尽快关闭 session 。我喜欢为此使用几个辅助函数,下面的 set_session_var 函数将打开 session ,写入 var,然后关闭 session - 尽快进入和退出。当页面加载时,您可以调用 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 的更改将对另一个请求不可见,直到它重建值。您可以通过在关键使用之前立即“重建”$_SESSION 变量来帮助避免这种情况:

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

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

关于php - 通过 AJAX 处理大型数据集不会带来速度优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7323412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com