Фред проблема с потоком контекста

Я отправляю уведомление iOS и в ответ проверяю сервер Apple, не было ли какой-либо ошибки с помощью fread() но код застревает в каком-то цикле или просто загружается и загружается. Не могу понять причину.

$apnsHost = 'gateway.sandbox.push.apple.com';
$apnsCert = 'j_.pem';
$apnsPort = 2195;
$apnsPass = '';
$notification = "hey";

$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
stream_context_set_option($streamContext, 'ssl', 'passphrase', $apnsPass);
$apns = stream_socket_client('ssl://'.$apnsHost.':'.$apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext);$payload['aps'] = array('alert' => $notification, 'sound' => 'default','link'=>'https://google.com','content-available'=>"1");
$output = json_encode($payload);
$token = pack('H*', str_replace(' ', '', "device_token"));
$apnsMessage = chr(0).chr(0).chr(32).$token.chr(0).chr(strlen($output)).$output;
fwrite($apns, $apnsMessage);
$response = fread($apns,6);
fclose($apns);

Уведомление отправляется нормально, хотя.

0

Решение

Скорее всего, вы блокируете на$response = fread($apns,6); как объясняется в аналогичных вопросах, в случае успеха никакие байты не возвращаются для чтения, поэтому он будет стоять там вечно, ожидая 6 байтов для чтения.

Лучше делать, как ApnsPHP делал в прошлом, и использовать select_stream() определить, есть ли что почитать, до пытаясь это прочитать. Попробуйте заменить $response = fread($apns,6); с:

$read = array($apns);
$null = NULL;
//wait a quarter second to see if $apns has something to read
$nChangedStreams = @stream_select($read, $null, $null, 0, 250000);
if ($nChangedStreams === false) {
//ERROR: Unable to wait for a stream availability.
} else if ($nChangedStreams > 0) {
//there is something to read, time to call fread
$response = fread($apns,6);
$response = unpack('Ccommand/Cstatus_code/Nidentifier', $response);
//do something with $response like:
if ($response['status_code'] == '8') { //8-Invalid token
//delete token
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector