kill
В этой статье рассматривается функция mysqli_kill() в PHP, которая используется для завершения клиентского соединения MySQL по идентификатору потока.
В этой статье мы рассмотрим функцию mysqli_kill() в PHP, которая отправляет серверу MySQL команду завершить клиентское соединение, идентифицируемое по идентификатору потока (thread ID). Мы разберём её синтаксис, параметры, оба стиля вызова и реальные ситуации, в которых завершение соединения действительно необходимо.
Что делает mysqli_kill()
mysqli_kill() — это встроенная функция PHP, которая отправляет команду KILL серверу MySQL для заданного идентификатора потока — числового идентификатора, который MySQL присваивает каждому клиентскому соединению. Это программный эквивалент команды KILL <id>; в консоли MySQL.
Несколько важных моментов перед использованием:
- Передаваемый идентификатор потока должен принадлежать соединению на том же сервере MySQL. Как правило, его получают с помощью
mysqli_thread_id(). - Завершение соединения происходит на стороне сервера, однако локальный PHP-объект
mysqliостаётся в области видимости. Следует вызватьmysqli_close(), чтобы корректно освободить его. - Для завершения чужих соединений учётная запись базы данных должна иметь привилегию
SUPER(илиCONNECTION_ADMIN).
Когда это используется?
Завершать собственное соединение через mysqli_kill() приходится редко — для этого проще использовать mysqli_close(). Функция mysqli_kill() полезна, когда у вас более одного соединения и нужно завершить другое:
- Долгий запрос в другом соединении удерживает блокировки, и его необходимо остановить.
- Скрипт мониторинга или администрирования должен закрыть зависшее или «убежавшее» соединение по его ID.
- Нужно освободить конкретную сессию после обнаружения неожиданной или несанкционированной активности.
Синтаксис и параметры
mysqli_kill() работает как в процедурном, так и в объектно-ориентированном стиле MySQLi.
// Procedural
mysqli_kill(mysqli $mysql, int $thread_id): bool
// Object-oriented
$mysqli->kill(int $thread_id): boolПараметры:
mysql— объект соединения MySQLi (только для процедурного стиля).thread_id— идентификатор соединения/потока, который необходимо завершить.
Возвращаемое значение: Возвращает true при успехе, false при ошибке.
Пример: процедурный стиль
Пример ниже открывает соединение, получает его собственный идентификатор потока, завершает его, а затем закрывает дескриптор:
<?php
$mysqli = mysqli_connect("localhost", "username", "password", "database");
if (!$mysqli) {
die("Connection failed: " . mysqli_connect_error());
}
$thread_id = mysqli_thread_id($mysqli);
if (mysqli_kill($mysqli, $thread_id)) {
echo "Connection {$thread_id} was killed on the server.";
}
mysqli_close($mysqli);
?>Здесь мы устанавливаем соединение с помощью mysqli_connect(), проверяем результат во избежание фатальных ошибок при дальнейших вызовах (см. mysqli_connect_error()), получаем текущий идентификатор потока через mysqli_thread_id() и передаём его в mysqli_kill(). После завершения серверное соединение закрыто, поэтому любой последующий mysqli_query() на этом дескрипторе завершится ошибкой — мы просто закрываем его.
Пример: объектно-ориентированный стиль
Та же логика в OOP-стиле — завершение второго соединения из первого, что является распространённым шаблоном в реальных проектах:
<?php
$admin = new mysqli("localhost", "username", "password", "database");
$worker = new mysqli("localhost", "username", "password", "database");
if ($admin->connect_errno || $worker->connect_errno) {
die("Connection failed.");
}
// Suppose $worker is running something we need to stop.
$worker_id = $worker->thread_id;
if ($admin->kill($worker_id)) {
echo "Killed worker connection {$worker_id}.";
}
$admin->close();
$worker->close();
?>Заключение
mysqli_kill() отправляет серверу MySQL команду завершить соединение по его идентификатору потока, возвращая true при успехе и false при ошибке. Функция наиболее полезна, когда нужно остановить дополнительное соединение — чтобы снять блокировки, прервать зависший запрос или завершить подозрительную сессию, — тогда как mysqli_close() остаётся правильным инструментом для закрытия собственного соединения.