3

TL;博士。无需先涉足 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.ini 的数字。

铬合金:

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

火狐/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 会给我重复的值?

更新

真正可疑的是,每个数字的重复数完全等于同时进行的 ajax 调用的数量。永远不会更少,永远不会更多,但正是如此。如果我同时运行 6 个 ajax 调用,它们都会得到相同的数量。如果这是一个时间问题,它就不会那么一致,特别是因为我抵消了彼此不同的 ajax 调用。这对我来说意味着这是一个 javascript 问题,不一定只是一个 php 问题,因为它以前出现过。

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

4

1 回答 1

5

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

$.ajax({
    url: URL,
    cache: false,
    statusCode: {
...
于 2013-03-11T10:45:53.340 回答