herroffizier / yiiq
Yii框架的后台作业管理器
Requires
- php: >=5.4
- ext-pcntl: *
- codemix/yiiredis: dev-master
Requires (Dev)
- ext-xdebug: *
- brianium/paratest: dev-master
- phing/phing: dev-master
- phpunit/dbunit: *
- phpunit/php-invoker: *
- phpunit/phpunit: ~3
- phpunit/phpunit-selenium: *
- phpunit/phpunit-story: *
- squizlabs/php_codesniffer: dev-master
- yiisoft/yii: ~1
This package is not auto-updated.
Last update: 2024-09-24 02:52:34 UTC
README
Yiiq 是一个强大的基于 Redis 的多线程后台作业管理器,专为 Yii 框架设计,注重稳定性和简洁性。
要运行一个作业,只需将其包裹在类中并输入
Yii::app()->yiiq->enqueue('\MyJob');
这就完成了!
目录
特性
- 稳定性
如果作业崩溃,守护进程将保持运行。如果服务器崩溃,守护进程将恢复其状态,包括所有未完成的作业。 - 多线程
您可以运行您需要的任何数量的进程。 - 排队
作业可以分组在不同的队列中,由不同的进程处理。 - 清晰性
您可以在任何时间点跟踪您的作业状态。 - 计划
作业可以在特定时间或立即执行。一次或多次。 - 反馈
作业可以将结果返回到扩展。
要求
- Unix平台
- PHP >= 5.4
- Redis
- pcntl扩展
- Yii框架 >= 1.1.14
- YiiRedis
安装
以下步骤假设您有默认的 Yii 应用程序布局,其中包含两个配置文件:分别为 Web 和控制台应用程序的 main.php 和 console.php。 Yiiq 也由两部分组成:框架扩展和守护进程。扩展负责排队作业,守护进程负责执行它们。由于守护进程作为控制台应用程序运行,它将使用 console.php 配置文件,而扩展将根据所使用的应用程序类型使用两个文件。因此请注意,Yiiq 和 YiiRedis 扩展必须包含在这两个文件中。
首先,通过 Composer 安装 Yiiq
composer require herroffizier/yiiq:dev-master
在此阶段,请确保 vendor/autoload.php 包含在这两个配置文件中。
现在我们需要设置扩展。将其添加到您的 components 数组中(也必须在两个文件中添加)
'components' => array( // ... 'yiiq' => array( 'class' => '\Yiiq\Yiiq', // Name to identify daemon in process list (optional) 'name' => 'Yiiq test instance', ), // ... ),
请注意,YiiRedis 扩展也必须在两个文件中加载!
最后,将以下命令添加到 console.php 中的 commandMap
'commandMap' => array( // ... // Control Yiiq command 'yiiq' => array( 'class' => '\Yiiq\commands\Main', ), // Daemon Yiiq command 'yiiqWorker' => array( 'class' => '\Yiiq\commands\Worker', ), // ... ),
现在,是时候运行守护进程了。请记住,守护进程负责执行作业,因此它必须始终运行。在您的应用程序的 protected 文件夹中输入以下命令。
./yiic yiiq start --log=yiiq.log
log 参数是可选的,但强烈建议在第一次运行时至少使用它。
运行 ./yiic yiiq status 以检查守护进程是否正确启动。您应该看到类似以下的内容
All processes (28235) are alive. Everything looks good.
如果守护进程没有运行,请参考 application.log 和 yiiq.log(两者都存储在 runtime 文件夹中)以获取详细信息。
使用
创建作业
要创建一个作业,您应该扩展 \Yiiq\jobs\Payload 类并实现其 run() 方法
class YiiqDummyJob extends \Yiiq\jobs\Payload { /** * Time to wait before exit. * * @var integer */ public $sleep = 10; /** * This method should contain all the job logic. * * @return {mixed} all returned data will be saved in Redis * (for non-repeatable jobs) */ public function run() { Yii::trace( 'Started dummy job '.$this->queue.':'.$this->id .' (sleep for '.$this->sleep.'s).' ); sleep($this->sleep); Yii::trace('Job '.$this->queue.':'.$this->id.' completed.'); } }
实际上,在 Yiiq 中有三种类型的作业:简单、计划和可重复。第一种立即执行,第二种在指定时间执行,第三种根据指定的间隔无限执行。
简单作业
要添加一个简单作业,您可以使用以下任一调用。如您所知,此作业将尽快执行一次。
// Add YiiqDummyJob with default arguments to default queue. // Via arguments: $job = Yii::app()->yiiq->enqueue('\YiiqDummyJob'); // Via method chaining: $job = Yii::app()->yiiq-> create('\YiiqDummyJob')-> enqueue(); // Add YiiqDummyJob with customized arguments to default queue. // Via arguments: $job = Yii::app()->yiiq->enqueue( '\YiiqDummyJob', ['sleep' => 5] ); // Via method chaining: $job = Yii::app()->yiiq-> create('\YiiqDummyJob')-> withArgs(['sleep' => 5])-> enqueue(); // Add YiiqDummyJob with customized arguments to 'custom' queue. // Via arguments: $job = Yii::app()->yiiq->enqueue( '\YiiqDummyJob', ['sleep' => 5], 'custom' ); // Via method chaining: $job = Yii::app()->yiiq-> create('\YiiqDummyJob')-> into('custom')-> withArgs(['sleep' => 5])-> enqueue();
计划作业
要安排在特定时间执行作业,您必须指定时间或间隔
// Run job at certain time. // Via arguments: $job = Yii::app()->yiiq->enqueueAt( time() + 60, 'YiiqDummyJob' ); // Via method chaining: $job = Yii::app()->yiiq-> create('\YiiqDummyJob')-> runAt(time() + 60)-> enqueue(); // Run job after 60 seconds. In fact exactly the same as above. // Via arguments: $job = Yii::app()->yiiq->enqueueAfter( 60, '\YiiqDummyJob' ); // Via method chaining: $job = Yii::app()->yiiq-> create('\YiiqDummyJob')-> runAt(time() + 60)-> enqueue();
可重复作业
要创建一个可重复作业,您可以使用以下代码
// Run job each 300 seconds. // Via arguments: $job = Yii::app()->yiiq->enqueueEach( 300, '\YiiqDummyJob' ); // Via method chaining: $job = Yii::app()->yiiq-> create('\YiiqDummyJob')-> runEach(300)-> enqueue();
请注意,可重复作业不能将任何数据返回到 Yiiq。