在symfony中同时发送两个ajax请求


send two ajax request at the same time in symfony

当我使用JQuery一起发送两个ajax请求时。。的响应

例如

$.ajax
({
    type: "POST",
    url: 'ajax.php'
});
$.ajax
({
    type: "POST",
    url: 'ajax2.php'
});

ajax.php、ajax2.php这两个文件包含一个用于循环的伪文件,耗时约5秒

FireBug屏幕

POST localhost/ajax.php 200 OK 4.77s
POST localhost/ajax.php 200 OK 4.37s

在这里,每个请求大约需要5秒才能执行。。。。。

当我在symfony做同样的例子时,我得到了不同的结果

$.ajax
({
    type: "POST",
    url: 'module/action1'
});
$.ajax
({
    type: "POST",
    url: 'module/action2'
});

动作1、动作2是两个动作,只包含一个用于循环的伪动作,耗时约5秒。

FireBug屏幕

POST localhost/web/frontend_dev.php/module/action1 200 OK 4.47s

POST localhost/web/frontend_dev.php/module/action2 200 OK 9.87s

请注意在第一个请求完成后执行的第二个请求,我不知道为什么会发生

当一个请求进来,并且它试图启动一个会话时,php将检查此时是否正在使用同一个会话。如果是,则新请求必须等待,直到另一个请求完成,或者释放会话锁定。

您的情况如下:

  • 第一个请求到达,锁定会话
  • 第二个reauest到达,试图锁定会话,必须等待
  • [5秒睡眠]
  • 第一个请求完成,释放锁定
  • 第二个请求启动,实现会话锁定
  • [5秒睡眠]
  • 第二个请求完成

默认情况下,symfony会在每个请求开始时启动会话。

在纯PHP中,您可以使用session_write_close()释放会话文件的锁。Symfony有sfUser类,它封装了会话功能性,您需要调用它的shutdown()方法。

请注意,如果您稍后在该请求中修改任何会话数据,它将不会被保存。

要获得更详细的解释,请阅读PHP会话写锁定以及如何在symfony中处理它。

symfony可能对ajax请求做了一些事情。如果你尝试会发生什么:

$.ajax
({
    type: "POST",
    url: 'module/action1',
    async: true
});
$.ajax
({
    type: "POST",
    url: 'module/action2',
    async: true
});