제목 | apns 를 다량 보내는데 속도가 너무 느리네요. | ||
---|---|---|---|
글쓴이 | 조주상 | 작성시각 | 2014/07/21 16:11:24 |
|
|||
몇만개 정도 되는 디바이스 들에게 동시다발적으로 푸쉬를 보내려고 합니다.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++; } |
|||
다음글 | rewrite 관련 질문입니다. (2) | ||
이전글 | 안녕하세요 서버컴을 받았는데 idc 저렴한곳 추천바랍니... (5) | ||
Artz
/
2014/07/22 20:24:26 /
추천
0
|
조주상
/
2014/07/23 13:05:32 /
추천
0
Artz 님 답변감사합니다.
답변주신대로 fwrite된 값을 fread 로 읽어왔는데 모두 false로 떨어지게 되는데 제가 한 방법과 다른 방법이 있나요? fread($apns,6) 로 확인 했습니다. |
Artz
/
2014/07/24 10:46:22 /
추천
0
APNS 서버에 정상적으로 푸시데이터가 전송된 경우에는 아무것도 리턴하지 않습니다.
그렇기 때문에 fwrite가 실패했을 경우에만 fread하여 어떤 원인으로 실패했는지 확인해야 합니다. 이 일련의 과정들이 모두 정상인데도 푸시 수신이 안된 경우에는, 여러가지 테스트를 진행하면서 원인을 확인할 수 밖에 없을 것 같네요. |
조주상
/
2014/07/24 10:51:48 /
추천
0
답변감사합니다.
fwrite 를 하고 나면 한번도 false를 반환하지 않고 진행이 됩니다. 혹시 제가 참고할만한 소스를 올려주실수 있으시면 부탁드리겠습니다. |
fwrite가 실패했을때, fread로 리턴된 패킷을 읽어와서 원인을 파악해봐야 할 것 같으며,
접속이 끊기기 때문에 fwrite 실패시엔 socket connection을 다시 생성하는 루틴을 추가해야 할 것 같습니다.