【问题标题】:send two ajax request at the same time in symfony在 symfony 中同时发送两个 ajax 请求
【发布时间】:2012-03-30 18:05:56
【问题描述】:

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

例如

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

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'
});

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

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

【问题讨论】:

    标签: php ajax symfony1


    【解决方案1】:

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

    您的情况如下:

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

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

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

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

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

    【讨论】:

    • 是的,事实上我注意到 getUser()->shutdown() 也不足以关闭我的会话,我必须在之后添加一个 session_write_close()。你可以试试这个,但要确保之后你不需要访问会话中的任何内容。
    【解决方案2】:

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

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

    ?

    【讨论】:

    • 相同的结果,因为它默认为 async: true
    猜你喜欢
    • 2013-01-21
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多