Серверы очередей заданий — это очень популярный инструмент, одним из применений которого является использование его как буфера между ядром бизнес-приложения и сервисом почтовых рассылок.
Сервер очередей 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;
Перезапустив воркер, очередь очиститься.