Documentation

Оглавление

Предыдущий раздел

< Images

Следующий раздел

Уровень абстракции баз данных >

Эта страница

Очереди

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

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

Хотя вы можете найти более сложные расширения PHP для реализации очередей в ваших приложениях (такие как RabbitMQ), Phalcon предоставляет клиент для Beanstalk, в котором реализация очередей была вдохновлена Memcache. Этот клиент прост, легок, и полностью специализируется на работе очереди.

Внимание

Для работы с некоторыми результатами выполнения методов очередей необходима установка модуля Yaml. Пожалуйста, обратитесь к http://php.net/manual/book.yaml.php для получения подробной информации. Для PHP < 7 подходит Yaml 1.3.0. Для PHP >= 7 вам нужно воспользоваться Yaml >= 2.0.0.

Добавление заданий в очередь

После подключения к 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 Порт которой слушает Beanstalk 11300

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

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

<?php

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

Доступны следующие опции:

Опции Описание
priority Это целое число < 2 ** 32. Задания с меньшими значениями приоритета будут выполнены раньше, чем задачи с большими приоритетами. Самая первоочередная задача состоит 0; менее первоочередная задача 4294967295.
delay Это целое число секунд, которое пройдет, прежде чем задача будет добавлена в очередь. Работа будет в статусе “delayed” все это время.
ttr Время для запуска - это целое число секунд которое дается на то, чтобы позволить запустить эту задачу. Это время отсчитывается с момента, когда задача была добавлена.

Каждое задание, помещаемое в очередь, возвращает “id задачи”, разработчик может использовать для отслеживания статуса задачи:

<?php

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

Прием сообщений

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

<?php

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

    var_dump($message);

    $job->delete();
}

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

<?php

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

    var_dump($message);

    $job->delete();
}

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

Follow along: