Start · Sprachen · PHP · Referenz · mysqli_kill

mysqli_kill

Funktion

Weist den MySQL-Server an, einen bestimmten Client-Thread (Verbindung) anhand seiner Prozess-ID zu beenden.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_kill(mysqli $mysql, int $process_id): bool

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

Typ
bool
Beschreibung
Gibt 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();
Thread 42 wurde erfolgreich beendet.

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);
Aktuelle Thread-ID: 41 Fehler: Unknown thread id: 99

// 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.