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| Parametro | Descrizione |
|---|---|
$mysql | Un link di connessione restituito da mysqli_connect() o new mysqli(...). |
$flags | Una 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 privilegioSUPER). Un utente applicativo standard riceverà un errore "accesso negato" emysqli_refresh()restituiràfalse.
Flag di refresh
L'argomento $flags seleziona cosa svuotare. Le costanti più comuni sono:
| Flag | Cosa svuota |
|---|---|
MYSQLI_REFRESH_GRANT | Ricarica le grant table (equivalente a FLUSH PRIVILEGES). |
MYSQLI_REFRESH_LOG | Svuota i log di errore, query e binari (rotazione dei log). |
MYSQLI_REFRESH_TABLES | Svuota tutte le tabelle aperte e chiude i relativi file (FLUSH TABLES). |
MYSQLI_REFRESH_HOSTS | Cancella la cache interna degli host. |
MYSQLI_REFRESH_STATUS | Reimposta le variabili di stato della sessione/server. |
MYSQLI_REFRESH_THREADS | Svuota la cache dei thread. |
MYSQLI_REFRESH_REPLICA | Reimposta 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 restituiscefalse. Controlla sempre il valore restituito e leggimysqli_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_MASTERsono state rinominate inMYSQLI_REFRESH_REPLICA/MYSQLI_REFRESH_SOURCEnelle 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(oFLUSH PRIVILEGES) tramitemysqli_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.