问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

PHP 如何实现2w用户的短信发送

发布网友 发布时间:2022-04-05 23:40

我来回答

2个回答

懂视网 时间:2022-04-06 04:01

推荐:《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;
 ***************************************************************

monkey;
echo $info;
sleep(3);
$n = 1;
while($n<=10){
 echo (10-$n++),"秒
";
 sleep(1);
}
echo "------------------------- 任务已启动 -------------------------
";
if($redis->Scount('push_getchannel_success')){
 echo "队列有未完成任务
";
}else{
 $res = exec("php redis_getchannel.php {$config['file']}");//写入redis脚本
 echo $res;
}
smtp_mail('xxxx@qq.com','推送任务已开启','请实时监测,5秒后您的手机将接收到测试推送!');//推送监控 实现定时全自动推送 
echo "
---------------- 5秒后 test 将收到测试推送消息 ----------------
";
sleep(5);
$re = $push->BaiduPush('xxxx','xxxxx',$config['Content'],$config['Title'],'1',$config['OpenType'],$config['Url'],'xxxxx',$push);
sleep(1);
echo "
---------------- 测试推送已发出!如未收到,请及时终止程序! 10秒后正式推送!!! ----------------
";
$m = 1;
while($m<=10){
 echo (10-$m++),"秒
";
 sleep(1);
}
echo "
---------------- 推送任务已经开始!请耐心等待! ----------------
";
//下面设置是否多进程
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'),"个","
";
 echo "当前剩余推送数量:".$redis->Scount('push_getchannel_success')."
";
 sleep(10);
}

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

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

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

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

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

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

欢迎指正,谢谢。

热心网友 时间:2022-04-06 01:09

redis订阅发布可以搞定
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
纹身纹在不容易被人看到的地方,比如腰的上面一点,人际交往应该没什么... 我想办信用卡,工作证明这样写可以不? 工作证明 兹有我单位 办理信用卡需要验证上班公司的信息吗?办卡需要什么条件? 没有固定单位上班能申办信用卡吗? 少年包青天3上三大神器一案中谁是凶手? 仙人山服务区有早点吗_防城港3路公交车路线 山西队迪亚洛是哪个国家的 现在机票的飞机建设费和燃油费 贾府是一座大宅子黛玉走了哪些地方 一个长方形操场长110米宽90米把它画在比例尺上1:100的图纸上,长和... 用php-redis给全部用户发送邮件,数据量很大,思路应该是什么样的 XAMPP我把apache端口号从80改成82了,我想知道怎样才用localhost不加端口号也能访问。 怎么修改Xampp中Apache服务器的端口号 如何修改xampp的默认路径? 为什么修改xampp的默认端口号以后,点击admin不能访问网页是什么原因 本地Wordpress,使用Xampp配置,默认端口未80,OK,修改Xampp的Apache服务的默认端口未8081,访问失败 mac xampp怎么修改端口号 xampp中phpadmin的默认端口80怎么改了还不能使用 XAMPP导入.SQL之后,如何修改默认端口? 怎样修改XAMPP的Apache的80端口? 如何更改xampp的端口 现在企业里面,PHP做项目的话用的最多的框架是什么啊? 5.编写测试用例的代码时,经常会使用到函数, 那么Python中函数是什么? 有什么作用? 如何使用? 使用python内建函数,如何分析复杂度 列出Python模块中的所有函数问题,怎么解决 python 内置函数难题 学习这个的吗Python3实用编程技巧进阶我 python写代码的小技巧 Python中的7个实用小技巧! 英语26个字母怎么背 PHP 如何在Redis中实现事物(事物提交和事物 用phpredis操作redis集群支持publish和subscribe吗 php redis实现秒杀 怎么分开执行 php和redis如何实现消息队列 php连接redis是什么服务类型 php怎么实现redis阻塞队列 php redis 可以使用yeild吗 php语言和asp语言有什么区别? asp和.php网站的具体区别,各有何优点 Asp网站与Php网站的区别在哪里?怎么区别? php与asp的区别 php与asp语言的区别:用什么语言进行网页开发最好 php和asp有什么区别,感觉都是一样的,差不多 网站.php 与 .asp 有什么区别啊? 网页的类型asp,php他们有什么区别呀? 对于数据库,ASP和PHP有什么不同吗? 用php和asp开发的网站有什么区别? ASP型空间跟PHP型空间什么区别? asp和net还有PHP的区别是什么? 做网站用PHP还是ASP有什么区别?
  • 焦点

最新推荐

猜你喜欢

热门推荐