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)
上一篇 2022年6月21日 22:42
下一篇 2022年6月21日 22:42

相关推荐

  • PHP常用函数大全-(1)php数组处理常用的函数

    (1)php数组处理常用的函数 array_change_key_case — 返回字符串键名全为小写或大写的数组 array_chunk — 将一个数组分割成多个 array_combine — 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其...

    2015年12月7日
    0315
  • PHP实现数据库异地容灾故障恢复的方法。

    随着现代企业对信息化建设的重视程度越来越高,数据安全性和可靠性也成为了企业工作中至关重要的事项之一。一旦数据库出现故障,恢复数据需要耗费大量的时间和精力,而且在某些情况下,恢复效果并不理想。因此,...

    2023年5月21日
    07
  • 详细介绍php 三种文件下载的实现

    本篇文章给大家详细介绍php 三种文件下载的实现有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。1、直接添加文件链接<button> <a href = "http://localhost/down.zip"> ...

    2023年3月29日 PHP自学教程
    01
  • php如何进行内存调试

    内存调试本章是有关PHP源代码的内存调试的简要介绍。 这不是一门完整的课程:内存调试并不难, 但是你需要一些它的使用经验,大量的练习可能是你在设计任何C编写的代码时都必须要做的事情。我们将在这里介绍一个非...

    2022年6月13日
    0154
  • PHP中使用Redis实现分级存储。

    随着互联网业务的快速发展,数据量的增长速度也越来越快。在这样大规模的数据处理中,如何高效地存储和快速访问数据成为了一个亟待解决的问题。传统的关系型数据库存储方式已经无法满足需要,因此,非关系型存储...

    2023年5月21日
    02
  • 如何在PHP中实现复杂企业应用系统。

    随着企业规模的扩大,企业应用系统日益复杂。在这种情况下,如何在PHP中实现复杂企业应用系统的开发和维护,成为了每个PHP开发人员必须处理的问题。以下是一些实用的技巧和建议,帮助PHP开发人员更好地实现复杂的...

    2023年5月22日
    00
  • PHP中的LBS地图操作指南。

    PHP是一种常用的Web编程语言,它可以被用来创建交互式的地图应用程序。其中,LBS(Located Based Services,基于位置服务)是一种非常重要的技术,能够让应用程序利用用户的位置信息来提供更加智能、个性化的服务。...

    2023年5月30日
    02
  • 详解使用PHP开发直播功能的实用技巧。

    随着互联网的不断发展,直播功能也越来越受到人们的关注和青睐。在这样一个直播风潮的时代,需要一款稳定可靠的直播平台。而PHP作为一种强大的服务器端开发语言,可以用于创建高度交互性的应用程序,能够为直播平...

    2023年5月23日
    01

联系我们

QQ:951076433

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