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'] = "보낼수 있는 대상이 없습니다.";
}
}
}
?>