現在の位置: ホーム> 最新記事一覧> mysqli :: kill functionを使用する際の接続閉鎖によって引き起こされる例外を回避する方法

mysqli :: kill functionを使用する際の接続閉鎖によって引き起こされる例外を回避する方法

gitbox 2025-06-07

PHPを使用してMySQLデータベースを操作する場合、 MySQLI :: Killメソッドを使用して特定の接続スレッドを終了します。ただし、開発者は使用中に問題に遭遇する可能性があります。Kill ()を呼び出した後、現在の接続は異常に中断されますか?この記事では、その動作の原則を分析し、接続の例外を回避するための正しい方法を提供します。

mysqli :: killとは何ですか

mysqli :: killメソッドの機能は、キルコマンドをmysqlサーバーに送信して、指定されたスレッド(スレッドID)で表される接続を終了することです。基本的な使用法は次のとおりです。

 $mysqli = new mysqli('localhost', 'user', 'password', 'database');
$thread_id = 12345;
$mysqli->kill($thread_id);

ここの$ thread_idは通常、現在の接続自体のスレッドIDではなく、次の方法で取得した他の接続のIDであることに注意してください。

 $thread_id = $mysqli->thread_id;

Kill()自殺しますか?

答えは次のとおりです。いいえ、イニシアチブをとらない限り。

$ mysqli-> kill($ thread_id)$ thread_idを呼び出すと、現在の接続自体のスレッドIDである場合、接続を終了し、現在の接続がすぐに中断されます。後続のデータベース操作は、以下と同様のエラーをトリガーします。

 MySQL server has gone away

例:

 $mysqli = new mysqli('localhost', 'user', 'password', 'database');
$mysqli->kill($mysqli->thread_id); // 自殺操作
$mysqli->query("SELECT 1"); // ここに例外がスローされます

したがって、別のスレッドを終了する場合は、スレッド_IDが別の接続から取られていることを確認してください。

正しい使用シナリオ:他の接続を殺します

長い間応答されていない質問のクリーンアップや、同時接続の数を制御するなど、いくつかのビジネスニーズでは、管理接続からキル操作を実行する必要がある場合があります。この時点で、推奨されるアプローチは、キルを実行するために別の「管理接続」を確立することです。

 // 接続する A:执行任务的接続する
$connA = new mysqli('localhost', 'user', 'password', 'database');
$task_thread_id = $connA->thread_id;

// 接続する B:管理接続する
$connB = new mysqli('localhost', 'admin', 'admin_pass', 'information_schema');
$connB->kill($task_thread_id); // 殺す A 的接続する

この方法により、管理接続が常に正常なままであり、誤動作により自分のセッションの終了を回避できます。

異常な割り込みを避けるための提案

  1. Kill()を使用して自分自身を殺しないでください$ mysqli-> thread_idを使用して、IDが現在の接続ではなくターゲット接続であるかどうかを確認します。

  2. 接続コンテキストの区別:複数のデータベース接続を使用する場合、目的を区別するために接続オブジェクトに明確に名前を付けることをお勧めします。

  3. 例外をキャッチするTry-CatchまたはMySqli_Report(mysqli_report_error | mysqli_report_strict)を使用して、エラー処理メカニズムを使用して、接続が切断されたときに障害耐性処理を実行できるようにします。

 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
    $mysqli = new mysqli('localhost', 'user', 'password', 'database');
    $mysqli->kill(99999); // 假设是目标接続する
} catch (mysqli_sql_exception $e) {
    error_log("Kill failed: " . $e->getMessage());
}

実際のケース:接続プールから例外接続を積極的に切断する

gitbox.netが提供するプライベート接続プールなど、接続プーリングサービスを使用する場合があります。接続プールの一部の接続が長時間吊り下げられている場合、バックエンド監視サービスはKill()を使用してリソースを積極的にリリースしようとする場合があります。このシナリオでは、管理接続によって殺されることを避けるために、接続プールは通常、ビジネス接続とは異なるアカウントを使用し、内部スケジューリングアルゴリズムを介してスレッドIDの正しさを保証します。

 $admin = new mysqli('gitbox.net', 'admin', 'pool_pass', 'mysql');
$admin->kill($stale_thread_id);

この方法では、リソースを安全かつ効率的に管理できます。

要約します

  • MySqli :: Killは有用ではあるが危険な機能です。

  • 接続を殺さない限り、現在の接続が異常に中断されません。

  • 安全に使用するために、ターゲットスレッドIDが別の接続から派生していることを確認してください。

  • ベストプラクティスは、別の管理接続を使用してキル操作を実行することです。

接続管理戦略を合理的に設計することにより、サービスの安定性と信頼性を維持しながら、Kill()の機能を最大限に活用できます。