7


多くの 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: 自分の質問にすぐに答えるという評判がないので、ここに答えがあります

4

2 に答える 2

7

私の場合、関数:

session_write_close();

私の問題を解決しました

次のプログラムがあります。 ajax.phpという 1 つの ajax ファイルを繰り返し呼び出すメイン ページです。「n」秒ごとに呼び出されます。

そして、私のフォームには、ajax (** reporte.php**) を介して呼び出されるレポートを返すボタンがあります。これは、ユーザーの要求 (クリック) によってのみ呼び出され、結果を生成するのに 1 分かかる場合があります。

ほとんどの場合、ajax.php の実行には 20 ミリ秒かかりますが、report.phpが実行されている場合、reporte.php がタスクを完了するまで ajax.php はフリーズします。そして最悪の場合、ajax.php がスタックされる可能性があります。

report.php (前)

<?php
// Some PHP Code goes here.
// The rest of the PHP code (mostly, the slow part of the process).
?>

report.php (修正後)

<?php
// Some PHP Code goes here.  (ideal if it is the fast part).
session_write_close(); // fix for concurrent ajax
// The rest of the PHP code (mostly, the slow part of the process).
?>

ソリューションの前 (Firefox の firebug プラグインのスクリーンショット): 前

解決後 後

ソリューションの前に、reporte.php と ajax.php の両方がまだロードされていることを確認してください (また、ajax はいくつかの呼び出しでスタックされています)。そして、ソリューションの後、連続するすべての ajax 呼び出しが既に読み込まれている間に、reporte.php が読み込まれます。

session_write_close() 関数の後で、セッション関数と値を使用することはできない (または推奨される) ことに注意してください。

于 2012-12-13T20:42:26.447 に答える
-2

HTTP リクエストは互いに独立しています。定義上、HTTP プロトコルはステートレスです。実行するすべて$.get()が完全に別個の新しい http 要求であるため、4 つの HTTP 要求、4 つの別個のsleep()呼び出し、およびサーバーからの 4 つの別個の出力が発生します。

于 2012-04-10T19:01:40.313 に答える