본문으로 바로가기

php curl을 이용한 전체회원 fcm 푸시 보내기

 

1000개씩 보내면서 1초씩 쉽니다.

 

응용하시면 개별회원에게 메시지를 발송하실수 있겠지요?

 

회원테이블에 fcm_token 값은 미리 로그인시에 저장해 놓아야 됩니다.

 

 

<?php
//push 발송 히스토리 테이블
$table = $tb['push']; 
//결과값 json 으로 리턴

$ref = array('ok'=>"false", 'msg'=>"잘못된 방법입니다.", 'data'=>array());

//전체푸시모드
if($SqlType=='push_all'){
    
    $fcm_token = '어플서버토큰';//이 부분 수정필수 !!!
    
    if(!$fcm_token){
        $ref['msg'] = "어플리케이션 토큰이 등록되어있지 않습니다.";
    }else{
        
        //DB에 전체 메시지 보냈음을 기록
        $sql = "insert {$table} set admin_id='{$member['mb_id']}'
        ,msg='{$msg}'
        ,tit='{$tit}'
        ,ins_dt=now() ";    
        sql_query($sql);
        
        //아래에서 성공실패 갯수를 업데이트하기 위해서 pk값을 저장
        $pidx = sql_insert_id();
        
        $suc_cnt = 0;//성공횟수
        $fail_cnt = 0;//실패횟수
        
        //FCM 수신하는 회원 목록 가져옴
        $data = user_fetch(" and fcm_yn='Y' and ifnull(fcm_token,'')<>'' and u_type='user' ", ' ins_dt desc ');    
        $total = count($data);//총합    
        
        //print_r2($total);    
        $total_page = ceil($total/1000);//총 페이지    
        
        //서버키 변경하시면 안되요
        $API_ACCESS_KEY =$fcm_token;
/*
        $msg = array(
                'body'  => $msg,
                'title'     => $tit
        );
        
        */
        
        //=========================손대지 마시오===============================================//
        $headers = array(
                'Authorization: key=' . $API_ACCESS_KEY,
                'Content-Type: application/json'
        );
        
        $i = 0;
        for($p=1; $p<=$total_page; $p++){
            $registrationIds = array();
            
            if($total-(1000 * $p) >= 1000){//다음페이지가 있는지(남은게 천개보다 큰지) 확인.            
                $max = 1000;
            }else{
                $max = $total;
            }
            

//받을사람 토큰값을 배열로 저장

            for($j=0; $j<$max; $j++){
                $registrationIds[] = $data[$i]['fcm_token'];            
                $i++;
            }
            
            //이게 진짜 내용입니다.
            $fields = array(
                    'registration_ids'  => $registrationIds,
                    //'notification'      => $msg,
                    'data'              => array('send_type'=>'admin_notice', 'body'=>$msg, 'title'=>$tit )
            );        
    
            $ch = curl_init();
            curl_setopt( $ch,CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send' );
            curl_setopt( $ch,CURLOPT_POST, true );
            curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
            curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
            curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
            curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
            $result = curl_exec($ch );
            curl_close( $ch );
            //echo $result;
            
            $res = json_decode($result);        
            //var_dump($res);
            
            $suc_cnt+=(int)$res->success;
            $fail_cnt+=(int)$res->failure;        
            
            sleep(1);//천개 보내고 휴식
            
        }
        
        if($total_page){
            
            $sql = "update {$table} set suc_cnt='{$suc_cnt}', fail_cnt='{$fail_cnt}' where idx='{$pidx}' ";
            sql_query($sql);
            
            $ref['ok'] = 'true';
            $ref['msg'] = "성공했습니다.";
            $ref['data'] = array('suc'=>$suc_cnt, 'fail'=>$fail_cnt, 'tot'=>$i);
        }else{
            $ref['msg'] = "보낼수 있는 대상이 없습니다.";
        }
        
    }

}

?>