Position actuelle: Accueil> Derniers articles> Comment éviter les exceptions causées par la fermeture des connexions lors de l'utilisation de la fonction MySQLI :: Kill

Comment éviter les exceptions causées par la fermeture des connexions lors de l'utilisation de la fonction MySQLI :: Kill

gitbox 2025-06-07

Lors de l'exploitation d'une base de données MySQL à l'aide de PHP, la méthode MySQLI :: Kill est utilisée pour terminer un thread de connexion spécifique. Cependant, les développeurs peuvent rencontrer un problème pendant l'utilisation: la connexion actuelle sera-t-elle interrompue anormalement après avoir appelé kill () ? Cet article analysera son principe de comportement et fournira la bonne façon d'éviter les exceptions de connexion.

Qu'est-ce que MySqli :: Kill

La fonction de la méthode MySQLI :: Kill est d'envoyer une commande Kill au serveur MySQL pour terminer la connexion représentée par le thread spécifié (ID de thread). L'utilisation de base est la suivante:

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

Il convient de noter que le $ thread_id ici n'est généralement pas l'ID de thread de la connexion actuelle elle-même, mais l'ID des autres connexions obtenues par la méthode suivante:

 $thread_id = $mysqli->thread_id;

Est-ce que tuer () se tuera-t-il?

La réponse est: non, sauf si vous prenez l'initiative de le faire.

Lorsque vous appelez $ mysqli-> kill ($ thread_id) et $ thread_id est l'ID de thread de la connexion actuelle elle-même, vous terminera votre connexion, ce qui entraînera l'interrompre immédiatement la connexion actuelle. Toute opération de base de données ultérieure déclenchera une erreur similaire à ce qui suit:

 MySQL server has gone away

Exemple:

 $mysqli = new mysqli('localhost', 'user', 'password', 'database');
$mysqli->kill($mysqli->thread_id); // Opération de suicide
$mysqli->query("SELECT 1"); // Une exception sera lancée ici

Donc, si vous souhaitez terminer un autre thread, assurez-vous que le thread_id est tiré d'une autre connexion.

Scénario d'utilisation correcte: tuez d'autres connexions

Dans certains besoins commerciaux, tels que le nettoyage des requêtes qui n'ont pas été répondues depuis longtemps ou le contrôle du nombre de connexions simultanées, nous devrons peut-être effectuer une opération de mise à mort à partir de la connexion de gestion. À ce stade, l'approche recommandée consiste à établir une «connexion de gestion» distincte pour exécuter la mise à mort :

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

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

Cette méthode garantit que la connexion de gestion reste normale à tout moment et évite la résiliation de votre propre session en raison d'une mauvaise opération.

Suggestions pour éviter les interruptions anormales

  1. N'utilisez pas de kill () pour vous tuer : utilisez $ mysqli-> thread_id pour vérifier si l'ID est la connexion cible plutôt que la connexion actuelle.

  2. Distinguer le contexte de connexion : lors de l'utilisation de plusieurs connexions de base de données, il est recommandé de nommer clairement les objets de connexion pour distinguer leur objectif.

  3. Catch Exceptions : Utilisez Try-Catch ou MySQLI_Report (mysqli_report_error | MySQLI_REPORT_STRICT) avec le mécanisme de gestion des erreurs pour garantir que le traitement tolérant aux pannes peut être effectué lorsque la connexion est déconnectée.

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

Cas réel: Débranchez activement la connexion à l'exception du pool de connexion

Parfois, nous utilisons des services de pool de connexion, tels que le pool de connexions privés fourni par Gitbox.net . Lorsque certaines connexions dans le pool de connexions sont suspendues pendant longtemps, le service de surveillance backend peut essayer d'utiliser Kill () pour libérer activement des ressources. Dans ce scénario, afin d'éviter d'être tué par des connexions de gestion, le pool de connexions utilise généralement un compte différent de la connexion commerciale et assure l'exactitude de l'ID de thread via un algorithme de planification interne.

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

Cette manière peut gérer les ressources en toute sécurité et efficacement.

Résumer

  • MySqli :: Kill est une fonction utile mais dangereuse.

  • Tant que vous ne tuez pas votre connexion, cela ne fera pas d'interrompu la connexion actuelle anormalement.

  • Pour une utilisation sûre, assurez-vous que l'ID de filetage cible est dérivé d'une connexion différente.

  • La meilleure pratique consiste à utiliser une connexion de gestion distincte pour effectuer l'opération de mise à mort .

En concevant rationnellement les stratégies de gestion des connexions, vous pouvez utiliser pleinement les capacités de Kill () tout en maintenant la stabilité et la fiabilité des services.