• 技术文章 >php教程 >php手册

    php从苹果apns的feedback服务器获取推送失败的token

    2016-06-06 20:13:36原创2381

    注意事项: 1.建议和feedback服务器建立长连接,连接过于频繁有可能被当做攻击(简简单单的做一些测试时没有关系的); 2.获取的token是在上次你给你的应用发推送失败时加feedback服务的,里面会返回失败的具体时间 3.返回的数据由三部分组成,请看下面的图 结

    注意事项:

    1.建议和feedback服务器建立长连接,连接过于频繁有可能被当做攻击(简简单单的做一些测试时没有关系的);

    2.获取的token是在上次你给你的应用发推送失败时加feedback服务的,里面会返回失败的具体时间

    3.返回的数据由三部分组成,请看下面的图

    1357647920_4440结构中包含三个部分,第一部分是一个上次发推送失败的时间戳,第二个部分是device_token的长度,第三部分就是失效的device_token

    下面是我的代码:

    
    
    connect($param['host'],$param['port'])){
          print "connect redis OK";
       }else{
          print "failed to connect redis server";
          return false;
       }
       return $redis;
    }
    /**
     * @desc 执行推送操作的主要代码
     */
    function feedback(){
       $count1 = 0;
       $run_times = 0;
       $redis_server = "tcp://localhost:6379";
       $iostokenremoved= 'iostokenremoved';
       $iostokenremoved_num = 'iostokenremoved_num';
       $fp = connect_feedback();
       $redis = connect_redis($redis_server);
       //苹果建议provider和feedback服务维持一个长连接,如果频繁的建立连接可能会被当做攻击处理
       $devcon ='';
       while($run_times<2000){
          $run_times++;
          //socket连接检测
          if($devcon ===FALSE){
             print date('Ymd His').'|feedback server disconnected';
             @fclose($fp);
             unset($fp);
             $fp = connect_feedback();
          }
          //redis连接检测
          if(!is_resource($redis) OR !$redis->ping()==='+PONG'){
             print date('Ymd His').'|redis server disconnected';
             @$redis->close();
             unset($redis);
             $redis = connect_redis($redis_server);
          }
          //每次读取38个字段,这是保存的一个完整token 信息的长度
          while ($devcon = fread($fp, 38)){
             $count1 ++ ;
             $arr = unpack("H*", $devcon);//解包传过来的二进制数据
             $rawhex = trim(implode("", $arr));
             $feedbackTime = hexdec(substr($rawhex, 0, 8));
             $feedbackDate = date('Y-m-d H:i:s', $feedbackTime);
             $feedbackDeviceToken = substr($rawhex, 12, 64);
             //记录被删除的token
             $redis->hSet($iostokenremoved,$feedbackDeviceToken,$feedbackDate);
             //记录每天的卸载数量
             $redis->hIncrBy($iostokenremoved_num,date('Y-m-d',$feedbackTime),1);
          }
          echo 'FeedBack:'. $count1 . PHP_EOL;
          usleep(10000000);//sleep 10秒
       }
       $redis->close();
       fclose($fp);
    }
    //可以通过命令行来执行这个脚本 php -f feedback.php feedback
    if(isset($argc[1]) && function_exists($argv[1])){
       $argv[1]();
    }else{
       die('invalid input');
    }
    
        
        
        
    

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:lua_cjson 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 用PHP实现小型站点广告管理(修正版)• php实现refresh刷新页面批量导入数据的方法• PHP两种快速排序算法实例,php排序算法• PHP实现采集程序原理和简单示例代码• 第十三节--对象串行化
    1/1

    PHP中文网