TL;DR。最初にJSを通り抜ける必要のない興味深い部分:セッションカウンターをインクリメントしていますが、異なるリクエストに同じ値が表示されています。これはChromeの問題です。FirefoxとInternetExplorerでは、すべてのリクエストに一意の値が表示されます。
204 HTTPコードを取得するまで、(データを処理するために)Webページに何度もアクセスしようとしています。成功したときにajax呼び出し自体を実行し、204で停止することにより、一度に1つのajax呼び出しを実行できます。
私はそれらをより速くやりたいので、私は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
なぜクロムは私に繰り返しの値を与えるのですか?
アップデート
本当に厄介なのは、各番号の重複の数が、同時に行われるajax呼び出しの数とまったく同じであるということです。決して少なくはなく、決して多くはありませんが、正確に。6つのajax呼び出しを同時に実行すると、それらはすべて同じ量になります。これがタイミングの問題である場合、特に異なるajax呼び出しを互いにオフセットしているため、それほど一貫性はありません。これは、これがjavascriptの問題であり、以前に発生したphpの問題だけではないことを意味します。
アップデートの巨大なゲームチェンジャー これはChromeの問題です。FirefoxやInternetExplorerでは発生しません。FirefoxとIEでは、すべてのリクエストが新しいカウンターの値を取得します。明らかに、これはクライアント側の問題です。この情報を使用してもう少し調査を行うと、セッションを強制終了するリダイレクトを実行する無効なリクエストについて多くのことがわかります。具体的には、favicon.icoの一般的なシナリオです。すべてのリクエストが成功し、favicon.icoも正常に読み込まれます。