Signatur
Beschreibung
mysqli_kill() sendet einen KILL-Befehl an den MySQL-Server, der den angegebenen Thread sofort abbricht. Dies ist nützlich, wenn eine Abfrage zu lange läuft oder eine Verbindung hängt und manuell beendet werden soll.
Die Prozess-ID des zu beendenden Threads kann zuvor mit mysqli_thread_id() ermittelt werden. Dabei ist zu beachten, dass man normalerweise nur Threads beenden kann, die der gleichen Datenbank-Nutzerrolle gehören, oder wenn man über ausreichende Berechtigungen verfügt (z. B. das MySQL-Recht SUPER oder CONNECTION_ADMIN).
Die prozedurale Variante ist mysqli_kill(), die objektorientierte Methode lautet $mysqli->kill($process_id). Nach einem erfolgreichen KILL ist die beendete Verbindung nicht mehr nutzbar; eigene Verbindungen sollten daher nur in Ausnahmefällen selbst gekillt werden.
In der Praxis wird mysqli_kill() häufig in Administrations-Skripten eingesetzt, die lang laufende Abfragen überwachen und bei Bedarf abbrechen, ohne direkt auf die MySQL-Konsole zugreifen zu müssen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $mysql Pflicht | mysqli | Ein aktives mysqli-Verbindungsobjekt, das zuvor mit mysqli_connect() oder new mysqli() erstellt wurde. |
|
| $process_id Pflicht | int | Die Prozess-ID (Thread-ID) des MySQL-Threads, der beendet werden soll. Diese kann mit mysqli_thread_id() abgerufen werden. |
Rückgabewert
true bei Erfolg zurück, false bei einem Fehler (z. B. unzureichende Berechtigungen oder ungültige Prozess-ID).Beispiele
Eigene Verbindung ermitteln und einen anderen Thread beenden
<?php
$mysqli = new mysqli('localhost', 'root', 'geheim', 'testdb');
if ($mysqli->connect_errno) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
// Thread-ID einer anderen Verbindung ermitteln (hier exemplarisch mit einer zweiten Verbindung)
$mysqli2 = new mysqli('localhost', 'root', 'geheim', 'testdb');
$thread_id = $mysqli2->thread_id;
// Zweite Verbindung über die erste beenden
if ($mysqli->kill($thread_id)) {
echo "Thread $thread_id wurde erfolgreich beendet.";
} else {
echo 'Fehler beim Beenden des Threads: ' . $mysqli->error;
}
$mysqli->close();
Prozedurale Variante: Lang laufende Abfrage abbrechen
<?php
$link = mysqli_connect('localhost', 'admin', 'geheim', 'testdb');
if (!$link) {
die('Verbindungsfehler: ' . mysqli_connect_error());
}
// Thread-ID der aktuellen Verbindung ermitteln
$thread_id = mysqli_thread_id($link);
echo "Aktuelle Thread-ID: $thread_id\n";
// Beispiel: Thread von außen beenden (in der Praxis würde man eine andere Thread-ID verwenden)
// $result = mysqli_kill($link, $thread_id); // würde die eigene Verbindung beenden
// Simuliertes Beenden eines anderen Threads:
$andere_thread_id = 99; // Beispiel-ID
if (mysqli_kill($link, $andere_thread_id)) {
echo "Thread $andere_thread_id wurde beendet.";
} else {
echo 'Fehler: ' . mysqli_error($link);
}
mysqli_close($link);
// Wichtig · Fallstricke
Berechtigungen: Ohne das MySQL-Privileg CONNECTION_ADMIN (oder SUPER in älteren MySQL-Versionen) können nur eigene Threads beendet werden. Der Versuch, fremde Threads ohne entsprechende Rechte zu beenden, schlägt fehl.
Achtung bei der eigenen Verbindung: Wird die eigene Thread-ID übergeben, wird die aktuelle Verbindung getrennt. Nachfolgende Datenbankoperationen auf dieser Verbindung schlagen dann fehl.
Abfrage vs. Verbindung: KILL beendet standardmäßig die gesamte Verbindung. In MySQL ist es auch möglich, nur die laufende Abfrage mit KILL QUERY abzubrechen, was jedoch über mysqli_kill() nicht direkt unterstützt wird – hierfür kann eine eigene SQL-Abfrage mit mysqli_query() und KILL QUERY <id> gesendet werden.