Laravel使用队列
队列是个好东西,通常用于将需要大量时间的任务给扔到后台去执行,例如视频转码等,从数据库大量导出数据等,完全可以交给它,这样就不用担心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文件,然后重新访问路由
现在有结果了
恭喜,你已经成功学会了使用队列的方法,很简单,不是吗?