kill
In questo articolo approfondiamo la funzione mysqli_kill() in PHP, usata per terminare una connessione client MySQL: sintassi, parametri ed esempi.
In questo articolo approfondiamo la funzione mysqli_kill() in PHP, che chiede al server MySQL di terminare una connessione client identificata dal suo thread ID (ID di connessione). Tratteremo la sintassi, i parametri, entrambi gli stili di chiamata e le situazioni reali in cui ha senso terminare una connessione.
Cosa fa mysqli_kill()
mysqli_kill() è una funzione PHP integrata che invia un comando KILL al server MySQL per un dato thread ID — l'identificatore numerico che MySQL assegna a ogni connessione client. È l'equivalente programmatico dell'esecuzione di KILL <id>; nella shell MySQL.
Alcuni punti importanti da comprendere prima di utilizzarla:
- Il thread ID che si passa deve appartenere a una connessione sullo stesso server MySQL. Di norma lo si ottiene con
mysqli_thread_id(). - Terminare una connessione la chiude lato server, ma l'oggetto PHP
mysqlirimane in scope. È comunque necessario chiamaremysqli_close()per liberarlo correttamente. - L'utente del database deve avere il privilegio
SUPER(oCONNECTION_ADMIN) per terminare connessioni di cui non è proprietario.
Quando usarla?
Raramente si termina la propria connessione — chiuderla con mysqli_close() è più semplice. mysqli_kill() diventa utile quando si hanno più connessioni e si deve terminarne una diversa:
- Una query a lunga esecuzione su un'altra connessione sta mantenendo dei lock e deve essere interrotta.
- Uno script di monitoraggio o amministrazione deve eliminare una connessione obsoleta o fuori controllo tramite ID.
- Si vuole liberare una sessione specifica dopo aver rilevato un'attività inaspettata o non autorizzata.
Sintassi e parametri
mysqli_kill() funziona sia nello stile procedurale che in quello orientato agli oggetti di MySQLi.
// Procedural
mysqli_kill(mysqli $mysql, int $thread_id): bool
// Object-oriented
$mysqli->kill(int $thread_id): boolParametri:
mysql— Un oggetto di connessione MySQLi (solo stile procedurale).thread_id— L'ID di connessione/thread da terminare.
Valore di ritorno: Restituisce true in caso di successo, false in caso di errore.
Esempio procedurale
L'esempio seguente apre una connessione, recupera il proprio thread ID, lo termina e poi chiude l'handle:
<?php
$mysqli = mysqli_connect("localhost", "username", "password", "database");
if (!$mysqli) {
die("Connection failed: " . mysqli_connect_error());
}
$thread_id = mysqli_thread_id($mysqli);
if (mysqli_kill($mysqli, $thread_id)) {
echo "Connection {$thread_id} was killed on the server.";
}
mysqli_close($mysqli);
?>Qui ci si connette con mysqli_connect(), si verifica il risultato per evitare errori fatali nelle chiamate successive (vedere mysqli_connect_error()), si legge il thread ID corrente con mysqli_thread_id() e lo si passa a mysqli_kill(). Dopo il kill, la connessione lato server è terminata, quindi qualsiasi successiva mysqli_query() su questo handle fallirebbe — la si chiude semplicemente.
Esempio orientato agli oggetti
La stessa logica in stile OOP, terminando una seconda connessione dalla prima — il pattern più comune nel mondo reale:
<?php
$admin = new mysqli("localhost", "username", "password", "database");
$worker = new mysqli("localhost", "username", "password", "database");
if ($admin->connect_errno || $worker->connect_errno) {
die("Connection failed.");
}
// Suppose $worker is running something we need to stop.
$worker_id = $worker->thread_id;
if ($admin->kill($worker_id)) {
echo "Killed worker connection {$worker_id}.";
}
$admin->close();
$worker->close();
?>Conclusione
mysqli_kill() chiede al server MySQL di terminare una connessione tramite il suo thread ID, restituendo true in caso di successo e false in caso di errore. Il suo vero valore emerge quando occorre fermare una connessione aggiuntiva — per liberare lock, interrompere una query fuori controllo o terminare una sessione sospetta — mentre un semplice mysqli_close() rimane lo strumento giusto per chiudere una connessione di propria titolarità.