安装环境就不说了,这块搞不懂的,就可以略过。
首先说说这个技术的应用场景,没有应用场景的技术,都是无用的技术。
用户提交订单,需要给商家推送消息,发送短信,发送即时消息。如果所有的操作都在提交的时候做,提交订单的处理内容太多,给客户体验很不好。外加用户量巨大,大量的订单提交,并发量大,会造成阻塞,这时候队列任务就派上用场了。
大概逻辑:订单的主要内容创建+创建队列任务(推送消息,发送短信,发送即时消息),主要内容写入数据库反应很快,队列任务会一步一步执行,任务少,基本秒执行。
先安装think-queue,thinkphp怎么用不用多说吧1, composer都用过吧,搞PHP的话,安装比较慢的话,先设置composer阿里云镜像
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
2,安装think-queue
composer require topthink/think-queue
config目录下面生成了一个queue.php文件,里面是redis数据库配置
<?php
return [
'default' => 'redis',//驱动类型,可选择 sync(默认):同步执行,database:数据库驱动,redis:Redis驱动//或其他自定义的完整的类名
'connections' => [
'sync' => [
'type' => 'sync',
],
'database' => [
'type' => 'database',
'queue' => 'default',
'table' => 'jobs',
'connection' => null,
],
'redis' => [
'type' => 'redis',
'queue' => 'default',
'host' => '127.0.0.1',
'port' => 6379,
'password' => '111111',
'select' => 0,
'timeout' => 60,
'persistent' => false,
],
],
'failed' => [
'type' => 'none',
'table' => 'failed_jobs',
],
];
3,安装配置完成,开始写功能
app\job 目录下,创建一个Task.php文件
namespace app\job;use think\queue\Job;class Task{ public function fire(Job $job, $data) { //....这里执行具体的任务 if ($job->attempts() > 3) { //通过这个方法可以检查这个任务已经重试了几次了 } //如果任务执行成功后 记得删除任务,不然这个任务会重复执行,直到达到最大重试次数后失败后,执行failed方法 $job->delete(); // 也可以重新发布这个任务 $job->release($delay); //$delay为延迟时间 } public function failed($data){ // ...任务达到最大重试次数后,失败了 }}4,创建任务
Queue::later($time, 'app\job\Task', $data, 'task'); //参数说明,$time 延时时间,单位秒;$data,需要处理的任务数据
Queue::push('app\job\Task', $data , 'task'); //这个是立即执行
5,安装redis
我的服务器使用的是宝塔面板,直接软件商店里面安装,配置好,直接启动开干。
6,运行起来
php think queue:listen --queue task #监听任务,顺畅的话可以看到运行日志