码农日记

薄洪涛的个人博客

Yii2.0 文件队列的使用

最近做了一个文件上传+处理的功能,需求是这样的,上传并读取.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一样的组件

发表评论:

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

Powered By Z-BlogPHP 1.7.3

版权所有 | 转载请标明出处