
Для фреймворка 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, ], ], ],
Результат:
