laravel 任务队列

官方文档写得挺好的,不过还是写下自己的理解,省得翻老代码还骂这啥代码,谁写的?

./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文档,看文档去填坑吧。。

发布者

gt

QQ: 1520667045 一个名叫坏人的博客,他很想成为WEB攻城狮,因为他认为每个前端开发者的审美观都是很挑的……

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据