官方文档写得挺好的,不过还是写下自己的理解,省得翻老代码还骂这啥代码,谁写的?
./artisan queue:table #生成任务队列数据表的迁移文件 ./artisan migrate #执行迁移 ./artisan make:job fetch_page #新建一个抓取页面的任务,名字随意,只要便于理解就行
先不管这个文件长啥样,大概了解下原理
laravel 使用 ./artisan queue:work 来作为守护进程执行分发的任务
因为这条命令是由php来执行的,所以在php.ini中有最大执行时间,到了这个时间,不管执行的如何,它都会挂掉
即使最大执行时间足够大,但也可能因为一些不可控因素挂掉。。。
所以要配置supervisor来让它挂掉后重新起来。
把分发任务放到控制器中,然后写路由,然后编辑crontab
如果是web路由,就定期访问访问那个页面分发任务
如果是console路由,就定期执行那个命令
如果由用户控制,或基于事件,比如下面这个,用户提交链接,然后把任务加入队列
现在来写控制器
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use App\Helper\Page; use App\Jobs\fetch_page; class PageController extends Controller { /** * 分发页面任务 * 队列就是先进现出FIFO,所以可以按次序将任务压入队列,它们将按顺序执行 * @return void */ protected function cron($url) { //抓取页面 注入依赖以及参数 dispatch(new fetch_page(new Page, $url)); } }
来设想一个场景,用户提交一个待抓取页面,然后用户就可以去忙别的,或者继续提交。否则,用户只能等上面这个流程走完之后才能提交下一个。这是多么浪费生命的事情?
再来看看这个任务文件
worker = $worker; $this->url = $url; } /** * Execute the job. * * @return void */ public function handle() { $this-worker->fetch_page($this->url); } }
supervisor的配置安装如果有问题,就去看官方的readthedoc文档,看文档去填坑吧。。