Очереди задач для PHP: RabbitMQ, Beanstalkd и Gearman

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Очереди задач для 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 "Задача на ресай                    

Рекомендаций