redis php 守护进程,PHP守护进程利用Redis队列实现业务
PHP可以用 GO也可以用这个不限制
队列使用场景,大量用户信息推送,大量祝福短信发送等
核心技术点 Redis的lpush brpop
lpush 负责向key中写入数据
brpop 阻塞模式获取key中的值从而实现业务
模拟实例。向用户发送短信
PHP版代码2.0
生成者
/**
* Created by PhpStorm.
* User: smallForest<1032817724@qq.com>
* Date: 2019-12-02
* Time: 11:11
*/
ini_set('default_socket_timeout', -1); //不超时
// 声明对象
$redis = new \Redis();
// 连接Redis
$r = $redis->connect('127.0.0.1', 6379);
// 选择Redis DB
$redis->select(4);
// 声明SMS队列的key
$key = 'SMS_QUEUE';
//写入数据
for ($i = 0; $i < 10; $i++) {
// 获取随机手机号 // 有的时候不同用户文本内容不一样 最好可以分开设置。注意key名可以根据情况更改
$json = json_encode(["mobile"=>randomPhoneNumber(),"msg"=>"【滴滴答】尊敬的用户您好!祝您新年快乐!"]);
// 左入队列
$redis->lPush($key, $json);
echo 'yes:' . $i . PHP_EOL;
}
function randomPhoneNumber()
{
// 手机号头
$header = ["133", "149", "153", "173", "177",
"180", "181", "189", "199", "130", "131", "132",
"145", "155", "156", "166", "171", "175", "176",
"185", "186", "166", "134", "135", "136", "137",
"138", "139", "147", "150", "151", "152", "157",
"158", "159", "172", "178", "182", "183", "184",
"187", "188", "198", "170", "171"];
$count = count($header);
$header_value = rand(0, $count - 1);
return $header[$header_value] . '****' . rand(1000, 9999);
}
消费者
/**
* Created by PhpStorm.
* User: smallForest<1032817724@qq.com>
* Date: 2019-12-02
* Time: 10:58
*/
ini_set('default_socket_timeout', -1); //不超时
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
$redis->select(4);//切换到db4
$redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);
While ($key_arr = $redis->brpop('SMS_QUEUE', 0)) {
try{
// key_arr 是一个数组 0 表示key名称 SMS_QUEUE ,1 表示获取到的值
usleep(100000);
$json = $key_arr[1];
//解析json
$json_arr = json_decode($json,true);
if(is_array($json_arr) && count($json_arr)==2){
if(!sms($json_arr["mobile"], $json_arr["msg"])){
throw new Exception("发送失败");
}
}else{
throw new Exception("解析失败");
}
}catch (Exception $e){
// 左入队列
$redis->lPush("SMS_QUEUE", $json);
}
}
// 发送短信函数
function sms($mobile, $msg)
{
echo '用户手机号:' . $mobile . ',信息:' . $msg . ' 发送成功!' . PHP_EOL;
return true;
}
PHP版代码1.0
生产者
/**
* Created by PhpStorm.
* User: smallForest<1032817724@qq.com>
* Date: 2019-12-02
* Time: 11:11
*/
ini_set('default_socket_timeout', -1); //不超时
// 声明对象
$redis = new \Redis();
// 连接Redis
$r = $redis->connect('127.0.0.1', 6379);
// 选择Redis DB
$redis->select(4);
// 声明SMS队列的key
$key = 'SMS_QUEUE';
//写入数据
for ($i = 0; $i < 10; $i++) {
// 获取随机手机号
$m = randomPhoneNumber();
// 左入队列
$redis->lPush($key, $m);
// 有的时候不同用户文本内容不一样 最好可以分开设置。注意key名可以根据情况更改
$redis->set($m, '【滴滴答】尊敬的用户您好!祝您新年快乐!');
echo 'yes:' . $i . PHP_EOL;
}
function randomPhoneNumber()
{
// 手机号头
$header = ["133", "149", "153", "173", "177",
"180", "181", "189", "199", "130", "131", "132",
"145", "155", "156", "166", "171", "175", "176",
"185", "186", "166", "134", "135", "136", "137",
"138", "139", "147", "150", "151", "152", "157",
"158", "159", "172", "178", "182", "183", "184",
"187", "188", "198", "170", "171"];
$count = count($header);
$header_value = rand(0, $count - 1);
return $header[$header_value] . '****' . rand(1000, 9999);
}
消费者
/**
* Created by PhpStorm.
* User: smallForest<1032817724@qq.com>
* Date: 2019-12-02
* Time: 10:58
*/
ini_set('default_socket_timeout', -1); //不超时
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
$redis->select(4);//切换到db3
$redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);
While ($key_arr = $redis->brpop('SMS_QUEUE', 0)) {
// key_arr 是一个数组 0 表示key名称 SMS_QUEUE ,1 表示获取到的值
usleep(100000);
$key = $key_arr[1];
if ($msg = $redis->get($key)) {
sms($key, $msg);
$redis->del(key());
}
}
// 发送短信函数
function sms($mobile, $msg)
{
echo '用户手机号:' . $mobile . ',信息:' . $msg . ' 发送成功!' . PHP_EOL;
}
守护进程可以用nohup创建,给消费者创建守护进程
?疑问-如果lpush很多手机号该怎么办呢?
swoole多线程
redis php 守护进程,PHP守护进程利用Redis队列实现业务相关推荐
- 利用Redis一步步实现优惠券的最终秒杀方案
订单ID不能采用自增长的原因: 1.规律变化太明显.两天下单的ID的差值,能够计算出商城的订单量: 2.如果采用自增长,订单数据是会不断产生的,到时候要分表,但是每个表的ID都是从0开始增长的,这样I ...
- 【Redis】redis开机自启动、设置守护进程、密码设置、访问权限控制等安全设置(redis默认端口6379)...
一.redis设置开机自启动:centOS: 1.修改redis.conf中daemonize为yes,确保守护进程开启,也就是在后台可以运行. (守护进程:孤儿进程:独立于终端而存在的进程,不会因为 ...
- Python 多进程笔记 — 启动进程的方式、守护进程、进程间通信、进程池、进程池之间通信、多进程生产消费模型
1 面向过程启动多进程 Python 操作进程的类都定义在 multiprocessing 模块,该模块提供了一个 Process 类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另 ...
- 【Linux系统编程】特殊进程之守护进程
00. 目录 文章目录 00. 目录 01. 守护进程概述 02. 守护进程查看方法 03. 编写守护进程的步骤 04. 守护进程代码 05. 附录 01. 守护进程概述 守护进程(Daemon Pr ...
- Linux 进程(一) 进程概念和进程状态(僵尸进程、孤儿进程、守护进程)
进程的概念 进程状态 僵尸进程.孤儿进程.守护进程 进程的概念 程序:一系列有序的指令集合(就是我们写的代码) 进程:进程就是程序的一次执行,是系统进行资源分配和调度的独立单位. 程序是一个没有生命的 ...
- Linux | 进程概念、进程状态(僵尸进程、孤儿进程、守护进程)、进程地址空间
文章目录 进程和程序 操作系统如何控制和调度程序 进程控制块–PCB 子进程 进程状态 僵尸进程 孤儿进程 守护进程(精灵进程) 进程地址空间 引言 页表 进程和程序 程序: 一系列有序的指令集合(就 ...
- python实现守护进程_守护进程原理及Python实现
守护进程原理及Python实现 守护进程,不依赖于终端,在后台运行的程序,通常称为daemon(ˈdiːmən或ˈdeɪmən). 一些常见的Linux软件通常都是已守护进程的方式运行,比如: ngi ...
- Android 系统(271)---进程、守护进程的实现及进程拉活
进程.守护进程的实现及进程拉活 1,概念 1)守护进程(Daemon) 是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某些任务.android中守护进程的实现主要由Service来完成. ...
- Linux进程学习(孤儿进程和守护进程)
孤儿进程和守护进程 通过前面的学习我们了解了如何通过fork()函数和vfork()函数来创建一个进程.现在 我们继续深入来学习两个特殊的进程:孤儿进程和守护进程 一.孤儿进程 1.什么是 孤儿进程 ...
- mysql进程daemon_守护进程详解及创建,daemon()使用
一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而 且提供某种服务,不是对整 ...
最新文章
- springboot中接口实例化_疫情爆发在家闲出屁的我,梳理一下SpringBoot知识点
- CG CTF RE Hello,RE!
- python我的世界给予物品指令_我的世界指令给予物品 我的世界指令给予物品是多少...
- android手机两种方式获取IP地址
- oracle打开文件模式无效,oracle expdp导入时 提示“ORA-39002: 操作无效 ORA-39070: 无法打开日志文件 ”...
- 《天天数学》连载45:二月十四日
- 冰原服务器维护,12月2日服务器公告:冰原旅途进发
- IPSec隧道配置案例(手动模式)
- 简单介绍信用卡分销系统
- 【底层原理】x86-64体系下一个奇怪问题的定位
- 如何设计 user 表?加入第三方登录呢?
- Aha!设计模式(96)-观察者模式(1)
- 光纤的基本理论光纤的色散
- 深入理解Java三种IO模式和Epoll模型
- 计算机系统时microsoft账号是,电脑microsoft账户登不进去
- 移动通信概述-架构篇
- 整型常量是整数类型的数据
- 关于过期更换ssl证书的相关问题
- js实现简单的点名器随机色
- 选择器权重及字体属性
热门文章
- 进程(process)和线程(thread)
- 揭开雷达的面纱(科普)探测能力
- keil debug时用断点管理抓取变量变化
- 详解「递归」正确的打开方式
- C++基本操作符重载
- Class.getResourceAsStream和ClassLoader.getResourceAsStream方法
- caioj 1077 动态规划入门(非常规DP1:筷子)
- Struts2配置文件【代码库】
- centos6.5下安装配置ELK及收集nginx日志
- Should i Backup all my domain controllers