Функция 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(). Следуя шагам и лучшим практикам, изложенным здесь, разработчики смогут поддерживать оптимальную производительность и безопасность базы данных.