jc-it / yii2-job-queue
作业队列实现。
v2.0.2
2022-08-16 11:31 UTC
Requires
- php: >=8.0
- league/tactician: ^1.1.0
- pda/pheanstalk: ^4.0.3
- yiisoft/yii2: ^2.0
Requires (Dev)
README
此扩展提供了一个实现队列、工作进程和作业的包。
$ composer require jc-it/yii2-job-queue
或者添加
"jc-it/yii2-job-queue": "<latest version>"
到您的 composer.json
文件的 require
部分。
配置
- 您需要安装 Beanstalk(《sudo apt install beanstalkd》)
- 应用配置
'container' => [ 'definitions' => [ \League\Tactician\CommandBus::class => function(\yii\di\Container $container) { return new \League\Tactician\CommandBus([ new \League\Tactician\Handler\CommandHandlerMiddleware ( $container->get(\League\Tactician\Handler\CommandNameExtractor\CommandNameExtractor::class), $container->get(\League\Tactician\Handler\Locator\HandlerLocator::class), $container->get(\League\Tactician\Handler\MethodNameInflector\MethodNameInflector::class) ) ]); }, \JCIT\jobqueue\components\ContainerMapLocator::class => function(\yii\di\Container $container) { $result = new \JCIT\jobqueue\components\ContainerMapLocator($container); // Register handlers here // i.e. $result->setHandlerForCommand(\JCIT\jobqueue\jobs\HelloJob::class, \JCIT\jobqueue\jobHandlers\HelloHandler::class); return $result; }, \League\Tactician\Handler\CommandNameExtractor\CommandNameExtractor::class => \League\Tactician\Handler\CommandNameExtractor\ClassNameExtractor::class, \League\Tactician\Handler\Locator\HandlerLocator::class => \JCIT\jobqueue\components\ContainerMapLocator::class, \JCIT\jobqueue\interfaces\JobFactoryInterface::class => \JCIT\jobqueue\factories\JobFactory::class, \JCIT\jobqueue\interfaces\JobQueueInterface::class => \JCIT\jobqueue\components\Beanstalk::class, \League\Tactician\Handler\MethodNameInflector\MethodNameInflector::class => \League\Tactician\Handler\MethodNameInflector\HandleInflector::class, \Pheanstalk\Contract\PheanstalkInterface::class => \JCIT\jobqueue\components\Beanstalk::class, \Pheanstalk\Contract\SocketFactoryInterface::class => function() { return new \Pheanstalk\SocketFactory('localhost', 11300, 10); }, ] ],
- 在控制器中注册守护进程操作
public function actions(): array { return [ 'daemon' => \JCIT\jobqueue\actions\DaemonAction::class, ]; }
- 运行操作,例如
./yii job-queue/daemon
可选:将守护进程安装为服务
在此处查看示例,了解如何将控制台操作安装为 Linux 服务:https://yiiframework.cn/extension/yiisoft/yii2-queue/doc/guide/2.0/en/worker
快速测试
- 执行配置中的步骤
- 在
ContainerMapLocator
中注册\JCIT\jobqueue\jobs\HelloJob::class
和\JCIT\jobqueue\jobHandlers\HelloHandler::class
(如配置中所示) - 创建
JobQueueController
控制台控制器
class JobQueueController extends \yii\console\Controller { public $defaultAction = 'daemon'; public function actionTest( \JCIT\jobqueue\interfaces\JobQueueInterface $jobQueue ) { $task = \Yii::createObject(\JCIT\jobqueue\jobs\HelloJob::class, ['world']); $jobQueue->putJob($task); } /** * @return array */ public function actions(): array { return [ 'daemon' => [ 'class' => \JCIT\jobqueue\actions\DaemonAction::class, ] ]; } }
- 在一个控制台中运行
src/yii job-queue
- 在第二个控制台中运行
src/yii job-queue/test
- 运行守护进程的控制台将显示
Hello world
- 注意 当处理程序更改时,必须重新启动守护进程
自己的实现
- 创建作业(实现
\JCIT\jobqueue\interfaces\JobInterface::class
),它不应执行更多操作,仅携带数据 - 创建作业处理程序(实现
\JCIT\jobqueue\interfaces\JobHandlerInterface::class
),它处理作业的处理- 在处理程序的构造中执行注入
日志记录
要使用简单的 ActiveRecord 日志记录作业进行扩展,请参阅 https://packagist.org.cn/packages/jc-it/yii2-job-queue-logging。
重复作业
要使用基于 ActiveRecord 的简单重复作业进行扩展,请参阅 https://packagist.org.cn/packages/jc-it/yii2-job-queue-recurring。