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

相关推荐

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

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

    2015年12月7日
    0319
  • PHP8.0中的文件操作:文件监控

    随着Web应用程序的不断发展,PHP已经成为了Web开发中最重要的编程语言之一。作为一门灵活性极强的编程语言,PHP的每个版本都带来了新的功能和优化,为了满足不同的需求应用场景。在PHP 8.0版本中,新增了一个非常实…

    2023年5月19日
    05
  • PHP商城中的积分商城设计与实现。

    随着电商平台逐渐成为人们购物的主要渠道,积分商城作为促销活动方式之一也逐渐流行起来。PHP商城作为一种电商平台,也需要在积分商城的设计方面予以考虑。本文将介绍PHP商城中积分商城的设计与实现。一、积分商城…

    2023年5月28日
    03
  • 我来分享php跳转到指定url代码。

    在PHP中,我们可以使用`header()`函数来实现页面的跳转,`header()`函数可以发送一个原始的HTTP报头给客户端,这个报头包括了状态码、头部信息和可能的重定向信息,当服务器发送一个响应给客户端时,它会首先设置状…

    2024年6月19日
    03
  • 今日分享如何查看redis节点和集群。

    使用redis-cli工具,通过输入’cluster nodes’和’cluster info’命令查看节点和集群信息。 在现代的分布式系统中,Redis 是一个广泛使用的内存数据结构存储系统,它支持多种数据结构,如字符…

    2024年7月27日
    01
  • 示例php+mysql查询实现无限下级分类树输出

    本文实例讲述了php+mysql查询实现无限下级分类树输出。分享给大家供大家参考,具体如下:这里介绍的php结合mysql查询无限下级树输出,其实就是无限分类。给各位整理了几个php无限分类的例子.【

    2022年6月17日
    0181
  • PHP文件操作相关函数

    bool copy ( string filename , string dest ) 复制文件 string filename:原文件 string dest :目标文件 bool unlink ( string filename ) 删除文件 string filename:要删除的文件 bool rename ( string oldname…

    2017年11月15日
    0356
  • Redis在PHP应用中的数据库索引。

    Redis是一款常用的内存数据库,它被广泛使用在各种语言和应用中,其中包括PHP。 PHP是一种使用广泛的Web编程语言,开发者在使用PHP编写Web应用程序时往往需要使用外部数据存储以及快速访问这些数据。而Redis的快速…

    2023年5月21日
    01

联系我们

QQ:951076433

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