W3docs

Функция PHP mysqli_refresh()

Узнайте, как функция PHP mysqli_refresh() сбрасывает кэши, таблицы, логи и привилегии MySQL. Флаги, процедурный и ООП-синтаксис, типичные ошибки.

Введение

MySQLi — это расширение PHP для работы с базами данных MySQL. Функция mysqli_refresh() позволяет попросить сервер сбросить внутренние ресурсы — кэши, определения таблиц, логи или таблицы привилегий пользователей. Это программный эквивалент выполнения SQL-оператора FLUSH.

На этой странице объясняется, что делает mysqli_refresh(), какие флаги она принимает, как вызывать её в процедурном и объектно-ориентированном стиле, а также типичная проблема с привилегиями, с которой сталкиваются большинство новых пользователей.

Синтаксис

mysqli_refresh() принимает открытое соединение и битовую маску флагов обновления, возвращая true при успехе или false при ошибке.

mysqli_refresh(mysqli $mysql, int $flags): bool
ПараметрОписание
$mysqlСсылка на соединение, возвращённая mysqli_connect() или new mysqli(...).
$flagsОдна или несколько констант MYSQLI_REFRESH_*, объединённых с помощью побитового оператора ИЛИ (|).

В объектно-ориентированном стиле тот же вызов записывается как $mysqli->refresh($flags).

Необходимые привилегии. Сброс — это привилегированная операция. Учётная запись MySQL, под которой выполняется подключение, должна иметь привилегию RELOAD (исторически — привилегию SUPER). Обычный пользователь приложения получит ошибку «доступ запрещён», а mysqli_refresh() вернёт false.

Флаги обновления

Аргумент $flags определяет, что именно сбрасывается. Наиболее распространённые константы:

ФлагЧто сбрасывается
MYSQLI_REFRESH_GRANTПерезагружает таблицы привилегий (аналог FLUSH PRIVILEGES).
MYSQLI_REFRESH_LOGСбрасывает журналы ошибок, запросов и двоичные логи (ротация логов).
MYSQLI_REFRESH_TABLESСбрасывает все открытые таблицы и закрывает их файлы (FLUSH TABLES).
MYSQLI_REFRESH_HOSTSОчищает внутренний кэш хостов.
MYSQLI_REFRESH_STATUSСбрасывает переменные состояния сессии/сервера.
MYSQLI_REFRESH_THREADSСбрасывает кэш потоков.
MYSQLI_REFRESH_REPLICAСбрасывает реплику (ранее MYSQLI_REFRESH_SLAVE).

Объединяйте флаги с помощью |, чтобы выполнить несколько действий за один запрос:

mysqli_refresh($conn, MYSQLI_REFRESH_TABLES | MYSQLI_REFRESH_LOG);

Как использовать mysqli_refresh()

Откройте соединение, вызовите mysqli_refresh() с нужным флагом и проверьте возвращаемое булево значение. Вот полный пример в процедурном стиле:

<?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);
?>

Соединение устанавливается с помощью mysqli_connect(). Затем mysqli_refresh() сбрасывает открытые таблицы, результат проверяется, а данные повторно считываются с помощью mysqli_query() и mysqli_fetch_assoc(). В конце соединение освобождается с помощью mysqli_close().

Объектно-ориентированный стиль

Если вы предпочитаете ООП-интерфейс, соединение является объектом mysqli, а refresh() — его методом:

<?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();
?>

Оба стиля ведут себя одинаково; ООП-версия просто читает свойства error и connect_error объекта соединения вместо использования mysqli_error().

Сценарии использования функции MySQLi Refresh

Функция mysqli_refresh() полезна в различных ситуациях, в том числе:

1. Управление кэшем таблиц

Функцию mysqli_refresh() можно использовать для сброса кэша таблиц. Это помогает, когда структуры таблиц изменились и нужно, чтобы сервер перезагрузил их определения.

2. Управление логами

Функция может сбрасывать общие, медленные или двоичные логи. Это удобно для обслуживания базы данных и обеспечения правильной ротации файлов логов.

3. Перезагрузка привилегий

Разработчики могут использовать её для перезагрузки таблиц привилегий после изменения прав пользователей, чтобы обновления вступили в силу немедленно.

Преимущества функции MySQLi Refresh

Функция mysqli_refresh() предоставляет PHP-разработчикам несколько преимуществ:

1. Эффективное управление кэшем

Функция позволяет разработчикам очищать серверные кэши по требованию. Это полезно в приложениях, требующих немедленного обновления определений таблиц или кэшей запросов.

2. Улучшенное обслуживание базы данных

Функция обеспечивает правильное управление логами и кэшами, что может привести к лучшей производительности сервера и упростить устранение неполадок.

3. Немедленное обновление привилегий

Функция ценна при управлении правами пользователей. Перезагружая таблицы привилегий, приложение может гарантировать, что все пользователи работают с самыми актуальными правами доступа.

Типичные ошибки

  • Доступ запрещён. Наиболее частый сюрприз: обычная учётная запись приложения не имеет привилегии RELOAD/SUPER, поэтому вызов возвращает false. Всегда проверяйте возвращаемое значение и читайте mysqli_error().
  • Это не HTTP-«обновление». mysqli_refresh() не имеет ничего общего с перезагрузкой веб-страницы. Она сбрасывает серверное состояние MySQL. Чтобы заново получить данные в скрипт, необходимо выполнить запрос снова — сброс не возвращает строки.
  • Переименованные константы. MYSQLI_REFRESH_SLAVE/MYSQLI_REFRESH_MASTER были переименованы в MYSQLI_REFRESH_REPLICA/MYSQLI_REFRESH_SOURCE в новых сборках MySQL/PHP; предпочитайте новые имена на современных установках.
  • Предпочтите SQL там, где это возможно. Большинство кода может просто выполнять FLUSH TABLES (или FLUSH PRIVILEGES) через mysqli_query(); mysqli_refresh() — это удобная обёртка над теми же командами сброса.

Заключение

Функция mysqli_refresh() предоставляет простой способ отправки команд FLUSH на сервер MySQL, помогая разработчикам управлять ресурсами и перезагружать определения после структурных изменений или задач обслуживания. Благодаря поддержке нескольких флагов обновления и немедленному воздействию на кэши, логи и привилегии, она остаётся практичным инструментом для администрирования баз данных в PHP-приложениях.

Мы надеемся, что это руководство прояснило, как эффективно использовать функцию mysqli_refresh(). Следуя шагам и лучшим практикам, изложенным здесь, разработчики смогут поддерживать оптимальную производительность и безопасность базы данных.

Практика

Практика
Что делает mysqli_refresh() в PHP?
Что делает mysqli_refresh() в PHP?
Was this page helpful?