W3docs

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 mysqli rimane in scope. È comunque necessario chiamare mysqli_close() per liberarlo correttamente.
  • L'utente del database deve avere il privilegio SUPER (o CONNECTION_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): bool

Parametri:

  • 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à.

Esercitazione

Pratica
Quale funzione viene usata in PHP per terminare l'esecuzione degli script?
Quale funzione viene usata in PHP per terminare l'esecuzione degli script?
Was this page helpful?