ping
In questo articolo approfondiamo la funzione mysqli_ping() in PHP, usata per verificare se la connessione al server MySQL è ancora attiva.
Questo articolo tratta la funzione mysqli_ping() in PHP, che verifica se una connessione al server MySQL è ancora attiva e, dove supportato, riconnette in modo trasparente un collegamento interrotto. Vedremo la sintassi orientata agli oggetti e quella procedurale, la firma della funzione, quando utilizzarla e l'importante deprecazione introdotta in PHP 8.4.
Cosa fa mysqli_ping()
mysqli_ping() esegue un ping su una connessione MySQL attiva. Se la connessione è viva restituisce true. Se il collegamento è interrotto, la funzione tenta di riconnettersi quando la direttiva di configurazione mysqli.reconnect è abilitata, e restituisce true in caso di riconnessione riuscita oppure false se non è possibile ristabilire il collegamento.
È particolarmente utile negli script a lunga esecuzione (worker, daemon, consumer di code) in cui una connessione può restare inattiva abbastanza a lungo da far sì che il server la chiuda dopo wait_timeout secondi — il classico errore "MySQL server has gone away". Eseguire un ping prima di una query consente di rilevare o recuperare da questa situazione.
Sintassi
// Object-oriented style
$mysqli->ping(): bool
// Procedural style
mysqli_ping(mysqli $mysql): boolParametri
$mysql(solo procedurale) — un identificatore di connessione restituito damysqli_connect()omysqli_init().
Valore restituito — true se la connessione è attiva (o è stata riconnessa con successo), false altrimenti.
Nota sulla deprecazione:
mysqli_ping()e la funzionalità di riconnessione automatica sono deprecate a partire da PHP 8.4 e saranno rimosse nelle versioni future, perché le riconnessioni silenziose possono perdere lo stato della sessione (tabelle temporanee, prepared statement, transazioni, variabiliSET). L'approccio consigliato è intercettare la query fallita e aprire autonomamente una nuova connessione.
Esempio orientato agli oggetti
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
exit();
}
// ping() automatically attempts to reconnect if the link is dead
if ($mysqli->ping()) {
echo "Connection is OK!";
} else {
echo "Error: " . $mysqli->error;
}
$mysqli->close();
?>Lo script inizializza una connessione MySQLi, ne verifica il successo tramite connect_errno, quindi chiama ping() per confermare che il collegamento sia attivo. Visualizza un messaggio di successo o di errore tramite connect_error di conseguenza.
Nota sulla sicurezza: Negli ambienti di produzione, evita di codificare le credenziali del database direttamente nel codice. Usa variabili d'ambiente o file di configurazione sicuri per memorizzare i dati sensibili.
Esempio procedurale
Per lo stile procedurale, puoi usare mysqli_ping($link) al posto della sintassi OO:
<?php
$link = mysqli_connect("localhost", "username", "password", "database");
if (!$link) {
die("Connection failed: " . mysqli_connect_error());
}
if (mysqli_ping($link)) {
echo "Connection is OK!";
} else {
echo "Error: " . mysqli_error($link);
}
mysqli_close($link);
?>Alternativa moderna consigliata
Poiché ping() è deprecata in PHP 8.4, il pattern durevole consiste nell'eseguire la query, rilevare il fallimento causato dalla disconnessione e riconnettersi esplicitamente:
<?php
function runWithReconnect(callable $makeConnection, string $sql): mysqli_result|bool
{
$mysqli = $makeConnection();
try {
return $mysqli->query($sql);
} catch (mysqli_sql_exception $e) {
// MySQL error 2006: server has gone away — reopen and retry once.
if ($e->getCode() === 2006) {
$mysqli = $makeConnection();
return $mysqli->query($sql);
}
throw $e;
}
}
?>In questo modo si mantiene il pieno controllo dello stato della connessione invece di affidarsi a una riconnessione silenziosa.
Conclusione
mysqli_ping() è un modo rapido per verificare se una connessione MySQL è ancora attiva e, nelle versioni precedenti di PHP, per riconnettersi a un collegamento interrotto. È comoda negli script a lunga esecuzione, ma a partire da PHP 8.4 è deprecata — è preferibile intercettare la query() fallita e riaprire autonomamente la connessione. Per maggiori informazioni sull'apertura delle connessioni, consulta mysqli_connect() e la panoramica MySQLi.