Такие действия, как обработка видео, изменение размера изображений или отправка электронных писем, не подходят для выполнения в интернете или в режиме реального времени, поскольку это может замедлить время загрузки страниц и серьезно повлиять на пользовательский интерфейс.

Лучшим решением здесь является реализация фоновых заданий. Веб-приложение помещает задания в очередь, которая будет обрабатываться отдельно.

В то время как вы можете найти более сложные расширения PHP для решения очередей в ваших приложениях, таких как RabbitMQ; Phalcon предоставляет клиент для Beanstalk, бэкэнд очереди заданий, вдохновленный Memcached.Это простой, легкий и полностью специализированный для работы в очереди.

Постановка заданий в очередь

После подключения к Beanstalk вы можете вставить столько заданий, сколько требуется. Вы можете определить структуру сообщения в соответствии с потребностями приложения:

<?php

use Phalcon\Queue\Beanstalk;

// Подключение к очереди
$queue = new Beanstalk(
    [
        'host' => '192.168.0.21',
        'port' => '11300',
    ]
);

// Вставка задания в очередь
$queue->put(
    [
        'processVideo' => 4871,
    ]
);

Доступные варианты подключения:

ПараметрОписаниеПо умолчанию
host IP, где расположен сервер beanstalk 127.0.0.1
port Порт подключения 11300

В приведенном выше примере мы сохранили сообщение, которое позволит фоновое задание для обработки видео. Сообщение сохраняется в очереди немедленно и не имеет определенного времени для жизни.

Дополнительные опции: время запуска, приоритет и задержка могут быть переданы в качестве второго параметра:

<?php

// Вставить задание в очередь с опциями
$queue->put(
    [
        'processVideo' => 4871,
    ],
    [
        'priority' => 250,
        'delay'    => 10,
        'ttr'      => 3600,
    ]
);

Доступны следующие параметры:

ПараметрОписание
priority Это целое число < 2**32. Задания с меньшими значениями приоритета будут запланированы перед заданиями с большими приоритетами. Наиболее неотложным приоритетом является 0; наименее неотложным приоритетом является 4,294,967,295.
delay Это целое число секунд ожидания перед вводом задания в очереди. В течение этого времени задание будет находиться в состоянии "отложено".
ttr Время выполнения-целое число секунд, за которое обработчик может выполнить это задание. Это время отсчитывается с того момента, как обработчик резервирует эту работу.

Каждое задание, помещенное в очередь, возвращает job id, который можно использовать для отслеживания состояния задания:

<?php

$jobId = $queue->put(
    [
        'processVideo' => 4871,
    ]
);

Получение Сообщений

Как только задание помещается в очередь, эти сообщения могут быть использованы фоновым обработчиком, у которого будет достаточно времени для выполнения задачи:

<?php

while (($job = $queue->peekReady()) !== false) {
    $message = $job->getBody();

    var_dump($message);

    $job->delete();
}

Задания должны быть удалены из очереди, чтобы избежать двойной обработки. Если задействованы несколько обработчиков фонового задания, задания должны быть reserved, чтобы другие обработчики не перепрограммировали их, пока другие обработчики их зарезервировали:

<?php

while (($job = $queue->reserve()) !== false) {
    $message = $job->getBody();

    var_dump($message);

    $job->delete();
}

Наш клиент реализует базовый набор функций, предоставляемых Beanstalkd, но достаточно, чтобы позволить вам создавать приложения, реализующие очереди.

Расширенный поиск

Несколько очередей

Beanstalkd поддерживает несколько очередей (называемых «трубами»), позволяя одному серверу очереди выступать в качестве концентратора для различных обработчиков. Phalcon поддерживает это легко.

Просмотр труб, доступных на сервере, и выбор трубки для объекта очереди:

<?php

$tube_array = $queue->listTubes();

$queue->choose('myOtherTube');

Вся последующая работа с $queue теперь манипулирует myOtherTube , а не default.

Вы можете посмотреть, какая трубка используется в очереди.

<?php

$current_tube = $queue->listTubeUsed(); 

Манипуляция труб

Трубы могут быть приостановлены и возобновлены, если необходимо. Пример ниже останавливает myOtherTube в течение 3 минут.

<?php

$queue->pauseTube('myOtherTube', 180);

Установка задержки на 0 возобновит нормальную работу.

<?php

$queue->pauseTube('myOtherTube', 0);

Статус сервера

Вы можете получить информацию обо всем сервере или конкретных трубах.

<?php

$server_stats = $queue->stats();

$tube_stats = $queue->statsTube('myOtherTube');

$server_status = $queue->readStatus();

Управление заданиями

Beanstalkd поддерживает возможность управления заданиями как с идеей задержки задания, так и с удалением задания из очереди для последующей обработки.

Захоронение задания обычно используется для решения потенциальных проблем, которые могут быть решены за пределами обработчика. Это берет работу и помещает ее в похороненную очередь.

<?php

$job = $queue->reserve();
$job->bury();

Список скрытых заданий хранится на сервере. Можно проверить первое скрытое задание в очереди.

<?php

$job_data = $queue->peekBuried();

Если похороненная очередь пуста, это возвратит false, иначе это возвратит объект задания.

Вы можете пнуть первые [N] похороненных заданий в похороненной очереди, чтобы поместить его / их обратно в очередь готовности. Ниже приведен пример пинать первые 3 похороненных работы.

<?php

$queue->kick(3);

Освобождение заданий обратно в очередь готовности может быть выполнено с дополнительной задержкой. Это удобно для временных ошибок при обработке задания. Ниже приведен пример установки низкого (100) приоритета и 3-минутной задержки задания.

<?php

$job = $queue->reserve();

$job->release(100, 180);

Приоритет и задержка такие же, как при постановке задания в очередь.

Проверка задания в очереди может быть выполнена с помощью jobPeek ($job_id). Приведенный ниже пример попытки заглянуть в код задания 5.

<?php

$queue->jobPeek(5)

Задания, которые были удаленны не могут быть проверены и вернут false. Готовые, скрытые и отложенные задания возвращают объект задания.

Дальнейшее чтение

Текст протокола содержит все внутренние рабочие детали BeanstalkD и часто фактически  считается документацией для BeanstalkD.