apns 를 다량 보내는데 속도가 너무 느리네요.
몇만개 정도 되는 디바이스 들에게 동시다발적으로 푸쉬를 보내려고 합니다.
foreach ($deviceToken as $value) {
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
$apns = stream_socket_client('ssl://'.$apnsHost.':'.$apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext);
$payload = array('aps' => array('alert' => $message, 'badge' => 0, 'sound' => 'default'));
$payload = json_encode($payload);
if($apns)
{
$apnsMessage = chr(0).chr(0).chr(32).pack('H*', str_replace(' ', '', $value)).chr(0).chr(strlen($payload)).$payload;
fwrite($apns, $apnsMessage);
$success_count++;
echo "$value
";
} else {
$fail_count++;
}
$cnt++;
}
위와 같이 1개의 메세지를 보내고 fclose를 하고
새로 연결을 하고 하는걸 반복하면 제가 원하는 다량의 푸쉬메세지가 느리게 나마 전달은되는데
아래와 같이 100 번째 단위로 apns 를 재 연결 시도해서 전송을 하면
절반 이상의 푸쉬가 전송되지 않습니다.
result 값은 전송에 성공했다고 뜹니다.
foreach ($deviceToken as $value) {
if ($cnt0 == 0) {
if ($apns != null) {
fclose($apns);
$apns = null;
}
$payload = array('aps' => array('alert' => $message, 'badge' => 0, 'sound' => 'default'));
$payload = json_encode($payload);
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
$apns = stream_socket_client('ssl://'.$apnsHost.':'.$apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $streamContext);
}
if($apns)
{
$apnsMessage = chr(0).chr(0).chr(32).pack('H*', str_replace(' ', '', $value)).chr(0).chr(strlen($payload)).$payload;
fwrite($apns, $apnsMessage);
$success_count++;
} else {
$fail_count++;
}
$cnt++;
}
fwrite가 실패했을때, fread로 리턴된 패킷을 읽어와서 원인을 파악해봐야 할 것 같으며,
접속이 끊기기 때문에 fwrite 실패시엔 socket connection을 다시 생성하는 루틴을 추가해야 할 것 같습니다.