ping
В этой статье рассматривается функция mysqli_ping() в PHP, которая проверяет активность соединения с сервером MySQL.
В этой статье рассматривается функция mysqli_ping() в PHP, которая проверяет, активно ли соединение с сервером MySQL, и при наличии поддержки прозрачно восстанавливает разорванное соединение. Вы увидите как объектно-ориентированный, так и процедурный синтаксис, сигнатуру функции, случаи её применения, а также важное устаревание в PHP 8.4.
Что делает mysqli_ping()
mysqli_ping() проверяет активное MySQL-соединение. Если соединение живо, функция возвращает true. Если соединение разорвано, функция пытается переподключиться при включённой директиве конфигурации mysqli.reconnect и возвращает true при успешном переподключении или false, если восстановить соединение не удалось.
Функция наиболее полезна для длительно выполняющихся скриптов (воркеры, демоны, потребители очередей), где соединение может простаивать достаточно долго, чтобы сервер закрыл его по истечении wait_timeout секунд — классическая ошибка «MySQL server has gone away». Проверка перед выполнением запроса позволяет обнаружить и устранить эту ситуацию.
Синтаксис
// Object-oriented style
$mysqli->ping(): bool
// Procedural style
mysqli_ping(mysqli $mysql): boolПараметры
$mysql(только процедурный стиль) — идентификатор соединения, возвращённый функциейmysqli_connect()илиmysqli_init().
Возвращаемое значение — true, если соединение активно (или успешно восстановлено), false в противном случае.
Примечание об устаревании:
mysqli_ping()и функция автоматического переподключения объявлены устаревшими начиная с PHP 8.4 и будут удалены в будущих версиях, поскольку скрытое переподключение может привести к потере состояния сессии (временные таблицы, подготовленные выражения, транзакции, переменныеSET). Рекомендуемый подход — перехватывать ошибку выполнения запроса и самостоятельно открывать новое соединение.
Пример с объектно-ориентированным стилем
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
exit();
}
// ping() automatically attempts to reconnect if the link is dead
if ($mysqli->ping()) {
echo "Connection is OK!";
} else {
echo "Error: " . $mysqli->error;
}
$mysqli->close();
?>Скрипт инициализирует соединение MySQLi, проверяет его успешность через connect_errno, а затем вызывает ping() для подтверждения активности соединения. В зависимости от результата выводится сообщение об успехе или ошибке через connect_error.
Примечание по безопасности: В производственных средах избегайте жёсткого кодирования учётных данных базы данных. Для хранения конфиденциальных данных используйте переменные окружения или защищённые файлы конфигурации.
Пример с процедурным стилем
Для процедурного стиля можно использовать mysqli_ping($link):
<?php
$link = mysqli_connect("localhost", "username", "password", "database");
if (!$link) {
die("Connection failed: " . mysqli_connect_error());
}
if (mysqli_ping($link)) {
echo "Connection is OK!";
} else {
echo "Error: " . mysqli_error($link);
}
mysqli_close($link);
?>Рекомендуемая современная альтернатива
Поскольку ping() объявлен устаревшим в PHP 8.4, надёжным решением является выполнение запроса, обнаружение ошибки «gone away» и явное переподключение:
<?php
function runWithReconnect(callable $makeConnection, string $sql): mysqli_result|bool
{
$mysqli = $makeConnection();
try {
return $mysqli->query($sql);
} catch (mysqli_sql_exception $e) {
// MySQL error 2006: server has gone away — reopen and retry once.
if ($e->getCode() === 2006) {
$mysqli = $makeConnection();
return $mysqli->query($sql);
}
throw $e;
}
}
?>Это даёт вам полный контроль над состоянием соединения вместо того, чтобы полагаться на скрытое переподключение.
Заключение
mysqli_ping() — быстрый способ проверить, активно ли MySQL-соединение, и в старых версиях PHP — восстановить разорванное соединение. Функция удобна в длительно выполняющихся скриптах, однако начиная с PHP 8.4 она объявлена устаревшей — предпочтительно перехватывать ошибку выполнения query() и самостоятельно переоткрывать соединение. Подробнее об установке соединений см. mysqli_connect() и обзор MySQLi.