Получение результата асинхронного запроса
Введение
MySQLi — это популярное расширение PHP, которое позволяет разработчикам подключаться к базам данных MySQL и выполнять различные операции. MySQLi поддерживает неблокирующий запуск запросов, что позволяет разработчикам отправлять запрос и продолжать выполнение другого кода без ожидания результата. Результаты сохраняются в буфере и могут быть получены позже с помощью mysqli_reap_async_query().
В этом подробном руководстве мы объясним, как работают неблокирующие запросы MySQLi, как они реализуются, а также приведём примеры и варианты использования.
Что такое неблокирующее выполнение запросов MySQLi?
mysqli_reap_async_query() — это функция PHP, которая извлекает набор результатов запроса, инициированного с помощью mysqli_send_query(). Она не выполняет сам запрос; вместо этого она получает результат после отправки запроса. Эта функция необходима для неблокирующих операций с базой данных в PHP. Обратите внимание, что mysqli_store_result() блокирует выполнение до тех пор, пока все результаты не станут доступны, и его не следует использовать в асинхронных рабочих процессах.
Как работают неблокирующие запросы MySQLi
Неблокирующие запросы MySQLi работают за счёт разделения инициации запроса и извлечения результатов. Сначала mysqli_send_query() отправляет запрос на сервер MySQL и немедленно возвращает управление. Сервер обрабатывает запрос в фоновом режиме. Как только он будет готов, mysqli_reap_async_query() извлекает набор результатов из буфера соединения.
Примечание: Хотя mysqli_send_query() является неблокирующим, извлечение результатов с помощью mysqli_reap_async_query() будет блокировать выполнение, если результаты ещё не доступны. Истинное асинхронное выполнение в PHP обычно требует внешних библиотек или циклов событий.
Вот пример того, как использовать неблокирующие запросы MySQLi:
<?php
// Create a connection to the MySQL server
$conn = mysqli_connect("localhost", "username", "password", "database");
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
// Create a query
$query = "SELECT * FROM table";
// Initiate the query asynchronously
if (!mysqli_send_query($conn, $query)) {
die("Query failed: " . mysqli_error($conn));
}
// Execute other code here without blocking
// Fetch the result when ready
$result = mysqli_reap_async_query($conn);
if ($result) {
// Process $result
} else {
// Results not ready yet or an error occurred
echo "Result not ready: " . mysqli_error($conn);
}
?>В этом примере запрос инициируется асинхронно с помощью mysqli_send_query(). Скрипт продолжает выполнение, а mysqli_reap_async_query() вызывается позже для получения сохранённых результатов.
Как использовать неблокирующие запросы MySQLi
Чтобы использовать неблокирующие запросы MySQLi, выполните следующие шаги:
- Установите соединение с сервером MySQL с помощью
mysqli_connect(). - Инициируйте запрос асинхронно с помощью
mysqli_send_query(). - Выполняйте другие задачи, пока запрос работает в фоновом режиме.
- Извлеките набор результатов с помощью
mysqli_reap_async_query(). - Обработайте возвращённый объект
mysqli_result.
Примечание: mysqli_poll() — это отдельная функция, используемая для проверки состояния нескольких соединений. Она ожидает массив соединений и возвращает количество готовых соединений, а не сами результаты запроса.
Варианты использования неблокирующих запросов MySQLi
Неблокирующие запросы MySQLi полезны для разработчиков PHP, которым необходимо выполнять несколько запросов параллельно или запускать длительные запросы без блокировки выполнения другого кода. Вот некоторые практические варианты использования этого подхода:
1. Параллельное выполнение запросов
Разработчики могут использовать неблокирующие запросы MySQLi для выполнения нескольких независимых запросов параллельно. Отправляя каждый запрос с помощью mysqli_send_query() и чередуя другую логику, приложения могут сократить общее время ожидания при получении данных из нескольких таблиц или сервисов.
2. Длительные запросы
Длительные запросы могут быть инициированы асинхронно, чтобы PHP-скрипт мог выполнять другие задачи, такие как ведение журнала, обновление интерфейса или обработка ввода пользователя, пока база данных завершает операцию.
3. Приложения реального времени
Приложениям, требующим частого опроса данных или обновлений в реальном времени, можно инициировать запросы без заморозки основного потока выполнения. Это особенно полезно для инструментов мониторинга на основе CLI или легких веб-эндпоинтов, которым необходимо быстро возвращать ответ.
4. Асинхронная обработка данных
Разработчики могут переносить тяжелые задачи извлечения данных в фоновый режим, пока основной скрипт обрабатывает другие потоки данных, что повышает общую пропускную способность при пакетной обработке или в ETL-рабочих процессах.
Преимущества неблокирующих запросов MySQLi
Неблокирующие запросы MySQLi предлагают несколько преимуществ для разработчиков PHP:
1. Повышенная производительность
Выполнение запросов асинхронно не блокирует выполнение другого кода, что приводит к более быстрой работе приложения. Это особенно полезно для приложений, которые агрегируют данные из нескольких источников или обрабатывают запросы с высокой степенью параллелизма.
2. Более эффективное использование ресурсов
Неблокирующее выполнение позволяет процессу PHP оставаться отзывчивым во время ожидания операций с базой данных, сокращая время простоя и улучшая использование ресурсов сервера.
3. Упрощенное управление фоновыми задачами
Разработчики могут цепочкой выполнять несколько операций с базой данных без вложенности обратных вызовов или сложных машин состояний, что делает код более читаемым и простым в поддержке для стандартных процедурных PHP-скриптов.
Заключение
Неблокирующие запросы MySQLi — это мощный подход для разработчиков PHP, которым необходимо инициировать запросы с помощью MySQLi без ожидания немедленных результатов. Он позволяет разработчикам отправлять запросы в фоновом режиме и продолжать выполнение другого кода. Результаты запроса сохраняются в буфере, который можно получить позже с помощью mysqli_reap_async_query(), когда разработчик будет готов их обработать. Этот подход может значительно улучшить производительность PHP-приложений, которым необходимо выполнять несколько запросов одновременно или запускать длительные запросы. Разработчики также могут использовать этот подход для создания PHP-приложений реального времени или для задач асинхронной обработки данных. Благодаря множеству преимуществ неблокирующее выполнение запросов MySQLi является ценным инструментом для разработчиков PHP.
Практика
Что верно относительно выполнения запроса MySQL в PHP с использованием метода асинхронного запроса?