W3docs

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() остаётся правильным инструментом для закрытия собственного соединения.

Практика

Практика
Какая функция используется в PHP для завершения выполнения скриптов?
Какая функция используется в PHP для завершения выполнения скриптов?
Was this page helpful?