多くの ajax 呼び出しを受け取る PHP アプリケーションがあります。
2 つ以上の呼び出しが同時に発生すると、それらが同時に実行されない場合、最初の呼び出しを停止する必要があるため、2 番目の呼び出しが実行されることに気付きました。
この問題を修正するための小さなテストを作成しました。私は次のようなhtmlを持っています:
<html>
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
</head>
<body>
<a href="test.php">Test</a>
<button>Click</button>
<button>Click</button>
<button>Click</button>
<button>Click</button>
<script type="text/javascript">
$('button').click(function() {
$.get("test.php");
});
</script>
</body>
</html>
test.php には以下が含まれます。
<?php
sleep(2);
echo 'Test';
?>
したがって、開発者ツール (または firebug) コンソールで $('button').click() を実行した後、リクエストは同時に発生しますが、4 つすべてが同時に返されるのではなく、最後のリクエストの 2 秒後に回答が返されます ( 2秒後)。
さて、他のブラウザで開いてみたところ、このファイルと同時に動作し、同時に実行されました。つまり、これを chrome で実行し、firefox でタブでページを開くと、2 秒で「テスト」が表示されますが、chrome ajax リクエストからの応答は、最後のリクエストが終了してから 2 秒後に来るため、他のブラウザーのリクエストは最初のリクエストには影響しません。 1 回の呼び出し (これはセッションの問題であることが証明されますが、以下を参照してください)。
test.php の複数のタブを開くと、同じことが起こります。
私はセッションを memcache に変更しようとしました - 人々は、他の質問で、セッションがロックされている可能性があると言いました。それは非常に理にかなっていますが、ファイルからmemcacheに変更した後でも問題は解決しません(スクリプトにはセッションがなく、session_autostartがオフになっています)
。しばらくしてから初めて、Apacheの構成の問題について本当に心配しています、スクリプトを実行すると、4 つの ajax 呼び出しがすべて同時に実行されます。DoS 保護などを考えています。
とにかく、どんな助けでも大歓迎です!
わかりました、問題を解決しました。
結局、これはセッション ロックの問題でした。問題は、memcached もセッションをロックすることです!
memcached.ini にロック フラグを持つ php_memcached 2.0.1 をインストールし、そのバージョンを使用する必要がありました。問題を解決しました。
リクエストが同じ URL に対するものである場合 (上記の例では、test.php を 4 回使用しました) でも、一度に 1 つずつ実行されます。リソースを同時に何度も要求するのはあまり意味がないので、それは正しい動作だと確信しています。私の例をtest1.php、test2.phpなどをリクエストするように変更したところ、うまくいきました。クエリ文字列が変更された場合にも機能します。
ご協力いただきありがとうございます!
PS: 自分の質問にすぐに答えるという評判がないので、ここに答えがあります