PHPスクリプトを終了した後、MySQLクエリを強制終了または停止します
統計サーバーを稼働させていますが、実行されるクエリの量が原因で非常に遅くなることがあります。
私たちのマーケティングチームは、それを主要な統計ツールとして使用しています。チームの一部の人々は、スクリプトが終了する前に(ブラウザーまたはタブを閉じることによって)スクリプトを終了することがあります。その間、SQLクエリは引き続き実行されます。
誰かがこのスクリプトを閉じたり離れたりしたときに、PHPスクリプトの関連するクエリを強制終了または停止するにはどうすればよいですか?
もちろん、これらのクエリを手動で強制終了するのではなく(すでに実行しています)、スクリプトを終了するとすぐに自動的に強制終了します。
私たちの統計スクリプトのほとんどは、それらの中で最も重いものに対して毎晩行われる事前計算に基づいており、これらのスクリプトは私たちにとって問題ではありません。他の人については、事前計算をまだ実装しておらず、実行する前に孤立したクエリを強制終了できるようにしたかったのです。
答え :
解決策:
接続処理メカニズムを使用して、ブラウザからサーバーへの接続がまだ開いているかどうかを確認し、適切に対応できます。
ただし、これまでに開始したSQLクエリはすべて完了するまで実行されることに注意してください。複雑な場合は、時間がかかる可能性があり、帯域内で終了する方法はありません。 dどのスレッドが何を実行しているかを監視し、放棄されたスレッドを定期的に収集する必要があります。
答え :
解決策:
長すぎるクエリをkillできるようにする必要がある場合があります。 OSでこれを実行したい場合は、これを実行できます。MySQLはこれらすべてを子プロセスで実行するため、かなり安全です。 Unixでは、これは ps
とkill
です。
MysqlAdmin を使用してこれを行うこともでき、基本的にOS間で同じである必要があります。実行中のプロセスのリストが表示されます:
$ mysqladmin processlist # password if necessary
+----+------+
次に、 mysqladmin kill
を検索して削除します。
編集
わかりました。ブラウザが閉じていることを検出する場合は、いくつかのアプローチがあります。
- PHPの接続処理を確認してください。ユーザーがブラウザを閉じたときに呼び出されるハンドルを登録できるようです。
- ハンドラーが呼び出されない場合は、単に「クエリを実行しています...」というインタースティシャルページを呼び出すと、そのページのレンダリングがループ状態になり、クエリが完了するのを待つか、終了する接続。クエリが完了したら、「結果」ページにリダイレクトし、接続がダウンした場合は、手動でクエリをkillします(上記を参照)。
- これらのアプローチが役に立たないことが判明した場合は、別のオプションがあります。ブラウザは、最も近いブラウザで起動されるJavascriptの「アンロード時」イベントを提供します。そこからの簡単なAjax投稿は、長時間実行されるクエリをオフにする可能性があります。
(割り当て:すべてのアプローチの長所と短所について話し合います。)
これらのどれも私を美しく印象づけるものではありませんが、いくつかの作業でそれらを機能させることができます。正直なところ、この問題が発生したときは、プロセスリストを維持し、誤ったクエリのように見えるものをkill作成しました。
答え :
解決策:
残念ながら、ブラウザの閉じるボタンを押しているだけでは、できることはあまりありません。すでにリストされているのは、セッションをチェックするいくつかの組み込み関数です。たぶん、最も頻繁に使用されるクエリをキャッシュしてみてください。 Googleの「キャッシュphpmysql」。
これが機能しない場合は、AJAXを使用してビルドでき、クエリが終了するたびに、サーバーはユーザーにリクエストの進行状況を最新の状態に保つメッセージを送り返します。これにより、セッションをあきらめる人の数が減る可能性があります。
答え :
解決策:
(私が思うに)最善の方法は、使用後すぐに接続を閉じることです。 また、wait_timeoutセッション変数を設定することもできます(たとえば、20秒に短縮)。この場合、接続は自動的に閉じられます。
答え :
解決策:
私の同僚の何人かと一緒に、次のアイデアを思いつきました:
- MySQL接続が確立されたら、SQLでconnection_id()を取得します- MySQLのCONNECTION_ID()ドキュメント
- 変数に保存する
- ユーザーがページを終了したら(ページを終了するか、別のページを読み込むなど)、前の変数に基づいてKILLクエリをトリガーするjsイベントを発行します
これは数時間以内にテストされます。動作することが確認でき次第、ここで更新します。
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。