W3docs

Funzione PHP mysqli_refresh()

Scopri come la funzione mysqli_refresh() di PHP svuota cache, tabelle, log e privilegi di MySQL. Flag di refresh, sintassi procedurale e OOP.

Introduzione

MySQLi è l'estensione PHP per comunicare con i database MySQL. La funzione mysqli_refresh() consente di chiedere al server di svuotare risorse interne — cache, definizioni di tabelle, log o le grant table che gestiscono i privilegi utente. È l'equivalente programmatico dell'esecuzione di un'istruzione SQL FLUSH.

Questa pagina spiega cosa fa mysqli_refresh(), i flag che accetta, come invocarla sia in stile procedurale che orientato agli oggetti, e il problema dei privilegi che coglie di sorpresa la maggior parte dei nuovi utenti.

Sintassi

mysqli_refresh() accetta la connessione aperta e una maschera di bit dei flag di refresh, e restituisce true in caso di successo o false in caso di errore.

mysqli_refresh(mysqli $mysql, int $flags): bool
ParametroDescrizione
$mysqlUn link di connessione restituito da mysqli_connect() o new mysqli(...).
$flagsUna o più costanti MYSQLI_REFRESH_* combinate con l'operatore OR bit a bit (|).

In stile orientato agli oggetti la stessa chiamata si scrive $mysqli->refresh($flags).

Privilegio richiesto. Lo svuotamento è un'operazione privilegiata. L'account MySQL con cui ci si connette necessita del privilegio RELOAD (storicamente il privilegio SUPER). Un utente applicativo standard riceverà un errore "accesso negato" e mysqli_refresh() restituirà false.

Flag di refresh

L'argomento $flags seleziona cosa svuotare. Le costanti più comuni sono:

FlagCosa svuota
MYSQLI_REFRESH_GRANTRicarica le grant table (equivalente a FLUSH PRIVILEGES).
MYSQLI_REFRESH_LOGSvuota i log di errore, query e binari (rotazione dei log).
MYSQLI_REFRESH_TABLESSvuota tutte le tabelle aperte e chiude i relativi file (FLUSH TABLES).
MYSQLI_REFRESH_HOSTSCancella la cache interna degli host.
MYSQLI_REFRESH_STATUSReimposta le variabili di stato della sessione/server.
MYSQLI_REFRESH_THREADSSvuota la cache dei thread.
MYSQLI_REFRESH_REPLICAReimposta la replica (in precedenza MYSQLI_REFRESH_SLAVE).

Combina i flag con | per eseguire più azioni in un unico round-trip:

mysqli_refresh($conn, MYSQLI_REFRESH_TABLES | MYSQLI_REFRESH_LOG);

Come utilizzare mysqli_refresh()

Apri una connessione, chiama mysqli_refresh() con il flag desiderato e verifica il valore booleano restituito. Ecco un esempio procedurale completo:

<?php

// Create a connection to the MySQL server
$conn = mysqli_connect("localhost", "username", "password", "database");

// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

// Flush server tables and caches
// Requires SUPER or FLUSH privilege
if (mysqli_refresh($conn, MYSQLI_REFRESH_TABLES)) {
    echo "Tables flushed successfully.";
} else {
    echo "Refresh failed: " . mysqli_error($conn);
}

// To fetch updated data, re-execute the query
$result = mysqli_query($conn, "SELECT * FROM table");
if (!$result) {
    die("Query failed: " . mysqli_error($conn));
}

// Process the results
if ($result) {
    while ($row = mysqli_fetch_assoc($result)) {
        // Process each row of data
    }
    mysqli_free_result($result);
}

// Close the connection
mysqli_close($conn);
?>

La connessione viene stabilita con mysqli_connect(). mysqli_refresh() svuota quindi le tabelle aperte, il risultato viene verificato e i dati vengono riletti con mysqli_query() e mysqli_fetch_assoc(). Infine il link viene rilasciato con mysqli_close().

Stile orientato agli oggetti

Se si preferisce l'interfaccia OOP, la connessione è un oggetto mysqli e refresh() è un metodo su di esso:

<?php

$mysqli = new mysqli("localhost", "username", "password", "database");

if ($mysqli->connect_errno) {
    die("Connection failed: " . $mysqli->connect_error);
}

if ($mysqli->refresh(MYSQLI_REFRESH_TABLES | MYSQLI_REFRESH_LOG)) {
    echo "Tables and logs flushed successfully.";
} else {
    echo "Refresh failed: " . $mysqli->error;
}

$mysqli->close();
?>

Entrambi gli stili si comportano in modo identico; la versione OOP legge semplicemente error e connect_error della connessione come proprietà dell'oggetto invece di usare mysqli_error().

Casi d'uso della funzione MySQLi Refresh

La funzione mysqli_refresh() è utile in diversi scenari, tra cui:

1. Gestione della cache delle tabelle

La funzione mysqli_refresh() può essere usata per svuotare la cache delle tabelle. È utile quando le strutture delle tabelle sono cambiate e il server deve ricaricare le definizioni delle tabelle.

2. Gestione dei log

La funzione può svuotare i log generali, lenti o binari. Questo è utile per la manutenzione del database e per garantire che i file di log vengano ruotati correttamente.

3. Ricaricamento dei privilegi

Gli sviluppatori possono usarla per ricaricare le grant table dopo aver modificato i privilegi utente, assicurando che gli aggiornamenti dei permessi abbiano effetto immediato.

Vantaggi della funzione MySQLi Refresh

La funzione mysqli_refresh() offre diversi vantaggi agli sviluppatori PHP:

1. Gestione efficiente della cache

La funzione consente agli sviluppatori di cancellare le cache del server su richiesta. È utile nelle applicazioni che richiedono aggiornamenti immediati alle definizioni delle tabelle o alle cache delle query.

2. Migliore manutenzione del database

La funzione garantisce che i log e le cache siano gestiti correttamente, il che può portare a migliori prestazioni del server e a una risoluzione dei problemi più semplice.

3. Aggiornamenti immediati dei privilegi

La funzione è preziosa nella gestione dei permessi utente. Ricaricando le grant table, l'applicazione può garantire che tutti gli utenti lavorino con i diritti di accesso più aggiornati.

Insidie comuni

  • Accesso negato. La sorpresa più frequente: un account applicativo normale non ha il privilegio RELOAD/SUPER, quindi la chiamata restituisce false. Controlla sempre il valore restituito e leggi mysqli_error().
  • Non è il "refresh" HTTP. mysqli_refresh() non ha nulla a che fare con il ricaricamento di una pagina web. Svuota lo stato MySQL lato server. Per recuperare nuovamente i dati nello script è necessario eseguire di nuovo la query — lo svuotamento non restituisce righe.
  • Costanti rinominate. MYSQLI_REFRESH_SLAVE/MYSQLI_REFRESH_MASTER sono state rinominate in MYSQLI_REFRESH_REPLICA/MYSQLI_REFRESH_SOURCE nelle versioni più recenti di MySQL/PHP; preferisci i nuovi nomi nelle configurazioni moderne.
  • Preferisci SQL quando possibile. La maggior parte del codice può semplicemente eseguire FLUSH TABLES (o FLUSH PRIVILEGES) tramite mysqli_query(); mysqli_refresh() è un wrapper di convenienza attorno agli stessi comandi di flush.

Conclusione

La funzione mysqli_refresh() fornisce un modo semplice per inviare comandi FLUSH al server MySQL, aiutando gli sviluppatori a gestire le risorse e ricaricare le definizioni dopo modifiche strutturali o attività di manutenzione. Con il supporto per più flag di refresh e l'effetto immediato su cache, log e privilegi, rimane uno strumento pratico per l'amministrazione del database nelle applicazioni PHP.

Speriamo che questa guida abbia chiarito come utilizzare efficacemente la funzione mysqli_refresh(). Seguendo i passaggi e le best practice descritti qui, gli sviluppatori possono mantenere prestazioni e sicurezza ottimali del database.

Esercitazione

Pratica
Cosa fa mysqli_refresh() in PHP?
Cosa fa mysqli_refresh() in PHP?
Was this page helpful?