前言
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');
pbootcms编辑器无法上传图片:后端配置项没有正常加载,上传插件不能正常使用1、PbootCMS后台正常使用,ueditor编辑界面可以显示, 但单图片上传按钮点击没反应,多图片上传显示后台配置项返回格
PbootCMS中使用sql标签统计网站留言总数我们在用pbootcms时候,需要对一些数据进行统计,要怎么操作呢?其实pbootcms有一个sql语句标签,通过这个标签就可以
PbootCMS修改网站标题显示方式,去掉副标题使用pb时发现标题这块逻辑不太符合常用的效果,默认的是后台有站点标题和副标题,在前台的展示方式是: 1、首页
PBootCMS图文安装使用教程1、安装前的准备工作: 1、本地安装(在自己电脑上安装测试)可以用集成包,wampserver,phpstudy(现在的小皮),安
PHP的RSA加密解密方法以及开发接口使用本篇文章给大家详细介绍了PHP开发接口使用RSA进行加密解密方法,对此有兴趣的朋友可以学习下。
PHP长连接实现与使用方法详解这篇文章主要介绍了PHP长连接实现与使用方法,结合实例形式较为详细的分析了php长连接的概念、功能、实现与使用方