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

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

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

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

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

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

其实这里还可以优化的,我的设想是如果用户数据再多一些的话,可以在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原生框架统一管理,过段时间我发出来。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-08-01 14:34:59

php redis实现对200w用户的即时推送的相关文章

node js-php应用80端口,使用node.js通过8888端口实现即时推送,怎么解决跨域问题?

问题描述 php应用80端口,使用node.js通过8888端口实现即时推送,怎么解决跨域问题? 项目背景是一个php应用.为了加入即时推送功能,使用node.js写了8888端口用于推送即时消息,并使用socket.io进行数据传输. 如何解决80端口应用页面跨域与8888端口建立socket连接问题?

php+mysql做后台,怎么实现用户登陆,推送消息

问题描述 php+mysql做后台,怎么实现用户登陆,推送消息 大概情况是这样的: 当A登陆以后,可以发消息给B,如下图,选择B的工号 发送以后,B登陆,可以在部门消息那里会显示一个小红点,提示有消息 我的思路是这样的:当A按下发送以后,就向存放消息的数据库里写一条记录,并把消息的状态码设置成未读,接收人是B,当B登陆以后,因为状态码是未读,就会显示提示信息.可是这个提示怎么实现? 这是我消息的数据库: 如果我一次发同样的消息给多个人,是不是应该写多条记录?向数据库写消息要循环? 还有一个问题是

互动百科将向注册用户提供信息推送服务

据互动百科员工透露,该网站将于近期推出名为"互动咨询"的信息推送服务,该服务将向网站注册用户定期推送站内热门词条. 据悉,该服务目前还处于调试阶段,正式推出后将采用邮件形式发送,内容将主要包括站内热门词条和网站最新动态. 首次将向所有注册用户发送邮件,而用户可以通过回复邮件的方式终止服务.初期推送每周两次,但会根据用户反馈调整推送周期. 据了解目前包括百度百科和维基百科在内的百科类网站暂未推出此类服务.(完)

帮助app摒弃打扰用户的盲目推送,个推发布2.0产品

摘要: 个推现在每天向用户分发8亿条消息,但他们却觉得推送得太多了,未来的推送应该是在合适的时间.合适的场景把合适的内容推送给合适的人.今天,个推在GMIC大会上发布了他们即将 个推现在每天向用户分发8亿条消息,但他们却觉得推送得太多了,未来的推送应该是"在合适的时间.合适的场景把合适的内容推送给合适的人".今天,个推在GMIC大会上发布了他们即将在6月面向所有开发者的个推2.0 Smart Push,希望帮助app摒弃打扰用户的盲目推送. 个推是移动(Android & iO

WordPress发布文章即时推送到百度,加快百度收录

一.主动推送 先来看下百度对于主动推送的一些说明:     主动推送:最为快速的提交方式,建议您将站点当天新产出链接立即通过此方式推送给百度,以保证新链接可以及时被百度收录.     主动推送支持多种途径:比如curl .post.php以及ruby等.而且支持一次性提交多条网站页面地址,不过每个站点每天可推送的次数暂时限制在50次.    使用主动推送功能会达到怎样效果?    ①.及时发现:可以缩短百度爬虫发现您站点新链接的时间,使新发布的页面可以在第一时间被百度收录    ②.保护原创:对

Urban Airship:优化信息推送提升应用用户停留率

据http://www.aliyun.com/zixun/aggregation/4415.html">Urban Airship的研究,倾向于消息推送的移动应用用户在使用应用一个月后的停留率会高26%,而六个月后的停留率则高两倍. Urban Airship是一家向开发者提供消息报和应用内购解决方案的机构.它公布这些数据将会成为该机构Good Push Index的一部分.Urban Airship成立于2011年八月,利用其提供的服务来研究应用来追踪接受信息服务的用户的参与度与停留度,

应用推送,别把用户“PUSH”烦了!

摘要: 导语:社交类游戏中经常可以看到快来帮帮我!牧场出问题了!的推送,这种单纯为了唤回用户而发送的推送也无效并且容易让用户产生厌倦. 作为重要的手机应用程序运营手段,推送越 导语:社交类游戏中经常可以看到"快来帮帮我!""牧场出问题了!"的推送,这种单纯为了唤回用户而发送的推送也无效并且容易让用户产生厌倦. 作为重要的手机应用程序运营手段,推送越来越受到手游运营商们的重视,但调查研究发现许多运营商似乎并没有很好的了解.运用这一手法,今天GameLook就和大家分享

留住你的用户:8款第三方移动推送服务

所谓"成功易,守功难",开发者最不愿看到的就是,最初苦心经营的用户不断流失.有统计显示,做了Push的应用的留存率,是没有做Push的应用的两倍.本文将为开发者们介绍8个国内外比较知名的第三方推送服务.   国外针对大量应用做了一个统计,发现平均一个应用一般6个月的用户留存率只有 15%,但做了Push后留存率达到30%,提高一倍.虽然Push对提升应用的用户黏性有益,但需要投入一定的开发成本,所以许多开发者把目光投向第三方推送服务.以下推荐几个国内外比较知名的第三方推送服务商,帮你&

用ASP实现对Web搜索引擎Index Server的访问

摘要:Index Server是专门为企业Web网站设计的专业搜索引擎,传统的访问方法HTML/IDQ/HTX由于固有的特性,缺乏灵活性.本文介绍用ASP实现对Index Server访问的两种方法,以及如何实现复杂查询,和对查询结果的控制. 关键字:Index Server ASP ADO  在电子商务方兴未艾的今天,企业上网不但是为了展示企业形象,提高知名度:也意味着无穷的商机与财富.而内部网Intranet则为企业带来了全新的沟通方式和管理理念.因此构建企业Web站点已经排上了许多企业信息