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

Eli*_*ite 3 javascript php ajax session google-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
                }
            }
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

然后在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"]++));
Run Code Online (Sandbox Code Playgroud)

然后,当我运行它时,奇怪的部分就出现了.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
Run Code Online (Sandbox Code Playgroud)

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

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

UPDATE

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

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

小智 5

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

$.ajax({
    url: URL,
    cache: false,
    statusCode: {
...
Run Code Online (Sandbox Code Playgroud)