>  기사  >  백엔드 개발  >  php+redis를 공유하여 2백만 명의 사용자에게 즉각적인 푸시 서비스 구현

php+redis를 공유하여 2백만 명의 사용자에게 즉각적인 푸시 서비스 구현

藏色散人
藏色散人앞으로
2020-10-28 16:49:355053검색

추천: "PHP 비디오 튜토리얼"

2백만 명의 사용자에게 인스턴트 푸시를 구현하는 방법 이 푸시는 타사 인터페이스 호출, 푸시, SMS 등으로 이해될 수 있습니다.

당시에는 먼저 DB를 직접 읽고 결과를 개별적으로 푸시하는 데모를 작성했습니다. . . . 상상하시는대로

그래서 redis+php 멀티프로세스 기반으로 솔루션을 디자인했는데 꽤 괜찮지만 확장성이 높아서 공유합니다.

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

특정 논리는 다음과 같습니다. 다음과 같습니다: (내 글꼴 무시)

사실 이것은 최적화될 수 있습니다. 내 생각은 사용자 데이터가 더 많으면 데이터가 Redis에서 여러 목록으로 나눌 수 있고 각 목록은 여러 PHP 프로세스에 해당한다는 것입니다. 더 빨라질 것입니다.

다음은 제가 구현한 구체적인 코드입니다.

메인 관리 스크립트: 신청할 때 이것을 시작하세요.

<?php          //push推送配置  注:使用前请确认log文件为空       2016-04-12
include_once(dirname (__FILE__)."/../../config.inc.php");
//if(exec(&#39;ps aux | grep redis_push.php | grep -v grep | wc -l&#39;) != 0) goto check;
import(&#39;push.class.php&#39;);
import(&#39;Redis.class.php&#39;);

$time  =time();
$data  = array("apikey"=>&#39;xxxx&#39;,"secret"=>&#39;xxxx&#39;);
$push  = new Channel($data);
$redis = new RedisCache($Credis[&#39;host&#39;],$Credis[&#39;port&#39;]);
if(exec(&#39;ps aux | grep redis_push.php | grep -v grep | wc -l&#39;) != 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[&#39;OpenType&#39;]==1 ? "是" : "否";
$c = json_encode($config);
$info = <<<monkey
   ************ 请确认信息是否有误*10秒后启动push任务! *************
   * 文件名称   : {$config[&#39;file&#39;]};
   * 推送标题   : {$config[&#39;Title&#39;]};
   * 推送内容   : {$config[&#39;Content&#39;]};
   * 是否跳转   : {$config[&#39;OpenType&#39;]};
   * 进程数量   : $num;(如果为单进程无视此项)
   * 睡眠时间   : {$config[&#39;s&#39;]};
   * 日志目录   : /log;
   ***************************************************************\n
monkey;
echo $info;
sleep(3);
$n = 1;
while($n<=10){
  echo (10-$n++),"秒\n";
  sleep(1);
}
echo "------------------------- 任务已启动 -------------------------\n";
if($redis->Scount(&#39;push_getchannel_success&#39;)){
  echo "队列有未完成任务\n";
}else{
  $res = exec("php redis_getchannel.php {$config[&#39;file&#39;]}");//写入redis脚本
  echo $res;
}
smtp_mail(&#39;xxxx@qq.com&#39;,&#39;推送任务已开启&#39;,&#39;请实时监测,5秒后您的手机将接收到测试推送!&#39;);//推送监控 实现定时全自动推送 
echo "\n---------------- 5秒后 test 将收到测试推送消息 ----------------\n";
sleep(5);
$re = $push->BaiduPush(&#39;xxxx&#39;,&#39;xxxxx&#39;,$config[&#39;Content&#39;],$config[&#39;Title&#39;],&#39;1&#39;,$config[&#39;OpenType&#39;],$config[&#39;Url&#39;],&#39;xxxxx&#39;,$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  &#39;{$c}&#39; > /dev/null 2>&1 &");
}

check:
while(1){
  if(exec(&#39;ps aux | grep redis_push.php | grep -v grep | wc -l&#39;) == 0){
    echo "push 发送完成 用时",time()-$time,"秒";
    die();
  }
  echo "当前进程数:",exec(&#39;ps aux | grep redis_push.php | grep -v grep | wc -l&#39;),"个","\n";
  echo "当前剩余推送数量:".$redis->Scount(&#39;push_getchannel_success&#39;)."\n";
  sleep(10);
}

redis 및 특정 푸시 스크립트 작성은 여러분의 상상에만 의존하세요. 저는 게시하지 않겠습니다. 헤헤

제 접근 방식은 특정 푸시 스크립트가 일정 금액을 푸시한 후 자동으로 종료되고 자체 호출된다는 것입니다.

실제 애플리케이션에서는 PHP 스크립트를 오랫동안 실행하면 (컨텍스트 전환 문제로 인해) 멈추는 현상이 발견되었기 때문에

그래서 나는 PHP 스크립트를 오랫동안 실행시키는 것을 피합니다.

또한 사용자는 확실히 200만 명으로 고정되어 있지 않습니다. 매일 증가할 것입니다. 시간 제한 스크립트를 사용하여 증가하는 사용자를 직접 디자인한 사용자 테이블로 구성하고 직접 관리할 계획입니다.

ps: 통합 관리를 위해 구성한 작은 PHP 기본 프레임워크에 모든 스크립트를 넣었습니다. 잠시 후 보내드리겠습니다.

수정을 환영합니다. 감사합니다.

위 내용은 php+redis를 공유하여 2백만 명의 사용자에게 즉각적인 푸시 서비스 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제