W3docs

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): bool

Parametri

  • $mysql (solo procedurale) — un identificatore di connessione restituito da mysqli_connect() o mysqli_init().

Valore restituitotrue 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, variabili SET). 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.

Pratica

Pratica
Qual è lo scopo di un ping in PHP?
Qual è lo scopo di un ping in PHP?
Was this page helpful?