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

Sam*_*rag 0 php ajax symfony1

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

例如

$.ajax
({
    type: "POST",
    url: 'ajax.php'
});
$.ajax
({
    type: "POST",
    url: 'ajax2.php'
});
Run Code Online (Sandbox Code Playgroud)

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

萤火虫屏幕

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'
});
Run Code Online (Sandbox Code Playgroud)

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

萤火虫屏幕

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

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

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

Mae*_*lyn 5

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

你的情况如下:

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

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

在纯 PHP 中,您可以使用session_write_close(). Symfony 有包装会话功能的 sfUser 类,你需要调用它的shutdown()方法。

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

更详细的解释,请阅读PHP Session write locks and how to deal with it in symfony

  • 是的,事实上我注意到 getUser()->shutdown() 也不足以为我关闭会话,我必须在之后添加 session_write_close() 。您可以尝试此操作,但请确保之后不需要访问会话中的任何内容。 (2认同)