Intereting Posts

проблема с содержимым потока

Я отправляю уведомление 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); 

Однако уведомление отправляется штрафом.

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

Лучше сделать, как это делал в прошлом select_stream() , и использовать 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 } }