Aktueller Standort: Startseite> Neueste Artikel> So vermeiden Sie Ausnahmen, die durch das Schließen von Verbindungen verursacht werden, wenn die Funktion mySQLI :: Kill verwendet wird

So vermeiden Sie Ausnahmen, die durch das Schließen von Verbindungen verursacht werden, wenn die Funktion mySQLI :: Kill verwendet wird

gitbox 2025-06-07

Beim Betrieb einer MySQL -Datenbank mit PHP wird die MySQLi :: Kill -Methode verwendet, um einen bestimmten Verbindungs ​​-Thread zu beenden. Entwickler können jedoch während der Verwendung auf ein Problem stoßen: Wird die aktuelle Verbindung nach dem Aufrufen von Kill () abnormal unterbrochen? Dieser Artikel wird sein Verhaltensprinzip analysieren und die richtige Möglichkeit bieten, Verbindungsausnahmen zu vermeiden.

Was ist MySQLI :: Kill

Die Funktion der MySQLi :: Kill -Methode besteht darin, einen Befehl Kill an den MySQL -Server zu senden, um die durch den angegebene Thread (Thread ID) dargestellte Verbindung zu beenden. Die grundlegende Verwendung ist wie folgt:

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

Es ist zu beachten, dass der $ thread_id hier normalerweise nicht die Thread -ID der aktuellen Verbindung selbst ist, sondern die ID anderer Verbindungen, die durch die folgende Methode erhalten wurden:

 $thread_id = $mysqli->thread_id;

Wird sich töten () sich töten?

Die Antwort lautet: Nein, es sei denn, Sie ergreifen die Initiative dafür.

Wenn Sie $ MySQLI-> Kill ($ thread_id) und $ thread_id die Thread-ID der aktuellen Verbindung selbst nennen, beenden Sie Ihre Verbindung, wodurch die aktuelle Verbindung sofort unterbrochen wird. Alle nachfolgenden Datenbankvorgänge löst einen Fehler aus, der Folgendes ähnelt:

 MySQL server has gone away

Beispiel:

 $mysqli = new mysqli('localhost', 'user', 'password', 'database');
$mysqli->kill($mysqli->thread_id); // Selbstmordbetrieb
$mysqli->query("SELECT 1"); // Eine Ausnahme wird hierher geworfen

Wenn Sie also einen anderen Thread beenden möchten, stellen Sie sicher, dass der Thread_ID aus einer anderen Verbindung stammt.

Richtige Verwendung Szenario: Töten Sie andere Verbindungen

In einigen geschäftlichen Anforderungen, wie z. B. Abfragen, die lange Zeit nicht reagiert wurden oder die Anzahl der gleichzeitigen Verbindungen kontrollieren, müssen wir möglicherweise einen Kill -Betrieb aus der Verwaltungsverbindung ausführen. Zu diesem Zeitpunkt besteht der empfohlene Ansatz darin, eine separate "Verwaltungsverbindung" für die Ausführung des Kills herzustellen:

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

// verbinden B:管理verbinden
$connB = new mysqli('localhost', 'admin', 'admin_pass', 'information_schema');
$connB->kill($task_thread_id); // Töten A 的verbinden

Diese Methode stellt sicher, dass die Verwaltungsverbindung jederzeit normal bleibt und die Beendigung Ihrer eigenen Sitzung aufgrund von Fehloperationen vermeidet.

Vorschläge, um abnormale Interrupts zu vermeiden

  1. Verwenden Sie nicht Kill (), um sich selbst zu töten : Verwenden Sie $ mysqli-> thread_id, um zu überprüfen, ob die ID eher die Zielverbindung als die aktuelle Verbindung ist.

  2. Unterscheidung zwischen den Verbindungskontext : Bei Verwendung mehrerer Datenbankverbindungen wird empfohlen, die Verbindungsobjekte klar zu benennen, um ihren Zweck zu unterscheiden.

  3. Ausnahmen anfangen : Verwenden Sie Try-Catch oder MySQLI_Report (MySQLI_Report_error | mysqli_report_strict) mit dem Fehlerbehandlungsmechanismus, um sicherzustellen, dass die Verarbeitung von Fehlertoleranz ausgeführt werden kann, wenn die Verbindung nicht verbunden ist.

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

Aktueller Fall: Die aktive Ausnahmebestörung vom Verbindungspool aktiv trennen

Manchmal verwenden wir Verbindungs ​​-Pooling -Dienste wie den von Gitbox.net bereitgestellten privaten Verbindungspool. Wenn einige Verbindungen im Verbindungspool für lange Zeit suspendiert werden, kann der Backend -Überwachungsdienst versuchen, Kill () aktiv zu verwenden, um Ressourcen aktiv zu veröffentlichen. In diesem Szenario verwendet der Verbindungspool, um nicht durch Verwaltungsverbindungen getötet zu werden, normalerweise ein Konto, das sich von der Geschäftsverbindung unterscheidet, und stellt die Richtigkeit der Thread -ID über einen internen Planungsalgorithmus sicher.

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

Auf diese Weise kann Ressourcen sicher und effizient verwalten.

Zusammenfassen

  • Mysqli :: Kill ist eine nützliche, aber gefährliche Funktion.

  • Solange Sie Ihre Verbindung nicht töten, wird die aktuelle Verbindung nicht ungewöhnlich unterbrochen.

  • Stellen Sie zur sicheren Verwendung sicher, dass die Ziel -Thread -ID aus einer anderen Verbindung abgeleitet wird.

  • Die beste Praxis besteht darin, eine separate Verwaltungsverbindung zu verwenden, um den Kill -Betrieb durchzuführen.

Durch rationale Gestaltung von Verbindungsmanagementstrategien können Sie die Fähigkeiten von Kill () voll ausnutzen und gleichzeitig die Stabilität und Zuverlässigkeit von Diensten aufrechterhalten.