php+redis实现对200w用户的即时推送服务

怎么实现对200w用户的即时推送,这个推送可以理解为调用第三方的接口,push,sms之类的东西。

当时先写了一个demo 直接读取DB然后单个推送,结果。。。。可想而知

于是设计一套基于redisphp多进程的方案,用着还不错而去扩展性蛮高的,故分享之。

=============================================

具体的逻辑如下:(无视我的字体)

php+redis实现对200w用户的即时推送服务

其实这里还可以优化的,我的设想是如果用户数据再多一些的话,可以在redis里对数据进行分割采取多List,每一个List对应多个php进程这样会更快。

下面是我实现的具体代码:

主管理脚本:应用时启动这个即可。

<?php          //push推送配置  注:使用前请确认log文件为空       2016-04-12
include_once(dirname (__FILE__)."/../../config.inc.php");
//if(exec('ps aux | grep redis_push.php | grep -v grep | wc -l') != 0) goto check;
import('push.class.php');
import('Redis.class.php');

$time  =time();
$data  = array("apikey"=>'xxxx',"secret"=>'xxxx');
$push  = new Channel($data);
$redis = new RedisCache($Credis['host'],$Credis['port']);
if(exec('ps aux | grep redis_push.php | grep -v grep | wc -l') != 0) goto check;//如果有推送任务 直接执行监控代码

/*PUSH配置项*/
$config = array(
  "file"=>"test.txt",
  "Title"=>"sssss",
  "Content"=>"ssssssssssssssss",
  "OpenType"=>"0",    //1是  0否    是否跳转链接
  "Url"=>"",         //链接地址
  "num"=>"500",      //每次推送条数
  "s"=>"1"           //睡眠时间 (单位:秒)
);
$num = 15;            //启动进程数量
$a = $config['OpenType']==1 ? "是" : "否";
$c = json_encode($config);
$info = <<<monkey
   ************ 请确认信息是否有误*10秒后启动push任务! *************
   * 文件名称   : {$config['file']};
   * 推送标题   : {$config['Title']};
   * 推送内容   : {$config['Content']};
   * 是否跳转   : {$config['OpenType']};
   * 进程数量   : $num;(如果为单进程无视此项)
   * 睡眠时间   : {$config['s']};
   * 日志目录   : /log;
   ***************************************************************\\n
monkey;
echo $info;
sleep(3);
$n = 1;
while($n<=10){
  echo (10-$n++),"秒\\n";
  sleep(1);
}
echo "------------------------- 任务已启动 -------------------------\\n";
if($redis->Scount('push_getchannel_success')){
  echo "队列有未完成任务\\n";
}else{
  $res = exec("php redis_getchannel.php {$config['file']}");//写入redis脚本
  echo $res;
}
smtp_mail('xxxx@qq.com','推送任务已开启','请实时监测,5秒后您的手机将接收到测试推送!');//推送监控 实现定时全自动推送 
echo "\\n---------------- 5秒后 test 将收到测试推送消息 ----------------\\n";
sleep(5);
$re = $push->BaiduPush('xxxx','xxxxx',$config['Content'],$config['Title'],'1',$config['OpenType'],$config['Url'],'xxxxx',$push);
sleep(1);
echo "\\n---------------- 测试推送已发出!如未收到,请及时终止程序! 10秒后正式推送!!! ----------------\\n";
$m = 1;
while($m<=10){
  echo (10-$m++),"秒\\n";
  sleep(1);
}
echo "\\n---------------- 推送任务已经开始!请耐心等待! ----------------\\n";
//下面设置是否多进程
for($i=1;$i<=$num;$i++){
exec("php redis_push.php  '{$c}' > /dev/null 2>&1 &");
}

check:
while(1){
  if(exec('ps aux | grep redis_push.php | grep -v grep | wc -l') == 0){
    echo "push 发送完成 用时",time()-$time,"秒";
    die();
  }
  echo "当前进程数:",exec('ps aux | grep redis_push.php | grep -v grep | wc -l'),"个","\\n";
  echo "当前剩余推送数量:".$redis->Scount('push_getchannel_success')."\\n";
  sleep(10);
}

至于写入redis和具体的推送脚本这个靠自己的想象里就好了 我就不发了 嘿嘿

我的做法是具体的推送脚本在推送一定数量后会自动终止并调用自己本身。

因为在实际应用中发现php脚本在长时间运行之后会发生假死(可能是因为上下文切换的问题),

所以我都是避免让php脚本长时间运行。

还有就是用户肯定不是固定的200w用户 每天都会有一个增量,我的方案是通过定时脚本每天把增量的用户整理进我自己设计的一个用户表自己管理。

ps:我把所有的脚本弄到了一个我自己整理的小的php原生框架统一管理,过段时间我发出来。

欢迎指正,谢谢。

关于php+redis实现对200w用户的即时推送服务的文章就分享到这,如果对你有帮助欢迎继续关注我们哦

本文来自投稿,不代表重蔚自留地立场,如若转载,请注明出处https://www.cwhello.com/41671.html

如有侵犯您的合法权益请发邮件951076433@qq.com联系删除

(0)
php学习php学习订阅用户
上一篇 2022年6月21日 22:42
下一篇 2022年6月21日 22:42

相关推荐

  • Redis在PHP应用中的集群监控。

    Redis是一种基于内存的开源数据结构存储系统,广泛用于缓存、消息队列、任务分发等场景。在PHP应用中,Redis常常扮演着重要的角色。随着业务的不断扩展,Redis集群的规模也会逐渐增大,如何进行有效的监控是保障应…

    2023年5月21日
    02
  • PHP与BI工具的集成

    随着数据分析和商业智能(BI)的普及,越来越多的企业开始使用BI工具来帮助他们更好地理解和管理企业数据。PHP是一种广泛使用的Web开发语言,在企业中也非常常见。因此,将PHP和BI工具集成在一起可以带来许多好处。…

    2023年5月19日
    02
  • 分析PHP URL中特殊字符引起的问题(+,\\,=)

    PHP中URL中特殊字符引起的问题(+,,=)前言,在做某个渠道的过程中,发现一个验签错误的问题。但是,当时验签在两个地方表现不一致,同一套处理方法,想到了这是因为两个地方请求方式是不同的一个get方法另外一个自然…

    2022年6月23日
    0153
  • PHP完善压缩处理类(支持主流的图像类型(jpg、png、gif)

    处理主流的图像类型(jpg、png、gif) Jpg -> imagecreatefromjpeg() Png->imagecreatefrompng() Gif->imagecreatrefromgif()   保存图像的时候: Png--->imagepng() Gif---->imagegif() Jpg--…

    2018年9月11日 PHP案例操作
    0335
  • GOTO语句

    goto语句就是在页面中的不同位置进行跳转. 语法:  Goto 表示名;                        可以写代码;              表示名: 案例:

    2018年4月1日
    0212
  • 如何在PHP中实现轮播图。

    随着互联网的发展,轮播图已经成为了网页设计中必不可少的一部分。在很多网页中,轮播图经常被用作展示企业文化、最新产品或是推广活动等场景。本篇文章将会分享如何使用PHP来实现轮播图的功能。一、轮播图的概念轮…

    2023年5月23日
    0105
  • PHP商城开发中的页面性能优化

    随着电商市场的逐步扩大,越来越多的企业选择建立自己的电商平台来开展业务。而在建立电商平台的过程中,开发人员需要考虑的不仅是平台的功能,还需要考虑页面的性能优化问题,以提高用户体验和网站的排名。本文将…

    2023年5月19日
    04
  • PHP递归思想说明

    说明:在一个函数内部再次有条件调用自己(当前函数),这个时候就称为“递归调用”,即自己调用自己。 代码 图解 注意: 递归调用必须有一个可以退出的条件,否则无法退出递归调用,就会成死归,也就是说必须逐渐的退…

    2018年4月7日
    0193

联系我们

QQ:951076433

在线咨询:点击这里给我发消息邮件:951076433@qq.com工作时间:周一至周五,9:30-18:30,节假日休息