Laravel使用队列

2018年3月20日 0 作者 筱枫

队列是个好东西,通常用于将需要大量时间的任务给扔到后台去执行,例如视频转码等,从数据库大量导出数据等,完全可以交给它,这样就不用担心php脚本的执行时间限制(执行时间可以更改,但对用户体验并不好)

Laravel的队列在其官方文档中已经写的比较清楚,但实际看下来很可能会发现无从下手,不知道怎么用,如果你也苦恼这个的话,可以跟着本文一步一步来。

创建一个队列任务最简单的办法就是使用artisan

php artisan make:job testJob

好了,现在在App\Jobs 下面你就可以看到刚刚生成的php文件了
让我们简单的体验一下,在testJob类中的handler函数中,添加一小段代码

public function handle()
{
    file_put_contents("./test.txt", "hello, this is queue!");
}

接着我们修改控制器,这里为了简单,直接修改了闭包路由

Route::get('/', function () {
    dispatch(new App\Jobs\testJob);
    echo "ok";
});

好了,现在按照文档上所说,启动队列进程

php artisan queue:work

接着访问我们的路由
但是——
队列进程中没有输出任何东西

这是为什么?

我们来看看任务是否已被执行

先终止队列进程,然后使用find命令寻找文件

find ./ -name "test.txt"

如图,任务确实执行了,且文件内容也和我们写入的一模一样

那这是为什么?

原因在此,打开你的env文件,找到

QUEUE_DRIVER=sync

这一行,发现什么问题了么?
队列驱动采用的是同步模式,没有经过redis使用队列进程执行,换而言之,这直接执行了你的队列代码,这不符合我们的期望
所以,将其改为redis,

QUEUE_DRIVER=redis

当然,你也可以更改为其他的驱动,在config\queue.php 中,有个
connections配置项,当中表明了所有的驱动方式
接着,保存文件,我们再来一次
注意1:如果刚刚你没有中止掉队列进程,请现在中止并重新启动,或者使用

php artisan queue:restart

重启启动(前提是你的队列进程是守护进程)

注意2:如果你没有安装predis,请现在使用

composer require predis/predis

进行安装

注意3:请确保你系统上的redis服务已启动,并且env文件中的redis配置项正确

然后,我们删除掉刚刚创建的test.txt文件,然后重新访问路由
现在有结果了

恭喜,你已经成功学会了使用队列的方法,很简单,不是吗?