CakePHP并发AJAX请求阻塞

时间:2011-01-20 12:33:58

标签: ajax cakephp concurrency request blocking

我正在使用CakePHP在一个应用程序上,该应用程序必须通过单个AJAX调用运行一个耗时的任务,并且辅助定期AJAX调用检查任务的进度。

问题

虽然耗时的任务(大约需要30秒)通过它向CakePHP的AJAX请求运行,但辅助进度AJAX请求似乎无法“阻塞”。

为了澄清,辅助进度AJAX请求不会返回任何错误,它只是在原始耗时的请求完成之前不会返回任何响应。

一旦原始AJAX请求完成,辅助进度AJAX请求将按预期返回。

似乎执行进度请求正在排队,直到第一个AJAX调用结束,因为返回的进度是100%。

我尝试过什么

我尝试了多种建议的解决方案,包括:

  • 在core.php中将会话处理程序更改为'cake' - 无需修复
  • 在core.php中将配置安全级别设置为“中” - 无需修复
  • 在core.php中禁用用户代理检查 - 无需修复
  • 在同一台服务器上测试多个并发AJAX调用到普通PHP脚本 - 按预期工作

任何想法?

所以似乎问题是由CakePHP引起的 - 有没有人在他们自己的CakePHP应用程序中体验过这个?

谢谢!

2 个答案:

答案 0 :(得分:3)

会话处理设置为php中的文件

来自php.ini

[Session]
; Handler used to store/retrieve data.
; http://php.net/session.save-handler
session.save_handler = files

这可以防止php为每个用户运行多个会话实例。

为了防止这种情况在你的PHP代码中运行:

session_write_close();

只知道会话现已关闭,因此写入会话不再是一个选项。

答案 1 :(得分:0)

为了澄清一下,你是使用内置的AJAX助手(在原型上)还是使用像jQuery这样的外部库?

通常,选择的javascript库有{async: true}可用于强制并发。见这个例子:

$.ajax({
    type: 'GET',
    url: '/fetch.php',
    async: true,
    success: function(data, status) {
        $('#status').html(status);
    }
});

对于内置的CakePHP AJAX助手,此选项应该可以解决问题:$options['type']。更多信息here。请注意,从版本1.3开始不推荐使用AJAX帮助程序,jsHelper应该能够接管,例如,请参阅request()方法here(也有一个名为async的选项)。 / p>