thinkPHP/fastadmin topthink/think-queue 多进程
运行环境centos7.6 lnmp
1,安装redis扩展和安装topthink/think-queue(fastadmin自带)
2,新增配置文件application/extra/queue.php
3,创建推送方法(往redis推送队列信息)
4,创建执行队列方法(往redis取出信息并处理:\application\index\job\Hello.php)
5,supervisor多进程处理(含有有些注意事项)
1,不展开细说
2,配置内容如下:
<?php
return ['connector' => 'Redis', // Redis 驱动'expire' => 60, // 任务的过期时间,默认为60秒; 若要禁用,则设置为 null'default' => 'default', // 默认的队列名称'host' => '127.0.0.1', // redis 主机ip'port' => 6379, // redis 端口'password' => '', // redis 密码'select' => 0, // 使用哪一个 db,默认为 db0'timeout' => 0, // redis连接的超时时间'persistent' => false, // 是否是长连接// 'connector' => 'Database', // 数据库驱动// 'expire' => 60, // 任务的过期时间,默认为60秒; 若要禁用,则设置为 null// 'default' => 'default', // 默认的队列名称// 'table' => 'jobs', // 存储消息的表名,不带前缀// 'dsn' => [],// 'connector' => 'Topthink', // ThinkPHP内部的队列通知服务平台 ,本文不作介绍// 'token' => '',// 'project_id' => '',// 'protocol' => 'https',// 'host' => 'qns.topthink.com',// 'port' => 443,// 'api_version' => 1,// 'max_retries' => 3,// 'default' => 'default',// 'connector' => 'Sync', // Sync 驱动,该驱动的实际作用是取消消息队列,还原为同步执行
];
3.1,推送方法没有太多要求:主要是把信息推送到redis队列里面
本人使用fastadmin,实例:/application/admin/controller/Tbag.php(也可以放在api/command等其他地方)
<?php
namespace app\admin\controller;use app\index\job\Hello;
use think\Db;
use think\debug\Html;
use think\Request;
use think\Console;
use think\Queue;class Tbag extends \think\Controller
{/** 测试队列action * */public function index(){// 1.当前任务将由哪个类来负责处理。//$jobHandlerClassName = 'application\index\job\Hello';//直接用 Hello::class 来替代即可// 2.队列名称$jobQueueName = "helloJobQueue";// 3.业务逻辑$id = mt_rand(1000,9999);$jobData = [ 'something'=> 'xxoo', 'id' => $id ] ;// 4.推送进队列逻辑$isPushed = Queue::push( Hello::class , $jobData , $jobQueueName );//注释:Hello是取出redis队列数据后进行处理的类,在4会提到if( $isPushed !== false ){echo date('Y-m-d H:i:s') . " a new Hello Job is Pushed to the Redis:".json_encode($jobData)."<br>";}else{echo 'Oops, something went wrong.';}}
}
3.2推送完了,进行验证(如果是宝塔安装的redis直接输入redis-cli登录)
①登录redis②查看队列信息(LRANGE queues:helloJobQueue 0 -1)
代码如下:
[root@VM-0-7-centos ~]# redis-cli
127.0.0.1:6379> LRANGE queues:helloJobQueue 0 -1
4创建执行队列方法(注:方法不能随便取,要和3.1对应起来!!!)
代码文件:/application/index/job/Hello.php 代码如下:
<?php
/*** 文件路径: \application\index\job\Hello.php* 这是一个消费者类,用于处理 helloJobQueue 队列中的任务*/
namespace app\index\job;use think\Db;
use think\queue\Job;class Hello {/*** fire方法是消息队列默认调用的方法* @param Job $job 当前的任务对象* @param array|mixed $data 发布任务时自定义的数据*/public function fire(Job $job,$data){// 如有必要,可以根据业务需求和数据库中的最新数据,判断该任务是否仍有必要执行.$isJobStillNeedToBeDone = $this->checkDatabaseToSeeIfJobNeedToBeDone($data);if(!$isJobStillNeedToBeDone){$job->delete();return;}$isJobDone = $this->doHelloJob($data);if ($isJobDone) {//如果任务执行成功, 记得删除任务$job->delete();print("<info>Hello Job has been done and deleted"."</info>\n");}else{if ($job->attempts() > 3) {//通过这个方法可以检查这个任务已经重试了几次了print("<warn>Hello Job has been retried more than 3 times!"."</warn>\n");$job->delete();}}}/*** 有些消息在到达消费者时,可能已经不再需要执行了* @param array|mixed $data 发布任务时自定义的数据* @return boolean 任务执行的结果*/private function checkDatabaseToSeeIfJobNeedToBeDone($data){return true;}/*** 根据消息中的数据进行实际的业务处理* @param array|mixed $data 发布任务时自定义的数据* @return boolean 任务执行的结果*/private function doHelloJob($data) {// 根据消息中的数据进行实际的业务处理...if(isset($data['id']) && $data['id'] && isset($data['something'])){Db::table('xxoo')->where('id',$data['id'])->update(['something'=>$data['something']]);}sleep(8);return true;}
}
5运用supervisor多进程处理
5.1安装supervisor
yum install -y supervisor
cd /etc/supervisord.d/
vi upxxoo.ini
下面是upxxoo.ini配置信息
[program:uplikes] ;程序名称,在 supervisorctl 中通过这个值来对程序进行一系列的操作
command=php /项目目录/think queue:listen --queue helloJobQueue
autostart=true ;在 supervisord 启动的时候也自动启动
autorestart=true ; 程序异常退出后自动重启
user=root ;用哪个用户启动
process_name=%(process_num)02d
numprocs=2;进程数跟CPU核心数有关系
redirect_stderr=true ;把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes=20MB ;stdout 日志文件大小,默认 50MB
stdout_logfile_backups=20 ;stdout 日志文件备份数
stderr_logfile=/www/wwwlogs/worker_err.log ; 错误日志文件
stdout_logfile=/www/wwwlogs/worker.log ;输出日志文件
5.2启动supervisor
supervisord -c /etc/supervisord.conf
5.3查看状态,停止运行
supervisorctl status
supervisorctl shutdown
thinkPHP/fastadmin topthink/think-queue 多进程相关推荐
- 获取其他线程的数据用 queue, 多进程Q
获取其他线程的数据用 queue, 多进程Q 转载于:https://www.cnblogs.com/pythonClub/p/10018811.html
- python queue 多进程_python中的Queue与多进程(multiprocessing)
最近接触一个项目,要在多个虚拟机中运行任务,参考别人之前项目的代码,采用了多进程来处理,于是上网查了查python中的多进程 一.先说说Queue(队列对象) Queue是python中的标准库,可以 ...
- 阿里云消息队列python_41. Python Queue 多进程的消息队列 PIPE
消息队列: 消息队列是在消息传输过程中保存消息的容器. 消息队列最经典的用法就是消费者和生产者之间通过消息管道来传递消息,消费者和生产生是不通的进程.生产者往管道中写消息,消费者从管道中读消息. 相当 ...
- thinkphp fastadmin 解决vue前后端分离项目的跨域问题 以及 OPTIONS请求类型
fastadmin的专用方法: 修改文件:application/config.php,这是fa的配置文件. 修改属性 cors_request_domain,搜一下就找到了,在里面加上你的域名就行了 ...
- 一篇文章学习Python中的多进程
基本知识: 一.什么是多进程 Multiprocessing 二.添加多进程 Process 三.存储进程输出 Queue 四.效率对比 threading & multiprocessing ...
- Python 多进程
1.Python 多进程 类型 CPU密集型操作 IO密集型操作 网络请求密集型操作 线性操作 94.91824996 22.46199995 7.3296 多线程操作 101.1700001 24. ...
- 多进程(Multiprocessing)
多进程(Multiprocessing) 源自莫烦python多进程教学 一.多进程的定义和优点 多进程相当于多核处理,它能弥补threading的缺点 即它可以把任务平均分配给每一个核,并且让它们同 ...
- python 神经网络 多进程_Pytorch多进程最佳实践
预备知识 模型并行( model parallelism ):即把模型拆分放到不同的设备进行训练,分布式系统中的不同机器(GPU/CPU等)负责网络模型的不同部分 -- 例如,神经网络模型的不同网络层 ...
- python进阶10并发之六并行化改造
原创博客地址:python进阶10并发之六并行化改造 图示变量含义说明: 1个大step中包含3个小step,大step内部的第一步,二步,三步存在依赖关系(就是内部保持顺序执行) a1,b1,c1, ...
最新文章
- MySQL存储过程详解
- 题目1008:最短路径问题
- SpringBoot-切面AOP实现统一逻辑处理
- mysql千万级数据索引查询_mysql千万级数据量根据索引优化查询速度
- XSS之xssprotect
- go 捕获网卡http_接口测试工具Postman(三)使用postman抓包捕获HTTP请求-Go语言中文社区...
- js 获取url问号前_收下这波 JS 技巧,从此少加班
- CentOS8 模块化仓库
- 使用spring-data-jpa实现简单的两表联查
- java逗号的转义字符是,Java是否有'@'字符来转义字符串引号?
- Oracle执行计划稳固
- 4. PSR-4 --- 自动加载
- 第7章 PCA与梯度上升法 学习笔记上
- 【代码】获取日期所在月份的 月初、月末的日期
- 前端工具-Rollup
- 谈谈如何通过需求文档产生工作排期
- 计算机系统应用是不是核心期刊,计算机系统应用
- eclipse 项目有红叉(解决方法)
- Robot Global新世纪的数字货币理财
- 中国医科大学护理学专业远程教育招生
热门文章
- 计算机设计大赛国奖作品_6. 测试报告
- Java工程师工资高吗?
- few-shot 微调网络
- 什么牌子蓝牙耳机玩游戏好用?游戏低延迟蓝牙耳机排行
- 理工科Word论文排版(章节自动标号、公式自动标号、图片自动标号、表格自动标号、标号交叉引用、公式参数介绍等),持续更新
- java-php-python-ssm校园闲置物品交易系统计算机毕业设计
- Conway‘s Game of Life - Unlimited Edition(康威生命游戏-无限版)
- 深入理解CSS定位中的偏移
- 【狂神说docker笔记】 入门篇(手敲的 网络篇请移步视频)
- 仿苹果AppStore 环形下载进度条