在上一篇中我们讲了一个最简单的yii2-queue队列扩展的例子,接下来的日子里阿北将带你一起深入到这个扩展的内部,本篇说说当我们使用File类型来存储队列信息时候的相关事情。
 
 File类型队列由一个index.data和一堆任务文件构成。
 当我们推送一个任务到队列的时候,这个任务会生成一个文件,名字命名如下jobXXX.data,XXX是任务编号,具体编号是多少从一个叫做index.data的文件中获取。
 因为队列时刻在变化,因此这些文件默认情况下存放到了yii2程序的runtime/queue下,当然我们可以通过如下配置来修改这个路径。
 // config/web.php return [     'components' => [         'queue' => [             'class' => \yii\queue\file\Queue::class,             'path' => '@runtime/queue',         ],     ], ]; 
 现在我们来看一下流程
 push
 当我们执行任务推送的时候,在runtime/queue文件夹下会生成一个文件。
 
 在这里有两个问题要研究
  - job的内容是什么?
- job102中的102是如何来的?
首先我们知道在yii2-queue中每个任务被抽象成一个类的对象,比如上节课中我们的模板发送类
 namespace app\queue;  ...  class TemplateJob extends Component implements \yii\queue\JobInterface {      /**      * 订阅会员ID      * @var      */     public $userId;          .....      public function execute($queue){      } } 
 每个任务就是一个类的对象,它自然包含自己的相关属性,因此每个jobXXX.data里包含的是这个任务所属那个类以及自身的属性值,我们来深入看一个任务文件的内容。
 O:21:"app\queue\TemplateJob":6:{s:6:"userId";i:101;s:6:"openId";N;s:6:"itemId";N;s:11:"subscribeId";N;s:27:"�yii\base\Component�_events";a:0:{}s:30:"�yii\base\Component�_behaviors";N;} 
 这是一个被序列化以后的内容,但是从里面仍然可以分析出,这个任务隶属于TemplateJob类,有userId、openId、itemID和subscribeId四个属性并且已经赋值。
 接下来我们来看看任务文件的编号是如何获取的
 那必然要看看index.data文件了
 a:4:{s:6:"lastId";i:138;s:7:"waiting";a:0:{}s:7:"delayed";a:0:{}s:8:"reserved";a:0:{}} 
 这里面包含了最近的一个任务编号,如果系统又push了一个任务,则从lastId+1(138+1=139),然后lastId被设置成139再,同时该文件中含有当前队列的情况,比如waiting表示当前多少个任务等待执行、delayed表示有多少个延迟的任务。
 因为index.data的存在,当我们在命令行执行queue/info命令的时候才会看到如下结果
 
 现在你明白了吧
 执行任务
 yii2-queue可以通过命令行来执行队列中的每个任务,如下图
 
 当执行成功一个任务后会删除对应文件同时更新index.data文件,而整个执行任务的是由yii2-queue库的 /drivers/file/Command.php 类来执行,除了listen和run外,还有比如info、remove、clear方法,关于命令行action的讲解我们会放到一个单独篇章进行介绍。
 关于数据的处理
 在上面我们说了在.data文件中,数据是序列化的结果。当然你可以改变它,虽然不推荐。
 改配置文件
 // config/web.php return [     'components' => [         'queue' => [             'class' => \yii\queue\file\Queue::class,             'path' => '@runtime/queue',             'indexSerializer'=>'ser',             'indexDeserializer'=>'unser'         ],     ], ]; 
 我们可以通过indexSerializer和indexDeserializer指定对data文件数据的加密和解密过程,当然如果真这样我们还要定义ser和unser方法来处理具体逻辑,那就需要我们自己定义一个file类型的队列类,它继承于\yii\queue\file\Queue并实现ser和unser方法才可以。
 小结
 以上就是yii2-queue的File类型支持,因为File类型的存储对系统的依赖最少,我们无需安装第三方的软件,因此对于队列相对不大且独立的情景使用File类型存储队列信息是再合适不过的了。
 关于yii2-queue的事情还很多,我们慢慢说。
  阿北的知识分享 https://nai8.me/article