yii2.0 中的队列

a yii2 extension to make simple to use queue.

yii2-queue让队列的使用在yii2中变得更轻松,她为各种队列组件的使用提供了一个标准的接口,您只需要配置好需要使用的队列组件,就能轻松使用,
同时您在不同队列组件之间的切换也只需要修改下配置文件,重启下队列监听进程即可,目前支持数据库队列,redis队列,beanstalkd队列,
其它队列中间件支持正在添加中(当然,聪明的你也可以自行扩展)。

Installation

The preferred way to install this extension is through composer.

Either run

php composer.phar require --prefer-dist shmilyzxt/yii2-queue "dev-master"
or add

"shmilyzxt/yii2-queue": "dev-master"
to the require section of your composer.json file.

Usage

1:在配置文件中配置好需要使用的队列,完整的配置代码如下:

数据库队列

‘queue‘ => [
‘class‘ => ‘shmilyzxt\queue\queues\DatabaseQueue‘, //队列使用的类
‘jobEvent‘ => [ //队列任务事件配置,目前任务支持2个事件
‘on beforeExecute‘ => [‘shmilyzxt\queue\base\JobEventHandler‘,‘beforeExecute‘],
‘on beforeDelete‘ => [‘shmilyzxt\queue\base\JobEventHandler‘,‘beforeDelete‘],
],
‘connector‘ => [//队列中间件链接器配置(这是因为使用数据库,所以使用yii\db\Connection作为数据库链接实例)
‘class‘ => ‘yii\db\Connection‘,
‘dsn‘ => ‘mysql:host=localhost;dbname=yii2advanced‘,
‘username‘ => ‘root‘,
‘password‘ => ‘‘,
‘charset‘ => ‘utf8‘,
],
‘table‘ => ‘jobs‘, //存储队列数据表名
‘queue‘ => ‘default‘, //队列的名称
‘expire‘ => 60, //任务过期时间
‘maxJob‘ =>0, //队列允许最大任务数,0为不限制
‘failed‘ => [//任务失败日志记录(目前只支持记录到数据库)
‘logFail‘ => true, //开启任务失败处理
‘provider‘ => [ //任务失败处理类
‘class‘ => ‘shmilyzxt\queue\failed\DatabaseFailedProvider‘,
‘db‘ => [ //数据库链接
‘class‘ => ‘yii\db\Connection‘,
‘dsn‘ => ‘mysql:host=localhost;dbname=yii2advanced‘,
‘username‘ => ‘root‘,
‘password‘ => ‘‘,
‘charset‘ => ‘utf8‘,
],
‘table‘ => ‘failed_jobs‘ //存储失败日志的表名
],
],
]
redis队列

‘queue‘ => [
‘class‘ => ‘shmilyzxt\queue\queues\RedisQueue‘,
‘jobEvent‘ => [
‘on beforeExecute‘ => [‘shmilyzxt\queue\base\JobEventHandler‘,‘beforeExecute‘],
‘on beforeDelete‘ => [‘shmilyzxt\queue\base\JobEventHandler‘,‘beforeDelete‘],
],
‘connector‘ => [ //需要安装 predis\predis 扩展来操作redis
‘class‘ => ‘shmilyzxt\queue\connectors\PredisConnector‘,
‘parameters‘ => [
‘scheme‘ => ‘tcp‘,
‘host‘ => ‘127.0.0.1‘,
‘port‘ => 6379,
//‘password‘ => ‘1984111a‘,
‘db‘ => 0
],
‘options‘=> [],
],
‘queue‘ => ‘default‘,
‘expire‘ => 60,
‘maxJob‘ => 0,
‘failed‘ => [
‘logFail‘ => true,
‘provider‘ => [
‘class‘ => ‘shmilyzxt\queue\failed\DatabaseFailedProvider‘,
‘db‘ => [
‘class‘ => ‘yii\db\Connection‘,
‘dsn‘ => ‘mysql:host=localhost;dbname=yii2advanced‘,
‘username‘ => ‘root‘,
‘password‘ => ‘‘,
‘charset‘ => ‘utf8‘,
],
‘table‘ => ‘failed_jobs‘
],
],
]
beanstalkd队列

‘queue‘ => [
‘class‘ => ‘shmilyzxt\queue\queues\BeanstalkdQueue‘,
‘jobEvent‘ => [
‘on beforeExecute‘ => [‘shmilyzxt\queue\base\JobEventHandler‘,‘beforeExecute‘],
‘on beforeDelete‘ => [‘shmilyzxt\queue\base\JobEventHandler‘,‘beforeDelete‘],
],
‘connector‘ => [ //需要安装 pad\pheanstalk 扩展来操作beastalkd
‘class‘ => ‘shmilyzxt\queue\connectors\PheanstalkConnector‘,
‘host‘ => ‘114.55.142.6‘,
‘port‘ => 11300
],
‘queue‘ => ‘default‘,
‘expire‘ => 60,
‘maxJob‘ => 0,
‘failed‘ => [
‘logFail‘ => true,
‘provider‘ => [
‘class‘ => ‘shmilyzxt\queue\failed\DatabaseFailedProvider‘,
‘db‘ => [
‘class‘ => ‘yii\db\Connection‘,
‘dsn‘ => ‘mysql:host=localhost;dbname=yii2advanced‘,
‘username‘ => ‘root‘,
‘password‘ => ‘‘,
‘charset‘ => ‘utf8‘,
],
‘table‘ => ‘failed_jobs‘
],
],
],

activeMQ配置如下:
‘queue‘ => [

‘class‘ => ‘shmilyzxt\queue\queues\ActivemqQueue‘,
‘jobEvent‘ => [
‘on beforeExecute‘ => [‘shmilyzxt\queue\base\JobEventHandler‘,‘beforeExecute‘],
‘on beforeDelete‘ => [‘shmilyzxt\queue\base\JobEventHandler‘,‘beforeDelete‘],
],
‘connector‘ => [
‘class‘ => ‘shmilyzxt\queue\connectors\ActivemqConnector‘,
‘broker‘ => ‘tcp://127.0.0.1:61613‘,
‘timeout‘ => 10
],
‘queue‘ => ‘default‘,
‘expire‘ => 60,
‘maxJob‘ => 0,
‘failed‘ => [
‘logFail‘ => true,
‘provider‘ => [
‘class‘ => ‘shmilyzxt\queue\failed\FileFaildProvider‘,//文件错误日志
‘filePath‘ => ‘D://xampp/htdocs/advanced/vendor/shmilyzxt/yii2-queue/failed/log/failed.log‘,
],
],
]
2:在components数组配置项中配置好队列后,就可以开始使用队列了,首先是任务入队列,提供两个方法:
\Yii::$app->queue->pushOn($hander,$data,$queue=‘default‘)
即时任务入队列:这样的任务入队列后,如果队列监听在运行,那么任务会立刻进入ready状态,可以被监听进程执行。
该方法有3个参数,第一个为任务处理handler,第二个为任务数据,第三个为队列名称,默认为 default。
\Yii::$app->queue->laterOn($delay,$handler,$data,$queue=‘default‘)
延时任务入队列:这样的任务入队列后不会立刻被队列监听进程之行,需要等待 $delay秒后任务才就绪。

目前支持的handler有:
1,新建自己的队列处理handler,继承、shmilyzxt\queue\base\JobHandler,并实现任务处理方法handle()和失败处理方法failed()。
2, 一个php闭包,形如 function($job,$data){}

\Yii::$app->queue->pushOn(new SendMial(),[‘email‘=>‘[email protected]‘,‘title‘=>‘test‘,‘content‘=>‘email test‘],‘email‘);
\Yii::$app->queue->pushOn(function($job,$data){var_dump($data)},[‘email‘=>‘[email protected]‘,‘title‘=>‘test‘,‘content‘=>‘email test‘],‘email‘);

\Yii::$app->queue->laterOn(120,new SendMial(),[‘email‘=>‘[email protected]‘,‘title‘=>‘test‘,‘content‘=>‘email test‘],‘email‘);
\Yii::$app->queue->pushOn(120,function($job,$data){var_dump($data)},[‘email‘=>‘[email protected]‘,‘title‘=>‘test‘,‘content‘=>‘email test‘],‘email‘);
3:新建自己的队列处理handler,继承shmilyzxt\queue\base\JobHandler,并实现任务处理方法handle和失败处理方法failed,一个发邮件的jobhandler类似:

class SendMail extends JobHandler
{

public function handle($job,$data)
{
if($job->getAttempts() > 3){
$this->failed($job);
}

$payload = $job->getPayload();

//$payload即任务的数据,你拿到任务数据后就可以执行发邮件了
//TODO 发邮件
}

public function failed($job,$data)
{
die("发了3次都失败了,算了");
}
}
4:启动后台队列监听进程,对任务进行处理,您可以使用yii console app来启动,你也可以使用更高级的如swoole来高效的运行队列监听,
目前提供了一个Worker类,在控制台程序使用Worker::listen(Queue $queue,$queueName=‘default‘,$attempt=10,$memory=512,$sleep=3,$delay=0)可以
启动队列监听进程,其中 $attempt是任务尝试次数,$memory是允许使用最大内存,$sleep表示每次尝试从队列中获取任务的间隔时间,$delay代表把任务重新加入队列
时是否延时(0代表不延时),一个标准yii console app 启动队列监听进程代码如下;

class WorkerController extends \yii\console\Controller
{
public function actionListen($queueName=‘default‘,$attempt=10,$memeory=128,$sleep=3 ,$delay=0){
Worker::listen(\Yii::$app->queue,$queueName,$attempt,$memeory,$sleep,$delay);
}
}
yii worker/listen default 10 128 3 0
当后台监听任务启动起来后,一但有任务加入队列,队列就会调用入队列时设置的handler对队列任务进行处理了。每次会pop出一个任务进行处理,处理完成后删除任务,直到队列为空。

5:关于任务失败处理:
默认情况下,一个任务在执行时出现异常或者一个任务失败时并不是认为它真正失败了,此时会检测它的尝试次数是否已经超出设置的attempt,如果没超出会重新入队列尝试,如果超出了,
则该任务才是真正失败,这是会先调用任务处理handler类的failed()方法处理失败操作,如果没有failed()方法(比如handler为闭包或者您自定义的继承自shmilyzxt\queue\base\JobHandler
的类没有写failed()方法),则会尝试使用扩展自身的失败日志处理机制(配置项里的failed配置),会尝试把失败任务的详细信息写入到数据库表中(目前只支持数据库方式)。
建议您采用继承shmilyzxt\queue\base\JobHandler的方式生成任务处理handler并写自己的failed方法处理失败任务。

6:任务事件支持:
目前任务支持2个事件(beforeExecute,beforeDelete), beforeExecute是在任务被pop出来之后,执行之前执行。beforeDelete是任务在被删除之前执行
您可以使用这两个事件做自定易操作,只需要像上面配置文件里配置 jobEvent那样绑定事件处理handler即可 1。

时间: 2024-10-12 15:13:14

yii2.0 中的队列的相关文章

在Yii2.0中实现计划任务(cron)

以下由我们在信易网络公司开发项目的时候终结出的一些经验 Create console application 创建命令行应用 In advance template there is already a file yii. And there is no need to run it as php, it is Linux script. 在高级模版中的 yii 文件,它是一个 Linux 脚本,不需要使用PHP来运行. Create cron service command 创建计划任务服务命

Yii2.0中Yii::$app与Yii 1.0中Yii:app()的理解

一直不明白Yii::$app与Yii::app(),查找yii框架源码后如下记录分享 (1)在Yii1.0中Yii::app()返回的是你在index.php里创建的CWebApplication实例,在对应的CWebApplication,入口文件: Yii::createWebApplication($configFile)->run(); 对应的类中查找: public static function createWebApplication($config=null){return se

Yii2.0中Mailer收发邮件详解

Yii2.0封装的类足够强大,Mailer的使用方法做一个总结:1.先在main-local.php中做好配置: return [//....'components' => ['mailer' => ['class' => 'yii\swiftmailer\Mailer',],],]; 详细如下: return [//....'components' => [ 'viewPath' => '@common/mail', 'useFileTransport' =>fals

Yii2.0中(Hash is invalid error)验证错误

老项目数据迁移到Yii2.0后,密码仍使用md5加密.但是通过yii2.0的验证类的validatePassword($password)函数验证始终返回false: public function validatePassword($password){if(is_null($this->password)) return false;return Yii::$app->getSecurity()->validatePassword($this->salt . $password

yii2.0中yii\base\Application的一些属性

必要属性 yii\base\Application::id 区分其他应用的唯一标识ID yii\base\Application::basePath 该应用的根目录 其他属性 yii\base\Application::aliases 定义多个别名,通常是方便路径,namespace的访问. yii\base\Application::bootstrap 指定应用启动阶段需要运行的组件. yii\web\Application::catchAll 指定一个要处理所有用户请求的 控制器方法,通常在

yii2.0中Rbac 怎么添加超加管理员

最笨的是定义常量.具体怎么做?看下面: //定义在控制器声明上面define('BEST_PHPER',serialize(array('admin','admin1')));//设置admin管理员 //通常是在方法中进行判断,取值的$BEST_PHPER=unserialize(BEST_PHPER); //反序列话进行取值var_dump($BEST_PHPER);die;

yii2.0 中删除满足某几个条件的全部数据

删除user表中的type=2 and usercategoryid 不是1,2.3的全部数据 User::deleteAll([ 'and', 'type = :type_id', ['not in', 'usercategoryid', $categoriesList]],[ ':type_id' => 2 ]); //Output Query //DELETE FROM `tbl_user` WHERE (type = 2) AND (`usercategoryid` NOT IN (1,

Yii2.0中session有效期设置原理

1.session设置方法 $session = Yii::$app->session;//当session没有值 或 过期时间到 则重新付值if(!isset($session['user']) || $session['user']['expire_time'] < time()){$data = ['title' => 'data', //数据'expire_time' => time() + 10, //这里设置10秒过期];$session['user'] = $data

Yii2.0中rules验证的调试

通过表单模型做接口,验证返回的错误明确错误信息如下: /** 提取rules规则验证错误的信息 @param [type] $model @return void*/public static function getModelError($model) {if(empty($model)) return true;$errors = $model->getErrors(); //得到所有的错误信息 if(!is_array($errors)){ return true; } $firstErr