[yii2-queue] File类型队列 - 谁也不靠的独行侠

news/2024/7/2 21:33:47
在上一篇中我们讲了一个最简单的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文件夹下会生成一个文件。

Snipaste_2018-02-08_06-52-56.png

在这里有两个问题要研究

  • 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命令的时候才会看到如下结果

Snipaste_2018-02-08_07-08-44.png

现在你明白了吧

执行任务

yii2-queue可以通过命令行来执行队列中的每个任务,如下图

Snipaste_2018-02-08_07-44-54.png

当执行成功一个任务后会删除对应文件同时更新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类型的队列类,它继承于yiiqueuefileQueue并实现ser和unser方法才可以。

小结

以上就是yii2-queue的File类型支持,因为File类型的存储对系统的依赖最少,我们无需安装第三方的软件,因此对于队列相对不大且独立的情景使用File类型存储队列信息是再合适不过的了。

关于yii2-queue的事情还很多,我们慢慢说。


阿北哥ya
这里有500+节yii2原创视频等你来学。

  • yii2-queue专题
  • yii2学习社群
  • 阿北个人微信号

http://www.niftyadmin.cn/n/4226109.html

相关文章

服务器网站访问ftp设置,服务器网站访问ftp设置方法

服务器网站访问ftp设置方法 内容精选换一换公网域名解析是基于Internet网络的域名解析过程,可以把人们常用的域名(如www.example.com)转换成用于计算机连接的IP地址(如1.2.3.4)。公网域名解析支持通过直接在浏览器中输入域名,访问网站或Web应用程序。云解…

ubuntu python3.6 找不到_sqlite3

sudo apt-get install libsqlite3-dev 然后重新编译python: sudo ./configure --with-ssl sudo make -j8 sudo make install over!

java 饱汉 作用_Java设计模式-单例模式的饱汉模式和饿汉模式

单例模式要点是:一个类必须只能一个实例;自己提供创建该类的方法;该方法和类里的实例化对象,由于不能外部实例化,所以static修饰;其中有饱汉模式和饿汉模式;饱汉-------public class Singleton …

java tcp超时重发_linux的TCP超时重传--一次数据断开连接分析

最近生产上发现一个问题,刚开始,应用连接数据库正常,如果长时间没有业务估计半小时以上,再发起业务时,发现应用重连不上数据库,一直挂在重连那里,如果重启应用又能很快连上数据库(数据库是Oracl…

eclipse上安装kotlin问题

2019独角兽企业重金招聘Python工程师标准>>> 以前用的是老版本的eclipsejdk1.8.0_101,在marketplace中安装kotlin插件时出现 "No X509TrustManager implementation available"信息,重新安装最新的jdk1.8.0-162及安装最新的eclipse-jee-oxygen-…

2012服务器系统安装数据库吗,服务器2012安装数据库吗

服务器2012安装数据库吗 内容精选换一换安装MySQL本文档以“CentOS 6.5 64bit(40GB)”操作系统为例,对应MySQL版本为5.1.73。CentOS 7及以上版本将MySQL数据库软件从默认的程序列表中移除,需执行sudo rpm -Uvh http://dev.mysql.com/get/mysql-community…

网络基础CCNP篇|OSPF

OSPF:(open shortest path first)开放最短路径优先 特点: 不止思科支持链路状态路由协议收敛很快无传输层支持VLSM,传递的路由信息可以带掩码增量更新仅支持在特定的位置收工汇总支持认证协议号对应的是89 概述:首先找到邻居&…

java简易区块链系统_blockchain-java(简易区块链项目)下载

blockchain-java(简易区块链项目)是基于Java实现的一个简易区块链(联盟链)项目,包括加密工具,钱包,P2P 传输,区块同步,POW 共识等基础实现。使用方法单节点部署这个很简单, 直接像运行普通的 SpringBoot 项目一样运行就…