• 技术文章 >后端开发 >php教程

    Laravel中使用Queue的最基本操作教程讲解

    jacklovejacklove2018-07-04 17:52:27原创1136
    Laravel队列服务为各种不同的后台队列提供统一的API,下面这篇文章主要给大家介绍了关于Laravel中使用Queue的最基本操作教程,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。

    前言

    laravel中的队列服务跟其他队列服务也没有什么不同,都是最符合人类思维的最简单最普遍的流程:有一个地方存放队列信息,一个PHP进程在运行时将任务写入,另外一个PHP守护进程轮询队列信息,将达到执行要求的任务执行并删除。由于PHP是url驱动的同步语言,本身是阻塞的,所以laravel提供一个守护进程工具来查询并执行队列信息也就不足为奇了。

    这两天初次接触 Laravel 的队列,也是搞了好一会。。。一番折腾下来还是感慨对 Laravel 不得其门,文档写的相对简单和概括,看源码又有些力不从心(不过看源码慢慢调试验证还是最可靠的)。

    下面是我的一个简单 Demo,仅仅使用了队列的最基本操作,偏高级的操作需要再去好好时间一番 :)

    和我一样入门 Laravel 的队列有些困难的同学可以交流一下。

    配置

    添加 Redis 包

    在 composer.json 中 require 部分加入 "predis/predis": "~1.0",,然后 composer up 更新一下即可。

    database.php

    在 database.php 配置文件中对 redis 数据库部分进行配置,默认有一个 default 连接,就用这个好了:)

    根据这个默认连接中需要的配置项,编辑 .env 配置文件,将其中的 REDIS_HOST、REDIS_PASSWORD、REDIS_PORT 填写成自己服务器中 Redis 的相应值。

    queue.php

    首先需要去 .env 中配置 QUEUE_DRIVER,因为现在打算用 Redis,所以配置成 redis。

    接着配置 queue.php 里 connections 部分的 redis 连接,其中 connection 对应的值就是 database.php 中 redis 的那个 default 连接。

    任务类

    接下来就是写实际的操作类了,Laravel 提供了 artisan 命令简化创建任务类:

    php artisan make:job Demo

    在 app 目录下会生成 Jobs 目录,里面已经有了 Demo.php 任务类。

    Lumen 可没有这个 artisan 命令,不过也很方便,默认会有一个 ExampleJob.php 已经写好了,拷贝一份改个名字即可。
    先写个简单的日志输出测试一下好了,在 handle 方法中:

    Log::info('Hello, queue');

    发放任务

    现在写个入口函数,推送任务到队列中。使用辅助函数 dispatch():

    Laravel 中使用如下方式:

    Demo::dispatch();

    Lumen 中使用如下方式:

    dispatch(new Demo);

    开启队列

    顺利的话,这是最后一步了。命令行中执行:

    php artisan queue:listen --queue=default

    它会监听队列,并输出简单的执行情况,比如:

    [2017-11-07 02:12:47] Processing: App\Jobs\Demo
    [2017-11-07 02:12:47] Processed: App\Jobs\Demo

    没啥问题后就可以让这个队列脚本执行在后台:

    php artisan queue:work --daemon --quiet --queue=default 1>> /dev/null 2>&1

    进阶一下 :)

    推送到队列中时,一般会有传参的需求,那这里怎么传呢?

    参数传递

    传入

    在入口函数中传入参数方式如下:

    Laravel 中使用如下方式:

    $param = 'Stephen';
    Demo::dispatch($param);

    Lumen 中使用如下方式:

    $param = 'Stephen';
    dispatch(new Demo($param));

    接收

    在任务类中接收参数方式如下:

    protected $param;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($param)
    {
      $this->param = $param;
    }
    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
      Log::info('Hello, ' . $this->param);
    }

    初次尝试到此为止,还有许多高级用法,比如延迟分发、错误处理、优先级、失败处理等,后续会继续写 :)

    多队列

    这是一个必然需要考虑到的问题,我不可能将所有任务都放在一个叫 default 的队列中,这样不容易对队列进行管理。

    要指定不同的队列,非常简单,在 dispatch() 后紧接着跟上 onQueue() 方法即可:

    Demo::dispatch()->onQueue('emails');

    不对啊,我好像没有定义过这个叫 emails 的 queue。嗯,自然需要做出一点改动,在 queue.php 配置文件中的 redis 配置 queue 从 default 改为 {default},这样做的效果就是队列的名称可以从运行的时候动态拿到,而不是写死的。

    如果使用 Lumen 框架,那么直接这么写会报错:Call to a member function onQueue() on string。

    原因在于 Lumen 的 Job 基类中并没有使用 Illuminate\Foundation\Bus\Dispatchable 这个 trait,而是直接使用 Illuminate\Bus\Queueable 中的 onQueue() 方法。

    那么现在就很清楚了,我们的 Job 类使用了 Illuminate\Bus\Queueable 这个 trait,所以需要在 Job 类上调用这个 onQueue() 方法。

    $job = new XXXJob();
    dispatch($job->onQueue('queue-name'));

    当我们在开启队列的时候:

    php artisan queue:work --queue=emails

    这里指定的队列名 emails 和 dispatch 时指定的队列名保持一致即可。

    总结

    您可能感兴趣的文章:

    详解Yaf框架PHPUnit集成测试方法讲解

    快速解决PHP调用Word组件DCOM权限的问题讲解

    PHP获取数组中指定的一列实例讲解

    以上就是Laravel中使用Queue的最基本操作教程讲解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    上一篇:详解Yaf框架PHPUnit集成测试方法讲解 下一篇:PHP将日期转换为JDE的儒日历格式的方法
    大前端线上培训班

    相关文章推荐

    • 分享一份PHP开发内部规范• php session有关问题 • 同一个程序里 二个顶级域名如果共享COOKIE • 网页静态化,几时静 • Jquery应验表单

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网