2013-05-29 9 views
11

私は現在、巨大なデータベースを持つCRMシステムに取り組んでいます。 ユーザーが顧客を検索したい場合は、ajax検索を使用できます。検索フィールドで何かを変更するたびに、通話が保留されている間、古い通話はキャンセルされ、新しい通話がサーバーに送信されます。 私の問題は、サーバー側のPHPプロセスが稼働し続けていることです。したがって、ユーザーがアドレスの入力を開始すると、いくつかの要求が開始され、取り消され、サーバーは応答するためにより多くの時間を必要とします。ajax呼び出しがキャンセルされたときにPHPプロセスをキャンセルするにはどうすればよいですか?

ajaxコールがキャンセルされたときに、実行中のPHPプロセスをキャンセルすることはできますか? または、同じユーザーからの検索要求が実行されているかどうかを検出し、新しいユーザーを開始する前にキャンセルするかどうかを検出するために、サーバー側で解決策がありますか?

ご回答いただきありがとうございます。

+1

あなたは数字の文字を検索ボックスのフルにする必要があります。また、検索ボックスやタイプにjQuery ajaxを使って検索する場合は、数字の文字数を制限できます。 – Rafee

+1

ユーザーが「検索」ボタンを押すか、Enterキーを押すだけで検索を開始する必要があります。 –

+3

検索ルックアップを実行するのに時間がかかる場合は、複数回実行しているときにプロセスがサーバーに遅れている場合、実行中のプロセスを強制終了するのではなく、検索ルーチンを最適化する必要があります。検索列にキーを置くと、結果を取得するのに1秒に数分かかるでしょう。 – Anigel

答えて

0

私が今考え出した解決策が1つあります。

AJAXリクエストがAjaxのコールバックが(成功またはエラー)と呼ばれた後、あなたはtrue

にこの値を設定することができ送るときあなたはfalseにisPendingを設定することができブールisPendingを設定することができます。

さらに、文字列変数searchContentを使用し、テキストが変更されたときにこの変数を更新することができます。したがって、Ajax Callが保留中でなく、searchContentにコンテンツがある場合は、別のajax呼び出しを送信できます。

最良の選択肢は、既に書かれた解決策、例えばhttp://jqueryui.com/autocomplete/を使用することです。これは非常に簡単で、キャッシュシステムに組み込まれていても非常にうまく動作します。

+0

これはサーバーに複数のリクエストを送信するため、私の問題は解決しません。したがって、新しいデータが登録されてもサーバが処理を続行しないように設定されるまで、Ajaxリクエストはキャンセルされます。 –

3

あなたのサーバー側のPHPがリクエストを検出するために何かを出力しなければなりません。しかし、長いSQLクエリを実行する可能性が高いので、何も出力することはできません。

しかし、まだあなたがセッションにあなたの接続IDを保存し、接続を殺すことができる、それが検出されています場合:

  1. オープンセッション
  2. オープンSQL接続
  3. search_connection_idがセッションに設定されている場合は、殺します接続
  4. search_connection_idとしてセッションに保存する接続IDを確認する
  5. セッションを閉じる - 重要な場合は、手順1で次のリクエストがブロックされます
  6. クエリデータベース
  7. 接続が切断された場合は、ステップ3であなたを殺す別の検索だ、出
  8. オープンセッション、search_connection_id
  9. を削除し、応答を送信し、近​​くにSQL接続
1

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

私はAnigelのような検索クエリを再設計しました。圧倒的な結果が出ました。

しかし私は私の質問に対する正解はマレクとハリクリさんのViswanatharの答えだと思います。どちらも私が求めたことをするはずです。

関連する問題