W3docs

Полное руководство по функции mysqli_thread_id в PHP

Узнайте, как работает mysqli_thread_id() в PHP: что возвращает, когда применяется и как правильно использовать в процедурном и ООП-стилях.

При работе с базами данных MySQL в PHP расширение mysqli предоставляет множество функций для управления соединениями и запросами. Одна из них — mysqli_thread_id(), которая возвращает идентификатор потока — число, которое сервер MySQL присваивает вашему соединению на всё время его существования.

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

Что такое функция mysqli_thread_id?

mysqli_thread_id() возвращает уникальный идентификатор соединения (потока), который сервер MySQL назначил текущему соединению. Это то же число, которое возвращает SELECT CONNECTION_ID(), и именно его передают в оператор KILL, чтобы завершить зависшее соединение.

mysqli_thread_id(mysqli $mysql): int
  • Параметр$mysql: объект соединения, возвращённый mysqli_connect() (или экземпляр new mysqli(...)).
  • Возвращаемое значениеint: идентификатор потока для соединения.

Идентификатор действителен только в течение времени жизни этого соединения. Как только соединение закрывается (или обрывается и восстанавливается заново), MySQL выдаёт новый идентификатор потока — поэтому никогда не кешируйте его между запросами и не считайте стабильным.

Процедурный вызов mysqli_thread_id($connection) и объектный стиль $connection->thread_id равнозначны.

Когда это используется?

Идентификатор потока — диагностический и административный инструмент, а не то, что нужно большинству CRUD-кода. Обращайтесь к нему, когда хотите:

  • Завершить зависшее соединение. Получите идентификатор, а затем из другой сессии выполните KILL <id>, чтобы прервать долго выполняющийся запрос.
  • Отследить соединение в журнале медленных запросов или в SHOW PROCESSLIST, где каждая строка идентифицируется этим же идентификатором.
  • Отладить пул соединений / постоянные соединения, чтобы убедиться, повторно ли используется соединение или открывается новое.

Как использовать mysqli_thread_id

1. Открытие соединения

mysqli_thread_id() требует активного соединения, поэтому сначала подключитесь:

<?php

$host     = 'localhost';
$user     = 'username';
$password = 'password';
$database = 'mydatabase';

$connection = mysqli_connect($host, $user, $password, $database);

if (!$connection) {
    die('Connection failed: ' . mysqli_connect_error());
}

2. Получение идентификатора потока

Имея действительное соединение, вызовите функцию и используйте значение:

<?php

$threadId = mysqli_thread_id($connection);
echo "Thread ID: " . $threadId; // e.g. Thread ID: 42

Эквивалент в объектно-ориентированном стиле читает свойство вместо вызова функции:

<?php

$mysqli   = new mysqli($host, $user, $password, $database);
$threadId = $mysqli->thread_id;

echo "Thread ID: " . $threadId;

3. Использование идентификатора для завершения соединения (необязательно)

Распространённый практический сценарий — получить идентификатор, чтобы другая сессия могла завершить текущую в случае зависания:

<?php

$threadId = mysqli_thread_id($connection);

// From another connection you could now run:
//   KILL 42;
// mysqli_kill() does this for the current connection object:
mysqli_kill($connection, $threadId);

Распространённые ошибки

  • Не кешируйте идентификатор. Он меняется каждый раз при переустановке соединения, поэтому хранить его в сессии или базе данных бессмысленно после повторного подключения.
  • Передавайте действительное соединение. Вызов функции с неудачным или уже закрытым соединением вызывает предупреждение или ошибку — всегда проверяйте результат mysqli_connect() заранее, как показано выше.
  • Идентификатор идентифицирует соединение, а не PHP-запрос. Два скрипта, использующие одно постоянное соединение, могут сообщать одинаковый идентификатор потока; два запроса на отдельных соединениях будут различаться.

Заключение

mysqli_thread_id() возвращает идентификатор текущего соединения с сервером MySQL — то же значение, которое используется в CONNECTION_ID(), SHOW PROCESSLIST и KILL. Это небольшой, но удобный инструмент для мониторинга, отладки и управления соединениями. Помните, что идентификатор живёт и умирает вместе с соединением, поэтому читайте его при необходимости, а не кешируйте.

Дополнительные функции для работы с соединениями см. в разделах Подключение к MySQL и Руководство по MySQL в PHP.

Практика

Практика
Что возвращает mysqli_thread_id()?
Что возвращает mysqli_thread_id()?
Was this page helpful?