小编典典

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

ajax

当我使用JQuery一起发送两个ajax请求时,响应一起出现

例如

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

ajax.php,ajax2.php是两个文件,其中包含一个虚拟的for循环大约需要5秒钟。

萤火虫萤幕

POST本地主机/ajax.php 200 OK 4.77s
POST本地主机/ajax.php 200 OK 4.37s

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

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

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

action1,action2是两个动作,仅包含一个虚拟的for循环大约需要5秒钟。

萤火虫萤幕

POST本地主机/web/frontend_dev.php/module/action1 200 OK 4.47s

POST本地主机/web/frontend_dev.php/module/action2 200 OK 9.87s

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


阅读 259

收藏
2020-07-26

共1个答案

小编典典

当有请求进入并尝试启动会话时,php将检查当时是否正在使用同一会话。如果是这样,则新请求必须等到另一个请求完成或释放会话锁。

您的情况如下:

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

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

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

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

有关更详细的说明,请阅读PHP
Session编写锁定以及如何在symfony中处理锁定

2020-07-26