W3docs

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ámetroDescripción
$mysqlUn enlace de conexión devuelto por mysqli_connect() o new mysqli(...).
$flagsUna 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 privilegio SUPER). Un usuario de aplicación estándar recibirá un error de "acceso denegado" y mysqli_refresh() devolverá false.

Flags de refresco

El argumento $flags selecciona qué vaciar. Las constantes más comunes son:

FlagQué vacía
MYSQLI_REFRESH_GRANTRecarga las tablas de permisos (equivalente a FLUSH PRIVILEGES).
MYSQLI_REFRESH_LOGVacía los registros de errores, consultas y binarios (rotación de logs).
MYSQLI_REFRESH_TABLESVacía todas las tablas abiertas y cierra sus archivos (FLUSH TABLES).
MYSQLI_REFRESH_HOSTSLimpia la caché interna de hosts.
MYSQLI_REFRESH_STATUSRestablece las variables de estado de sesión/servidor.
MYSQLI_REFRESH_THREADSVacía la caché de hilos.
MYSQLI_REFRESH_REPLICARestablece 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 devuelve false. Comprueba siempre el valor de retorno y lee mysqli_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_MASTER fueron renombradas a MYSQLI_REFRESH_REPLICA/MYSQLI_REFRESH_SOURCE en 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 (o FLUSH PRIVILEGES) mediante mysqli_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.

Práctica

Práctica
¿Qué hace mysqli_refresh() en PHP?
¿Qué hace mysqli_refresh() en PHP?
Was this page helpful?