最近、クロム経由で mysql クエリを実行し、閉じました。ブラウザは、停止ボタンを使用してPHPスクリプトをどのように正確に停止しますか? PHP はサーバー側の言語であり、クライアントからは制御できないと思っていました。
*UPDATE* については認識してSHOW PROCESSLIST
いますが、これは実行中のスレッドのみを示しています。実行されたクエリを詳細に表示するために使用できる SQL コマンドはありますか?
クライアント (Chrome) は、サーバー上でのスクリプト (PHP) の実行とは関係がないため、データベース プロセス (MySQL クエリ) を制御することはできません。
サーバー プロセス リストを見て、一般的に何が起こっているか (Apache プロセス) を確認します。
またはさらに良い: SHOW PROCESSLIST;
MySQL コンソールで使用して、実行時間の長いクエリを見つけます。を使用して終了することができKILL ###ID_OF_QUERY###;
ます。
いいえ、開けておく必要はありません。走っている車から降りると、車は止まりますか?いいえ。
申し訳ありませんが、それは少し気取ってしまいましたが、意図したものでもありませんでした.
あなたの場合はChromeのブラウザは、実際には実際のコードを実行していません。サーバーは。したがって、命令が実行されると、リクエストがサーバーに送信されるため、ブラウザを閉じる必要はありません。
時間のかかる PHP スクリプトを実行するには、2 つの関数が不可欠です。ブラウザとは関係ありません(他のユーザーがすでに指摘しているように)
ignore_user_abortとset_time_limitをルックアップ
ブラウザを閉じてもスクリプトは実行され続けます。応答を送信し、php プロセスを続行できるようにすることで、ブラウザを解放できます。
ignore_user_abort(true);
$response = "Processing!";
header("Connection: close");
header("Content-Length: " . mb_strlen($response));
echo $response;
flush();
// Insert your lengthy query here
さあ、これはPHP 101です。マニュアルから引用:
クライアントの切断によってスクリプトが中止されるようにするかどうかを決定できます。出力を受信するリモート ブラウザがない場合でも、スクリプトを常に最後まで実行できると便利な場合があります。ただし、デフォルトの動作では、リモート クライアントが切断されるとスクリプトが中止されます。
接続フラグがABORTEDに設定された後、次のティック可能なイベントで実行が停止します。これは、PHP が出力をクライアントにフラッシュしようとしたときに検出されます。
現在の MySQL クエリは実行を終了します (PHP が制御する次のイベントは、クエリが完了するまで発生しないため) が、明示的に を設定しない限り、スクリプトはそれを過ぎませんignore_user_abort
。コードを書くときは、常にこれを考慮することが重要です。
これには2つの方法があります
ignore_user_abort
しますtrue
他の人が言ったように、show processlistを使用してmysqlサーバーで何が実行されているかを確認できます。
時間がかかる単一のクエリの場合は、ブラウザを閉じた後も実行を続ける可能性が高くなります。PHPはリクエストをデータベースに送信し、実際にはリクエストが完了するのを待っています。ブラウザは、WebサーバーがそのURLにあるページ/リソースの構築を完了するのを待っています。
したがって、リクエストは次のとおりです。ブラウザ<-> Webサーバー(<-> php)<-> mysql理想的な世界では、ユーザーがリクエストをキャンセルすると、すべてがうまく片付けられますが、私の経験では悲しいことにそうではありませんチェーンの 1 つが待機しないことを決定した場合、それが待機しているプロセスは、応答を返送しようとして失敗するまで、必ずしも認識しません。