Очереди задач в PHP: полное практическое руководство

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

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

Начать курс

Работа с очередями задач в PHP: полное практическое руководство

В современных веб-приложениях часто возникает необходимость выполнять длительные или ресурсоемкие операции, не заставляя пользователя ждать. Отправка email-рассылок, генерация PDF-отчетов, обработка изображений, парсинг данных — все эти задачи идеально подходят для асинхронной обработки через очереди задач. В этой статье мы подробно разберем, как организовать работу с очередями задач в PHP на практике, рассмотрим популярные инструменты и напишем рабочий код.

Что такое очередь задач и зачем она нужна?

Очередь задач (job queue) — это механизм, который позволяет помещать задачи в очередь и выполнять их асинхронно, вне основного потока обработки HTTP-запроса. Вместо того чтобы выполнять тяжелую операцию синхронно (например, отправлять 1000 писем при регистрации), вы просто помещаете задачу в очередь и немедленно возвращаете пользователю ответ. Фоновый воркер (worker) забирает задачи из очереди и выполняет их одну за другой.

Основные преимущества использования очередей:

  • Повышение производительности — пользователь не ждет завершения тяжелых операций
  • Устойчивость к сбоям — если задача не выполнилась, она возвращается в очередь для повторной обработки
  • Масштабируемость — можно запускать любое количество воркеров для параллельной обработки
  • Буферизация нагрузки — очередь сглаживает пиковые нагрузки на систему

Популярные инструменты для работы с очередями в PHP

1. RabbitMQ

RabbitMQ — это мощный брокер сообщений, поддерживающий протокол AMQP. Он идеально подходит для сложных сценариев маршрутизации и требует установки отдельного сервера.

// Установка через Composer
composer require php-amqplib/php-amqplib

// Отправка задачи в очередь
<?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([
    'to' => 'user@example.com',
    'subject' => 'Привет!',
    'body' => 'Тестовое сообщение'
]);

$msg = new AMQPMessage($data, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
$channel->basic_publish($msg, '', 'email_queue');
$channel->close();
$connection->close();
?>

2. Redis + php-resque

Redis — это быстрое in-memory хранилище, которое отлично подходит для простых очередей. php-resque — это PHP-порт популярной Ruby-библиотеки Resque.

// Установка
composer require chrisboulton/php-resque

// Создание задачи
<?php
class SendEmailJob
{
    public function perform()
    {
        $args = $this->args;
        // Логика отправки email
        mail($args['to'], $args['subject'], $args['body']);
    }
}

// Добавление в очередь
Resque::setBackend('localhost:6379');
Resque::enqueue('default', 'SendEmailJob', [
    'to' => 'user@example.com',
    'subject' => 'Привет',
    'body' => 'Тест'
]);
?>

3. Beanstalkd

Beanstalkd — это легковесный, быстрый и надежный менеджер очередей. Он прост в установке и настройке, что делает его отличным выбором для небольших проектов.

// Установка
composer require pda/pheanstalk

// Отправка задачи
<?php
require_once 'vendor/autoload.php';

use Pheanstalk\Pheanstalk;

$pheanstalk = Pheanstalk::create('127.0.0.1:11300');
$pheanstalk->useTube('email_tube')->put(
    json_encode(['to' => 'user@example.com', 'subject' => 'Test']),
    Pheanstalk::DEFAULT_PRIORITY,
    Pheanstalk::DEFAULT_DELAY,
    60 // TTR (time to run)
);
?>

Практический пример: система отправки email через очередь

Давайте создадим полноценную систему обработки очередей на примере отправки email-уведомлений. Мы будем использовать Beanstalkd как брокер и напишем воркер, который будет обрабатывать задачи.

Шаг 1: Подготовка окружения

Установите Beanstalkd на сервер:

# Ubuntu/Debian
sudo apt-get install beanstalkd

# macOS
brew install beanstalkd

# Запуск сервера
beanstalkd -l 127.0.0.1 -p 11300

Шаг 2: Создание продюсера (Producer)

Продюсер отвечает за добавление задач в очередь. Обычно это происходит в контроллере или сервисе.

<?php
// producer.php
require_once 'vendor/autoload.php';

use Pheanstalk\Pheanstalk;

class EmailQueueProducer
{
    private $pheanstalk;
    
    public function __construct()
    {
        $this->pheanstalk = Pheanstalk::create('127.0.0.1:11300');
    }
    
    public function addToQueue(array $emailData): void
    {
        $jobData = json_encode([
            'to' => $emailData['to'],
            'subject' => $emailData['subject'],
            'body' => $emailData['body'],
            'created_at' => date('Y-m-d H:i:s')
        ]);
        
        $this->pheanstalk
            ->useTube('email_tube')
            ->put($jobData, 1024, 0, 120);
    }
}

// Использование
$producer = new EmailQueueProducer();
$producer->addToQueue([
    'to' => 'user@example.com',
    'subject' => 'Добро пожаловать!',
    'body' => 'Спасибо за регистрацию на нашем сайте.'
]);
?>

Шаг 3: Создание воркера (Worker)

Воркер — это скрипт, который работает в фоне и обрабатывает задачи из очереди.

<?php
// worker.php
require_once 'vendor/autoload.php';

use Pheanstalk                

Блоги

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