Серверы очередей заданий — это очень популярный инструмент, одним из применений которого является использование его как буфера между ядром бизнес-приложения и сервисом почтовых рассылок.
Сервер очередей beanstalk написан на c и имеет отличные показатели стабильности, масштабируемости и быстродействия. По многим параметрам он легко конкурирует с другими, такими как Apache ActiveMQ, MQS, Spread и RabbitMQ.
Для использования функционала beanstalk в yii 2.0, можно воспользоваться расширением udokmeci/yii2-beanstalk.
Расширение udokmeci/yii2-beanstalk представляет из себя веб и консольный интерфейс beanstalk через php-клиент pda/pheanstalk.
Установка
Для установки расширения достаточно добавить в раздел require файла composer.json строку «udokmeci/yii2-beanstalk» : «dev-master» и выполнить команду composer update.
Настройка
В конфигурационных файлах веб и консольной части приложения нужно описать компонент:
'beanstalk'=>[
'class' => 'udokmeci\yii2beanstalk',
'host'=> "127.0.0.1", // default host
'port'=>11300, //default port
'connectTimeout'=> 1,
'sleep' => false, // or int for usleep after every job
],
И только в настройках консольного приложения добавить:
'params' => $params
// add you controller with name and class name next to params.
'controllerMap' => [
'worker'=>[
'class' => 'app\commands\WorkerController',
]
],
Начинаем работу
Осталось запустить beandstalkd и обращаться к нему подобным образом:
\Yii::$app->beanstalk->putInTube('tube', $mixedData ,$priority,$delay);
Воркеры
В качестве воркеров будет встроенный контроллер, который в бесконечном цикле ожидает новые задания. Большая часть кода реализована в классе BeanstalkController. Все что нужно сделать — наследовать от него контроллер с действием подобным описанному ниже.
Контроллер
Создаем контроллер в каталоге commands. Называем его логичным образом и наследуем от udokmeci\yii2beanstalk\BeanstalkController.
Пример контроллера:
namespace app\commands;
use udokmeci\yii2beanstalk\BeanstalkController;
use yii\helpers\Console;
use Yii;
class WorkerController extends BeanstalkController
{
public function listenTubes(){
return ["tube"];
}
}
Пример действия:
public function actionTube($job){
$sentData = $job->getData();
try {
// something useful here
if($everthingIsAllRight == true){
fwrite(STDOUT, Console::ansiFormat("- Everything is allright"."\n", [Console::FG_GREEN]));
return self::DELETE; //Deletes the job from beanstalkd
}
fwrite(STDOUT, Console::ansiFormat("- Not everything is allright!!!"."\n", [Console::FG_GREEN]));
return self::DELAY; //Delays the job for later try
// if you return anything else job is released.
} catch (\Exception $e) {
//If there is anything to do.
fwrite(STDERR, Console::ansiFormat($e."\n", [Console::FG_RED]));
return self::DELETE;
}
}
Запускаем воркер
Для запуска нужного воркера, то есть нашего нового контроллера, выполняем в консоли команду:
./yii worker
Действует.
Создаем контроллер в каталоге commnds
должно быть commands
Спасибо за внимательность.
Хочу еще добавить, что для меня
./yii worker — не работает
следует запустить
php ./yii worker
chmod +x yii
Интересует вопрос. Есть ли возможность очистить очередь?
Допустим у меня в очереди висит на исполнение 1000 задач, но в определенный момент актуальность задач теряется, и хочется очистить очередь.
Покопавшись в исходниках модуля не нашел подобного метода.
Один из простых вариантов — это в начале воркера поставить return true;
Перезапустив воркер, очередь очиститься.