14

私は現在、巨大なデータベースを備えた CRM システムに取り組んでいます。ユーザーが顧客を検索したい場合は、ajax 検索を使用できます。検索フィールドで何かを変更するたびに、通話が保留中の場合、古い通話はキャンセルされ、新しい通話がサーバーに送信されます。私の問題は、サーバー側のphpプロセスが引き続き実行されることです。そのため、ユーザーがアドレスの入力を開始すると、いくつかの要求が開始されてキャンセルされ、サーバーが応答するのにますます時間がかかります。

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

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

4

4 に答える 4

4

サーバー側の php は、リクエストがキャンセルされたことを検出するために何かを出力する必要があります。しかし、長い SQL クエリを実行している可能性が高いため、何も出力できません。

ただし、接続 ID をセッションに保存し、検出された場合は接続を強制終了できます。

  1. セッションを開く
  2. SQL接続を開く
  3. セッションで search_connection_id が設定されている場合は、接続を切断します
  4. 接続 ID を検索し、セッションに search_connection_id として保存します
  5. セッションを閉じます - 重要です。そうしないと、ステップ 1 で次のリクエストがブロックされます
  6. クエリ データベース
  7. 接続が切断された場合は、別の検索でステップ 3 で終了します。終了します。
  8. セッションを開き、search_connection_id を削除します
  9. 応答を送信し、SQL 接続を閉じます
于 2013-05-29T10:22:36.503 に答える
3

ignore_user_abort() をお探しですか?

http://www.php.net/manual/en/function.ignore-user-abort.php

于 2013-05-29T11:49:38.150 に答える
0

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

ajaxリクエストが送信されるときにブールisPending値を設定できます。この値をに設定できますtrue

ajax コールバックが呼び出された後 (成功またはエラー) isPending、false に設定できます。

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

最良のオプションは、たとえば、既に作成されたソリューションを使用することです。

于 2013-05-29T09:58:55.480 に答える