Función PHP mysqli_refresh()
Aprende cómo mysqli_refresh() vacía cachés, tablas, registros y privilegios de MySQL. Cubre flags, sintaxis procedural y OOP, y errores comunes.
Introducción
MySQLi es la extensión de PHP para comunicarse con bases de datos MySQL. La función mysqli_refresh() permite pedirle al servidor que vacíe recursos internos: cachés, definiciones de tablas, registros o las tablas de permisos que almacenan los privilegios de usuario. Es el equivalente programático de ejecutar una sentencia SQL FLUSH.
Esta página explica qué hace mysqli_refresh(), los flags que acepta, cómo llamarla tanto desde código procedural como orientado a objetos, y el problema de privilegios que suele sorprender a los usuarios principiantes.
Sintaxis
mysqli_refresh() recibe la conexión abierta y una máscara de bits con los flags de refresco, y devuelve true en caso de éxito o false en caso de error.
mysqli_refresh(mysqli $mysql, int $flags): bool| Parámetro | Descripción |
|---|---|
$mysql | Un enlace de conexión devuelto por mysqli_connect() o new mysqli(...). |
$flags | Una o más constantes MYSQLI_REFRESH_* combinadas con el operador OR a nivel de bits (|). |
En estilo orientado a objetos, la misma llamada se escribe como $mysqli->refresh($flags).
Privilegio requerido. El vaciado es una operación privilegiada. La cuenta MySQL con la que te conectas necesita el privilegio
RELOAD(históricamente el privilegioSUPER). Un usuario de aplicación estándar recibirá un error de "acceso denegado" ymysqli_refresh()devolveráfalse.
Flags de refresco
El argumento $flags selecciona qué vaciar. Las constantes más comunes son:
| Flag | Qué vacía |
|---|---|
MYSQLI_REFRESH_GRANT | Recarga las tablas de permisos (equivalente a FLUSH PRIVILEGES). |
MYSQLI_REFRESH_LOG | Vacía los registros de errores, consultas y binarios (rotación de logs). |
MYSQLI_REFRESH_TABLES | Vacía todas las tablas abiertas y cierra sus archivos (FLUSH TABLES). |
MYSQLI_REFRESH_HOSTS | Limpia la caché interna de hosts. |
MYSQLI_REFRESH_STATUS | Restablece las variables de estado de sesión/servidor. |
MYSQLI_REFRESH_THREADS | Vacía la caché de hilos. |
MYSQLI_REFRESH_REPLICA | Restablece la réplica (antes MYSQLI_REFRESH_SLAVE). |
Combina flags con | para realizar varias acciones en un solo viaje de ida y vuelta:
mysqli_refresh($conn, MYSQLI_REFRESH_TABLES | MYSQLI_REFRESH_LOG);Cómo usar mysqli_refresh()
Abre una conexión, llama a mysqli_refresh() con el flag deseado y comprueba el valor booleano devuelto. Aquí tienes un ejemplo procedural 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 conexión se establece con mysqli_connect(). mysqli_refresh() vacía las tablas abiertas, se comprueba el resultado y los datos se vuelven a leer con mysqli_query() y mysqli_fetch_assoc(). Finalmente, el enlace se libera con mysqli_close().
Estilo orientado a objetos
Si prefieres la interfaz OOP, la conexión es un objeto mysqli y refresh() es un método sobre él:
<?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();
?>Ambos estilos se comportan de forma idéntica; la versión OOP simplemente lee el error y el connect_error de la conexión como propiedades del objeto en lugar de hacerlo a través de mysqli_error().
Casos de uso de la función MySQLi Refresh
La función mysqli_refresh() es útil en una variedad de escenarios, entre ellos:
1. Gestión de caché de tablas
La función mysqli_refresh() puede usarse para vaciar la caché de tablas. Esto es útil cuando las estructuras de tabla han cambiado y necesitas que el servidor recargue las definiciones de tabla.
2. Gestión de registros
La función puede vaciar los registros generales, lentos o binarios. Esto es útil para el mantenimiento de la base de datos y para asegurar que los archivos de log se rotan correctamente.
3. Recarga de privilegios
Los desarrolladores pueden usarla para recargar las tablas de permisos después de realizar cambios en los privilegios de usuario, asegurando que las actualizaciones de permisos surtan efecto de inmediato.
Ventajas de la función MySQLi Refresh
La función mysqli_refresh() ofrece varias ventajas para los desarrolladores PHP:
1. Gestión eficiente de caché
La función permite a los desarrolladores limpiar las cachés del servidor a demanda. Esto es útil en aplicaciones que requieren actualizaciones inmediatas de las definiciones de tabla o las cachés de consultas.
2. Mejor mantenimiento de la base de datos
La función garantiza que los registros y las cachés se gestionen correctamente, lo que puede llevar a un mejor rendimiento del servidor y una solución de problemas más sencilla.
3. Actualizaciones de privilegios inmediatas
La función es valiosa para gestionar los permisos de usuario. Al recargar las tablas de permisos, la aplicación puede asegurarse de que todos los usuarios trabajan con los derechos de acceso más actualizados.
Errores comunes
- Acceso denegado. La sorpresa más frecuente: una cuenta de aplicación normal carece del privilegio
RELOAD/SUPER, por lo que la llamada devuelvefalse. Comprueba siempre el valor de retorno y leemysqli_error(). - No es el "refresh" de HTTP.
mysqli_refresh()no tiene nada que ver con recargar una página web. Vacía el estado de MySQL en el lado del servidor. Para volver a obtener datos en tu script debes ejecutar la consulta de nuevo: el vaciado no devuelve filas. - Constantes renombradas.
MYSQLI_REFRESH_SLAVE/MYSQLI_REFRESH_MASTERfueron renombradas aMYSQLI_REFRESH_REPLICA/MYSQLI_REFRESH_SOURCEen versiones más nuevas de MySQL/PHP; utiliza los nombres nuevos en instalaciones modernas. - Prefiere SQL cuando sea posible. La mayoría del código puede simplemente ejecutar
FLUSH TABLES(oFLUSH PRIVILEGES) mediantemysqli_query();mysqli_refresh()es un envoltorio de conveniencia alrededor de los mismos comandos flush.
Conclusión
La función mysqli_refresh() ofrece una forma sencilla de enviar comandos FLUSH al servidor MySQL, ayudando a los desarrolladores a gestionar recursos y recargar definiciones tras cambios estructurales o tareas de mantenimiento. Con soporte para múltiples flags de refresco y efecto inmediato sobre cachés, registros y privilegios, sigue siendo una herramienta práctica para la administración de bases de datos en aplicaciones PHP.
Esperamos que esta guía haya aclarado cómo usar la función mysqli_refresh() de manera efectiva. Siguiendo los pasos y las buenas prácticas descritos aquí, los desarrolladores pueden mantener un rendimiento y una seguridad óptimos en la base de datos.