Yii2.0 文件队列的使用

薄洪涛4年前PHP1217

最近做了一个文件上传+处理的功能,需求是这样的,上传并读取.doc文件,并解析里面的内容入库

读取文件并入库是使用python处理的,每个文件大约需要处理5-6秒,上传是使用的Yii2,我这里的思路是把上传和处理的逻辑分离,上传成功之后,增加处理任务到队列中,这里选用的是文件队列,之所以选文件队列的原因是功能简单,而且文件队列不依赖任何第三方

第一步,composer下载FileQueue

composer require --prefer-dist yiisoft/yii2-queue

第二步,main.php配置组件,这里我使用的是文件队列,如果想使用其他的队列也可以配置

'queue' => [
    'class' => \yii\queue\file\Queue::class,
    'as log' => \yii\queue\LogBehavior::class,//错误日志 默认为 console/runtime/logs/app.log
    'path' => '@runtime/queue',
],

第三步,main.php注册组件

'bootstrap' => ['queue'],

第四步,入队及出队处理

class FileQueue extends \yii\base\BaseObject implements \yii\queue\JobInterface
{
    public $file; // 文件绝对路径
    public $task_id; // 任务id
    public function execute($queue)
    {
        // TODO: Implement execute() method.
        // 这里写你的处理任务
    }
}

// 入队
Yii::$app->queue->push(new FileQueue([
    'task_id' => $_model->id,
    'file' => '/www/wwwroot/fd-admin/web/uploads/'.$_model->filename
]));

第五步,队列的状态

控制台用于监听和处理队列任务。
yii queue/listen [wait]
listen命令启动一个守护进程,它可以无限查询队列。如果有新的任务,他们立即得到并执行。
wait是下一次查询队列的时间 当命令正确地通过supervisor来实现时,这种方法是最有效的。
yii queue/run
run命令获取并执行循环中的任务,直到队列为空。适用与cron。
run与listen命令的参数:
--verbose,-v: 将执行状态输出到控制台。
--isolate: 详细模式执行作业。如果启用,将打印每个作业的执行结果。
--color: 高亮显示输出结果。
yii queue/info
info命令打印关于队列状态的信息。

注意,如果需要使用yii命令,需要在console.php中配置和main.php一样的组件

标签: 文件队列

相关文章

跨域的其他方式

上次向大家介绍了跨域的解决方式jsonp,总感觉差点什么,所以,补充一下,介绍另外一种跨域方式:比如说,公司内部系统之间,比如ERP和OA之间想要进行数据交互,但是每个系统都有自己的域名,如果想实现数...

php高级特性之反射

何为反射?字面理解,就是根据到达找到源;在面向对象编程中的反射就是根据对象去找出它所属的类,及类的方法,详情;首先声明一点,反射在实际开发中用的很少(至少我没用过),但是在编写文档的时候,可以用于文档...

Yii2.0框架ActiveForm总结

首先引入ActiveForm和Html这里两个是很重要的<?php     use yii\bootstrap\ActiveForm; &nbs...

Laravel中灵活使用Trait

这次我们来学的是Trait,说到Trait ,大家的印象可能就是复用一直以来,我对复用的理解就是写一个公共类/文件,通过继承/require 来实现复用,那里需要就哪里继承/ 引用,目的就是少写代码我...

YII2场景值的使用

开发的时候添加和编辑写在了一个方法里面,上传图片添加的时候需要验证为空,编辑的时候不需要,这时候yii的场景值能够解决这个问题:控制器中$model = new News...

laravel chunk 更新数据的坑

在一些情况下,我们需要对大批量的数据进行操作,如果这个时候我们使用foreach的话,很可能会遇到操作超时的情况。在Laravel框架中我们可以很方便的使用chunk方法来解决。来看一个简单的例子:$...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。