微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP / AJAX并发会话仅在Chrome中行为不端

TL; DR.这个有趣的部分首先不必涉及JS:我正在递增一个会话计数器,但是不同的请求看到了相同的值.这只是Chrome中的一个问题.在Firefox和Internet Explorer中,每个请求都会看到一个唯一值.

我试图打一个网页(处理数据)很多次,直到我得到一个204 HTTP代码.我可以一次做一个ajax调用,让ajax调用成功,然后停止204.

由于我想更快地完成它们,我在js中有多个“线程”都在做.我的意思是创建了多个相同的ajax调用,并且当它们完成时它们都会启动另一个,停止在204代码上.

我的相关js看起来像这样:

$(function() {
    // "thread" id
    var counter = 1;

    // run 3 "threads"
    generateThreads(3);

    function generateThreads(num) {
        if (num <= 0)
            return;

        doNextItem(counter++);

        // Pause before starting the next thread
        setTimeout(function() {
                generateThreads(num-1);
            },
            50);
    }

    function doNextItem(thread) {
        $.ajax({
            url: URL,
            statusCode: {
                200: function(data) {
                    logItem(data, thread);
                    doNextItem(thread); // call itself on the same thread

                },
                204: function(data) {
                    finished(); // done, don't recurse, end the thread
                }
            }
        });
    }
});

然后在PHP中,我正在递增存储在Session中的整数,并在它超过截止时返回204.

if (!isset($_SESSION["nums"]))
{
    $_SESSION["nums"] = 0;
}
else if ($_SESSION["nums"] > 10) {
    http_response_code(204);
    die();
}
echo json_encode(array("num" => $_SESSION["nums"]++));

然后,当我运行它时,奇怪的部分就出现了. javascript中的logItem()只是向控制台打印线程id,然后是PHP中的数字.

铬:

1: 0 
2: 0 
2: 1 
1: 1 
3: 1 
2: 2 
1: 2 
3: 2 
1: 3 
2: 3 
3: 3 
3: 4 
1: 4 
2: 4 
3: 5 
2: 5 
1: 5 
2: 6 
3: 6 
1: 6 
1: 7 
2: 7 
3: 7 
1: 8 
3: 8 
2: 8 
1: 9 
2: 9 
3: 9 
2: 10
1: 10
3: 10

Firefox / IE

1: 0
2: 1
3: 2
1: 3
2: 4
3: 5
1: 6
2: 7
3: 8
1: 9
2: 10
3: 11
1: 12
2: 13
3: 14
1: 15
2: 16 
3: 17 
1: 18  
2: 19 
3: 20

为什么chrome会给我重复的值?

UPDATE

真正可疑的是,每个数字的重复数量正好等于同时进行的ajax调用数量.从来没有更少,从来没有更多,但确切.如果我同时运行6个ajax调用,它们都会获得相同的数量.如果这是一个时间问题,它就不会那么一致,特别是因为我相互抵消了不同的ajax调用.这对我来说意味着它是一个javascript问题,不一定只是像以前出现的PHP问题.

巨大的更新游戏更新
这只是Chrome中的一个问题.在Firefox或Internet Explorer中不会发生.在Firefox和IE中,每个请求都获得计数器的新值.显然这是客户端问题.使用此信息进行更多研究会产生很多关于无效请求执行重定向以杀死会话的事情.特别是favicon.ico的常见场景.我的所有请求都会成功,我的favicon.ico也会成功加载.

解决方法:

Chrome正在缓存响应,因为您在短时间内多次发送相同的请求.强制ajax调用不缓存响应应解决您的问题.试试这个:

$.ajax({
    url: URL,
    cache: false,
    statusCode: {
...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐