Очереди задач для PHP: RabbitMQ, Beanstalkd и Gearman
В современных веб-приложениях часто возникает необходимость выполнять длительные или ресурсоемкие операции асинхронно, не заставляя пользователя ждать ответа. Типичные примеры: отправка email-рассылок, генерация отчетов, обработка изображений, взаимодействие с внешними API. Для решения этих задач в PHP используются очереди задач (job queues). Они позволяют отделить логику запроса от фоновой обработки, повышая отзывчивость интерфейса и масштабируемость системы.
В этой статье мы подробно рассмотрим три популярных инструмента для организации очередей в PHP: RabbitMQ, Beanstalkd и Gearman. Вы узнаете их особенности, архитектуру, примеры использования и научитесь выбирать подходящее решение для своего проекта.
1. RabbitMQ
RabbitMQ — это мощный брокер сообщений, реализующий протокол AMQP (Advanced Message Queuing Protocol). Он поддерживает сложные сценарии маршрутизации, обменники (exchanges), очереди с приоритетами, подтверждения доставки и многое другое. RabbitMQ идеально подходит для микросервисной архитектуры и систем, где требуется надежная доставка сообщений.
Установка и подключение
Для работы с RabbitMQ в PHP используется библиотека php-amqplib. Установка через Composer:
composer require php-amqplib/php-amqplib
Пример: отправка email-уведомления
Создадим продюсера (отправителя) и потребителя (обработчика) для фоновой отправки писем.
Файл producer.php:
<?php
require_once 'vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('email_queue', false, true, false, false);
$data = json_encode([
'email' => 'user@example.com',
'subject' => 'Добро пожаловать!',
'body' => 'Спасибо за регистрацию.'
]);
$msg = new AMQPMessage($data, [
'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT
]);
$channel->basic_publish($msg, '', 'email_queue');
echo " [x] Отправлено сообщение\n";
$channel->close();
$connection->close();
Файл consumer.php:
<?php
require_once 'vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('email_queue', false, true, false, false);
echo " [*] Ожидание сообщений. Для выхода нажмите CTRL+C\n";
$callback = function ($msg) {
$data = json_decode($msg->body, true);
// Имитация отправки email
sleep(2);
echo " [x] Отправлено письмо на {$data['email']}\n";
$msg->ack();
};
$channel->basic_qos(null, 1, null);
$channel->basic_consume('email_queue', '', false, false, false, false, $callback);
while ($channel->is_consuming()) {
$channel->wait();
}
$channel->close();
$connection->close();
2. Beanstalkd
Beanstalkd — это легковесный, быстрый и простой в использовании менеджер очередей. Он работает по протоколу, похожему на memcached, и отлично подходит для задач, где не требуется сложная маршрутизация. Beanstalkd поддерживает приоритеты, задержки (delay) и time-to-run (TTR).
Установка
Для PHP существует клиент pda/pheanstalk:
composer require pda/pheanstalk
Пример: обработка изображений
Предположим, нам нужно создавать миниатюры для загруженных изображений.
Файл producer.php:
<?php
require_once 'vendor/autoload.php';
use Pheanstalk\Pheanstalk;
$pheanstalk = Pheanstalk::create('127.0.0.1');
$jobData = json_encode([
'image_path' => '/uploads/photo.jpg',
'sizes' => ['150x150', '300x300']
]);
$pheanstalk->useTube('image_resize')->put($jobData);
echo "Задача на ресай Также в библиотеке
Работа с Excel в Go (Golang): библиотеки exelize и tealeg/xlsx
Конфигурация приложений Java: библиотеки и инструменты для управления настройками
Работа с CSV в PHP: чтение, запись и обработка данных
Swift Package Manager для Swift: полное руководство с примерами
Кэширование в C# (.NET): Redis и другие решения