分享php+redis实现对200w用户的即时推送服务
推荐:《PHP视频教程》
怎么实现对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原生框架统一管理,过段时间我发出来。
欢迎指正,谢谢。
以上是分享php+redis实现对200w用户的即时推送服务的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Redis集群模式通过分片将Redis实例部署到多个服务器,提高可扩展性和可用性。搭建步骤如下:创建奇数个Redis实例,端口不同;创建3个sentinel实例,监控Redis实例并进行故障转移;配置sentinel配置文件,添加监控Redis实例信息和故障转移设置;配置Redis实例配置文件,启用集群模式并指定集群信息文件路径;创建nodes.conf文件,包含各Redis实例的信息;启动集群,执行create命令创建集群并指定副本数量;登录集群执行CLUSTER INFO命令验证集群状态;使

PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。

如何清空 Redis 数据:使用 FLUSHALL 命令清除所有键值。使用 FLUSHDB 命令清除当前选定数据库的键值。使用 SELECT 切换数据库,再使用 FLUSHDB 清除多个数据库。使用 DEL 命令删除特定键。使用 redis-cli 工具清空数据。

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

PHP在现代Web开发中仍然重要,尤其在内容管理和电子商务平台。1)PHP拥有丰富的生态系统和强大框架支持,如Laravel和Symfony。2)性能优化可通过OPcache和Nginx实现。3)PHP8.0引入JIT编译器,提升性能。4)云原生应用通过Docker和Kubernetes部署,提高灵活性和可扩展性。

要从 Redis 读取队列,需要获取队列名称、使用 LPOP 命令读取元素,并处理空队列。具体步骤如下:获取队列名称:以 "queue:" 前缀命名,如 "queue:my-queue"。使用 LPOP 命令:从队列头部弹出元素并返回其值,如 LPOP queue:my-queue。处理空队列:如果队列为空,LPOP 返回 nil,可先检查队列是否存在再读取元素。

PHP成为许多网站首选技术栈的原因包括其易用性、强大社区支持和广泛应用。1)易于学习和使用,适合初学者。2)拥有庞大的开发者社区,资源丰富。3)广泛应用于WordPress、Drupal等平台。4)与Web服务器紧密集成,简化开发部署。
