Перейти к содержимому

опрос

В этой статье мы обсудим функцию mysqli_poll() в PHP, которая используется для опроса подключений.

Введение в функцию mysqli_poll()

Функция mysqli_poll() — это встроенная функция PHP, предназначенная для опроса подключений. Её можно использовать для проверки наличия данных на подключении перед их чтением. Функцию mysqli_poll() можно применять совместно с неблокирующим вводом-выводом (non-blocking I/O), чтобы сделать ваше приложение более отзывчивым.

Важно: mysqli_poll() работает только с драйвером MySQLND. Она недоступна при использовании более старого драйвера libmysql.

Как использовать функцию mysqli_poll()

Использование функции mysqli_poll() довольно простое. Вот пример:

Как использовать функцию mysqli_poll()?

php
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");

if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: " . $mysqli->connect_error;
    exit();
}

// Enable non-blocking mode for asynchronous queries
$mysqli->options(MYSQLI_OPT_NONBLOCK, 1);

$links = [$mysqli];
$error = [];
$reject = [];
$timeout = 10;

while (!empty($links)) {
    // mysqli_poll modifies the $links array by reference, keeping only ready connections
    $ready = mysqli_poll($links, $error, $reject, $timeout, 0);
    
    if ($ready === false) {
        // Handle poll failure or timeout
        echo "Poll failed or timed out.\n";
        break;
    }

    foreach ($links as $link) {
        if ($result = $link->reap_async_query()) {
            // process the result set
            $result->free();
        } else {
            // handle the error
            echo "Query error: " . $link->error . "\n";
        }
    }
}

$mysqli->close();
?>

В этом примере мы сначала создаём новый объект MySQLi с помощью конструктора mysqli(). Затем проверяем успешность подключения с помощью свойства connect_errno. Если подключение успешно, мы включаем неблокирующий режим с помощью mysqli::options(MYSQLI_OPT_NONBLOCK, 1), что необходимо для асинхронных запросов. Далее создаём массив подключений, которые нужно опросить, а также пустые массивы $error и $reject. Массив $error будет заполнен сообщениями об ошибках от подключений, которые не удалось опросить, а $reject содержит подключения, которые активно отклонили запрос на опрос. Мы входим в цикл, который выполняется до тех пор, пока есть подключения для опроса. Внутри цикла вызываем mysqli_poll() с массивом подключений (передаётся по ссылке), массивами ошибок/отклонений и таймаутом в 10 секунд. Если на одном или нескольких подключениях есть данные, mysqli_poll() возвращает количество готовых подключений и изменяет массив $links, оставляя в нём только готовые подключения. Затем мы проходим по готовым подключениям и вызываем метод reap_async_query() для каждого, чтобы получить доступные данные. Если mysqli_poll() возвращает false, мы обрабатываем ошибку или таймаут и выходим из цикла. В конце закрываем соединение.

Примечание: Для сложных асинхронных задач рассмотрите современные альтернативы, такие как ReactPHP или Swoole, которые предоставляют более надёжные архитектуры событийных циклов для PHP.

Заключение

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

Практика

Какие основные шаги необходимы для создания простого опроса с помощью PHP?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.