- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
长话短说;博士。有趣的部分无需先浏览 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/
我是一名优秀的程序员,十分优秀!