Очереди
Такие задачи, как обработка видео, изменение размера изображений или отправка электронных писем, не подходят для выполнения онлайн или в реальном времени, так как это может замедлить время загрузки страниц, что повлияет на пользовательский опыт.
Лучшее решение в данном случае — реализация фоновых задач. Веб-приложение должно поместить задачу в очередь и дождаться её обработки.
Хотя вы можете найти более сложные расширения PHP для решения задач очереди в ваших приложениях, таких как RabbitMQ; Phalcon предоставляет клиент для Beanstalk, бэкенда очереди задач, вдохновленного Memcache. Он прост, легок и полностью специализирован на очереди задач.
Добавление задач в очередь
После подключения к Bens можно вставить столько задач, сколько необходимо. Разработчик может определить структуру сообщения в соответствии с потребностями приложения:
//Connect to the queue
$queue = new Phalcon\Queue\Beanstalk(array(
'host' => '192.168.0.21'
));
//Insert the job in the queue
$queue->put(array('processVideo' => 4871));
Доступные параметры подключения:
| Параметр | Описание | Значение по умолчанию |
|---|---|---|
| host | IP-адрес сервера beanstalk | 127.0.0.1 |
| port | Порт подключения | 11300 |
В приведенном выше примере мы сохранили сообщение, которое позволит фоновой задаче обработать видео. Сообщение хранится в очереди немедленно и не имеет определенного времени жизни.
Дополнительные параметры, такие как время выполнения, приоритет и задержка, можно передать в качестве второго параметра:
//Insert the job in the queue with options
$queue->put(
array('processVideo' => 4871),
array('priority' => 250, 'delay' => 10, 'ttr' => 3600)
);
Доступны следующие параметры:
| Параметр | Описание |
|---|---|
| priority | Целое число < 2**32. Задачи с меньшими значениями приоритета будут запланированы до задач с большими приоритетами. Наивысший приоритет — 0; наименьший приоритет — 4 294 967 295. |
| delay | Целое число секунд ожидания перед помещением задачи в готовую очередь. Задача будет находиться в состоянии «задержки» в течение этого времени. |
| ttr | Время выполнения — целое число секунд, позволяющее работнику выполнить эту задачу. Это время отсчитывается с момента, когда работник зарезервировал эту задачу. |
Каждая задача, помещенная в очередь, возвращает «идентификатор задачи», который разработчик может использовать для отслеживания состояния задачи:
$jobId = $queue->put(array('processVideo' => 4871));
Получение сообщений
После того, как задача помещена в очередь, эти сообщения могут быть обработаны фоновой задачей, которая имеет достаточно времени для завершения задачи:
while (($job = $queue->peekReady()) !== false) {
$message = $job->getBody();
var_dump($message);
$job->delete();
}
Задачи должны быть удалены из очереди, чтобы избежать двойной обработки. Если реализовано несколько фоновых работников, задачи должны быть «зарезервированы», чтобы другие работники не перерабатывали их, пока другие работники их зарезервировали:
while ($queue->peekReady() !== false) {
$job = $queue->reserve();
$message = $job->getBody();
var_dump($message);
$job->delete();
}
Наш клиент реализует базовый набор функций, предоставляемых Beanstalkd, но достаточно, чтобы позволить вам создавать приложения, реализующие очереди.
© 2011–2016 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/2.0.0/reference/queue.html