【问题标题】:CakePHP Concurrent AJAX Requests BlockingCakePHP 并发 AJAX 请求阻塞
【发布时间】:2011-01-20 12:33:57
【问题描述】:

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

问题

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

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

一旦这个原始 AJAX 请求完成,次要进度 AJAX 请求就会按预期返回。

似乎进度请求的执行正在排队等待第一个 AJAX 调用完成,因为返回的进度是 100%。

我的尝试

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

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

有什么想法吗?

所以问题似乎是由 CakePHP 引起的 - 有没有人在自己的 CakePHP 应用程序中遇到过这种情况?

谢谢!

【问题讨论】:

    标签: ajax cakephp concurrency request blocking


    【解决方案1】:

    会话处理设置为 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();
    

    只知道会话现在已关闭,因此不再可以选择写入会话。

    【讨论】:

      【解决方案2】:

      为了澄清一下,您使用的是内置的 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 的选项)。

      【讨论】:

      • 您好,我正在使用 Prototype,但我认为 JS 框架不是问题所在。我已经能够通过 Prototype 实现对非 CakePHP 服务器的并发 AJAX 调用。所以看起来“阻塞”发生在 CakePHP 的某个地方。
      • 您好,我找到了问题所在。我的 CakePHP 应用程序使用基于文件的会话,这意味着核心 CakePHP 文件在任何给定时间只能由单个请求访问。切换到内存缓存会话解决了这个问题。
      • 会话阻塞多个请求?没看到 :) 很高兴你发现了问题。
      • 你们能详细说明一下这个问题吗?我似乎也有,但我的服务器上没有内存缓存。有什么想法吗?
      猜你喜欢
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      • 2011-07-07
      相关资源
      最近更新 更多