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

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

Устанавливаем:
composer require --prefer-dist yiisoft/yii2-queue

В конфигурационный файл (для yii2 advanced это common/config/main.php) добавляем:
return [
    'components' => [
        'queue' => [
            'class' => \yii\queue\file\Queue::class,
            'path' => '@console/runtime/queue',
            'as log' => \yii\queue\LogBehavior::class,
        ],
    ],
    'bootstrap' => [
        'queue', // Компонент регистрирует свои консольные команды
    ],
];
тут, для примера, используется драйвер который сохраняет задания и текущую очередь в файлы на сервере, папка 'console/runtime/queue'.
Кроме этого, есть возможность сохранять данные в БД и др. см. используемые драйвера.
Секцию 'bootstrap' так же можно перенести в конфигурационный файл console/config/main.php.



Пример использования.

Как написал создатель данного расширения: «Из веба вы ставите задачи в очередь, а консольным процессом их выполняете». Т.е. пока займемся созданием задач.
Для каждого задания нужно создать отдельный класс. Например класс WriteJob, файл frontend/jobs/WriteJob.php:
<?php

namespace frontend\jobs;

use yii\base\Object;

class WriteJob extends Object implements \yii\queue\Job
{
    public $text;
    public $file;

    public function execute($queue)
    {
        file_put_contents($this->file, $this->text);
    }
}

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

Добавление задания в очередь (например в нужном действии контроллера):
//Отправка задания в очередь
$id = Yii::$app->queue->push(new WriteJob([
    'text' => 'test',
    'file' => Yii::$app->basePath . '/web/file.txt'
]));

Полученный id можно где-то сохранить и потом использовать для того, чтобы узнать статус данного задания – ждет выполнения/выполняется/выполнен:
// The job is waiting for execute.
Yii::$app->queue->isWaiting($id);

// Worker gets the job from queue, and executing it.
Yii::$app->queue->isReserved($id);

// Worker has executed the job.
Yii::$app->queue->isDone($id);

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

1. Из командной строки
yii queue/run

После выполнения команды будут выполнены все задания по очереди и потом она завершит работу.
Команду можно использовать для обработки заданий с помощью cron.


Так же есть возможность запустить обработку очереди непрерывно (в режиме демона) используя команду listen:
yii queue/listen

При добавлении новых заданий, они будут выполнены автоматически.Так же используется параметр для указания паузы между проверками очереди (в секундах):
yii queue/listen [delay]
у меня выполнялись сразу несмотря на параметр

Обе команды имеют несколько опций. Например выведем состояние обработки очереди в консоль с подсветкой:



Подробнее https://github.com/yiisoft/yii2-queue/blob/master/docs/guide-ru/driver-file.md


2. Из скрипта

/** @var yii\queue\file\Queue $queue */
$queue = Yii::$app->queue; 
$queue->run();

После выполнения задачи созданной для примера, должен появиться файл frontend/web/file.txt с содержимым "test".

Можно вывести в панель отладки инфо про текущие очереди, для этого добавить в конфигурационный файл (например в common/config/main.php) блок:
return [
    'modules' => [
        'debug' => [
            'class' => \yii\debug\Module::class,
            'panels' => [
                'queue' => \yii\queue\debug\Panel::class,
            ],
        ],
    ],

Результат: