gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:47:18 24 4
gpt4 key购买 nike

长话短说;博士。有趣的部分无需先浏览 JS:我正在递增 session 计数器,但不同的请求看到相同的值。这只是 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 的数字。

Chrome:

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 中,每个请求都会获得一个新的计数器值。显然这是客户端问题。对这些信息做更多的研究会发现很多关于无效请求执行重定向导致 session 终止的事情。特别是 favicon.ico 的常见场景。我的所有请求都成功了,我的 favicon.ico 也成功加载了。

最佳答案

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

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

关于PHP/AJAX 并发 session 仅在 Chrome 中行为不端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15317792/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com