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