Извлекать ошибки из APNS с PHP - PullRequest
2 голосов
/ 21 февраля 2011

Я использую самописный скрипт для отправки push-уведомлений в APNS с PHP.Чтобы иметь возможность обрабатывать ошибки, я использую расширенный формат для push-уведомлений и хотел бы получить результаты из потока:

   // $apns = a stream_socket_client connection
   $apnsMessage  = pack('CNNnH*', 1, $i, $pnDetails['expiration_time'], 32, $pnDetails['token']);
   $apnsMessage .= pack('n', strlen($pnDetails['payload']));
   $apnsMessage .= $pnDetails['payload'];
   fwrite($apns, $apnsMessage);

   // Check for errors
   $errorResponse = @fread($apns, 6)
   if ($errorResponse != FALSE) {
    $unpackedError = unpack('Ccommand/CstatusCode/Nidentifier', $errorResponse);
   }

Я видел очень похожую практику в проекте apns-php,тем не менее, в моем случае сценарий всегда ждет неопределенно долго, потому что пытается прочитать данные, которых там нет (Apple отправляет ответ только в случае ошибки).Я искал способы сказать, есть ли какие-либо новые данные для чтения из потока TCP, однако я не смог найти ни одного, и методы обратного вызова потока, доступные для вызовов HTTP, также недоступны для «сырых» соединений TCP.

Как я могу преобразовать мой сценарий, чтобы он вызывал fread только тогда, когда на самом деле есть данные для чтения?Как проект apns-php решает эту проблему (из того, что я могу сказать, они также просто вызывали fread)?

Ответы [ 2 ]

1 голос
/ 22 февраля 2011

Разобрался, последний намек пришел от Эрвина.Хитрость заключалась в том, чтобы отключить блокировку с помощью stream_set_blocking, теперь мне просто нужно подождать некоторое время, прежде чем извлекать результаты с помощью fread, чтобы убедиться, что у Apple достаточно времени для ответа.

0 голосов
/ 22 февраля 2011

Вы подключаетесь к нужному хосту ssl://feedback.push.apple.com:2196?

Они используют следующие вызовы для подключения и чтения данных:

stream_context_create -> stream_socket_client -> stream_set_blocking (0) -> stream_set_write_buffer (0) -> while (!feof($socket)) {} -> fread (8192) -> stream_select (с таймаутом)

...