1

サーバーでのajax呼び出しに時間がかかりすぎると、アプリケーションに問題が発生します。サーバー側で完了するまで、ユーザーからの他のすべてのクエリをキューに入れます(クライアント側で呼び出しをキャンセルしても効果がなく、ユーザーはまだ待たなければならない)。

ここに私のテストケースがあります:

<script type="text/javascript" src="jquery-1.4.1.min.js"></script>

<a href="another-page.php">Go to another page on the same server</a>


<script type="text/javascript">
    url = 'http://localserver/some-very-long-complex-query';
    $.get(url);
</script>

そのため、get が起動されてリンクをクリックすると、サーバーは最初の呼び出しの処理を終了してから別のページに移動します。私の問題は、この動作を避けたいということです。

私は LAMP サーバーを使用しており、ユーザーが connection_aborted() のような関数を使用してクエリを中止したことをサーバーに通知する方法を探しています。それでよいと思いますか? また、この PHP スクリプトの最も長い部分は MySQL クエリであることもわかっているので、connection_aborted() がユーザーが呼び出しをキャンセルしたことを検出できることがわかっていても、MySQL クエリ中にこれを確認する必要があります... PHPがこの種の「イベント」を処理できるかどうかはよくわかりません.

ですから、もっと良いアイデアがあれば、それを聞くのが待ちきれません。

ありがとうございました。


更新 : さらに調査した結果、問題は Symfony フレームワークでのみ発生することがわかりました (正確には省略しましたが、悪いことです)。Ajax 呼び出しは、他の将来の呼び出しをロックしているようです。コントローラーかルーティングシステムに関係しているのかもしれませんが、調べています。

また、この問題に関心のある方のために、私の新しいテスト ケースを示します。-ajax クエリ用の jquery 1.4。

これが私のactions.class.phpです(私の独自のモジュール内):

class defaultActions extends sfActions
{
  public function executeIndex(sfWebRequest $request)
  {
    //Do nothing
  }

  public function executeNewpage()
  {
    //Do also nothing
  }

  public function executeWaitingaction(){
    // Wait
    sleep(30);
    return false;
  }

}

ここに私のindexSuccess.phpテンプレートファイルがあります:

<script type="text/javascript" src="jquery-1.4.1.min.js"></script>

<a href="<?php echo url_for('default/newpage');?>">Go to another symfony action</a>


<script type="text/javascript">
    url = '<?php echo url_for('default/waitingaction');?>';
    $.get(url);
</script>

新しいページ テンプレートについては、あまり関係ありません...しかし、これにより、実際のアプリケーションで発生したロックの問題を再現できます。

他の誰かが同じ問題を抱えていますか?

ありがとう。

4

3 に答える 3

0

こんにちは私は同じようなスクリプトで同じ問題を抱えています。

Jqueryスクリプト

$.ajax({url :'/map/test1',  async:true ,complete: function(){alert("test1")}});
$.ajax({url :'/map/test2',  async:true ,complete: function(){alert("test2")}});

symfony php

public function executeTest1()
{
 $this->getUser()->shutdown();
 usleep(10000000);
 return $this->renderText("Oki");
}

public function executeTest2()
{
 return $this->renderText("Oki");
}

ページが読み込まれると、test1 requeteはusleep(10000000)の終了を待機していますが、test2はtest1の実行の終了を待機しています。

私はsymfonyでこの問題を解決しました。

于 2010-03-16T10:54:57.053 に答える
0

さて、私は最終的にアプリケーションが待機している理由を理解しました。PHPのセッションシステムは、セッションが閉じられるまで他のクエリをキューに入れます。したがって、私のajax呼び出しはセッションを使用する必要はありません。アクションに時間がかかりすぎる前に、$ this-> getUser()-> shutdown()を実行します。

ここにすべての詳細:http://garethmccumskey.blogspot.com/2009/10/php-session-write-locking-and-how-to.html

于 2010-02-26T17:21:07.427 に答える
0

サーバー上で中止する必要がありますか、それともユーザーをただちにリダイレクトしたいだけですか?

おそらくAJAXQueueのようなものがあなたのために働くでしょうか? (クライアント側のコードに明らかに必要な変更を加えて..)

于 2010-02-26T00:19:11.957 に答える