通过 AJAX 处理大型数据集不会带来速度优势
Posted
技术标签:
【中文标题】通过 AJAX 处理大型数据集不会带来速度优势【英文标题】:Processing large data sets via AJAX brings no speed benefits 【发布时间】:2011-11-11 12:16:49 【问题描述】:我有几个耗时的数据库查询要运行。每个都被构建为从网页上选择的选项触发。我认为通过几个 AJAX 请求来启动工作是相当狡猾的。
我假设多个请求将被拆分到多个进程/线程上,这意味着用户可以相对快速地完成工作。
但是,请求似乎是串行处理的,这意味着用户感觉不到速度优势。
更糟糕的是,更新页面的 AJAX 请求也会排队等待,这意味着它们在之前的请求全部完成之前无法响应。
我有read,这可能是由于 php 会话被锁定造成的。
这类问题的常用方法是什么?
有没有办法强制 AJAX 请求异步工作? 我可以阻止 PHP 锁定会话吗? 我应该通过 cron 使用单独的进程来触发后台工作吗?谢谢!
NB 这个项目是使用 symfony 框架构建的。
AJAX 使用 jQuery
// Get the content
$.get('/ajax/itemInformation/slug/'+slug, function(data)
$('#modal-more-information').html(data);
);
【问题讨论】:
你能显示启动AJAX请求的代码吗?您是否设置了“同步”标志? 问题可能出在 SQL 上。您可能必须包含 SQL 如果您还没有从链接到的原始文章中偶然发现它,this 有一些很好的信息和说明。 【参考方案1】:如果您在任何给定的 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();
...但这仍然容易受到竞争条件的影响。
【讨论】:
谢谢!我将查看 symfony 文档,看看我是否可以禁用特定请求的会话。 希望对您有所帮助!不过,请务必查看我添加的有关竞争条件的内容... :) 谢谢,那应该没问题。这些请求只需要读取会话信息即可找出当前用户。他们不需要写回任何东西。 因为我的请求只是AJAX,所以关闭会话是没有问题的。效果也很好。即使在处理其他请求时,页面也会返回 AJAX 数据。以上是关于通过 AJAX 处理大型数据集不会带来速度优势的主要内容,如果未能解决你的问题,请参考以下文章