サーバーでの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>
新しいページ テンプレートについては、あまり関係ありません...しかし、これにより、実際のアプリケーションで発生したロックの問題を再現できます。
他の誰かが同じ問題を抱えていますか?
ありがとう。