У меня есть те же вопросы в stackoverflow и пробовал все ответы, но никакой помощи. Я не понимаю, что такое ошибка.
Вот моя функция, которую я использую:
function sendRegistryNotification($message, $deviceToken, $deviceType, $batchcount) { $message=$message; $batchcount=$batchcount; $path=ABSPATH.'api'.DIRECTORY_SEPARATOR.'includes'.DIRECTORY_SEPARATOR.'Certificates2.pem'; $deviceType = strtolower($deviceType); switch ($deviceType) { case 'ios': $pemPath = $path; // replace with the path to PEM file $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', $pemPath); $fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); // Create the payload body $body['aps'] = array( 'badge' => +$batchcount, 'alert' => $message, 'sound' => 'default' ); $payload = json_encode($body); // Build the binary notification $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); var_dump($result); if (!$result) { fclose($fp); return false; } else { fclose($fp); return true; } break; case 'android': $message = array("message" => $message,'title'=> 'eyLog','msgcnt'=>$batchcount); // Set POST variables $url = 'https://android.googleapis.com/gcm/send'; $fields = array( 'registration_ids' => array($deviceToken), 'data' => $message, ); $headers = array( 'Authorization: key='.'AIzaSyDud68-R31c9SPq4dXZblt0JBPi4TBaneQ', // Key For eylog App 'Content-Type: application/json' ); // Open connection $ch = curl_init(); // Set the url, number of POST vars, POST data curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Disabling SSL Certificate support temporarly curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); // Execute post $result = curl_exec($ch); //var_dump($result); if ($result === FALSE) { // die('Curl failed: ' . curl_error($ch)); } // Close connection curl_close($ch); return TRUE; break; } return true; }
Вот ошибка, которую я получаю:
{ "status": "failure", "uniquediary_id": "14407503971", "message": "fwrite(): SSL operation failed with code 1. OpenSSL Error messages:\nerror:1409F07F:SSL routines:SSL3_WRITE_PENDING:bad write retry" }
Я не понимаю, почему это происходит. и код только дает ошибку на сервере в моем локальном хосте, он работает нормально
Когда вы пытаетесь записать в сокет. Если что-то пойдет не так, fwrite вернет false или 0 (в зависимости от версии php) в качестве возвращаемого значения. Когда это произойдет, вы должны управлять им.
Для вышеуказанного вопроса причина довольно проста: когда SSL_Write возвращается с SSL_ERROR_WANT_WRITE или SSL_ERROR_WANT_READ, вам нужно повторить вызов SSL_write с теми же параметрами снова, после выполнения условия (чтение / запись доступно в сокете).
Вызов с различными параметрами приведет к ошибке ошибки повторной записи 1409F07F.
Я получаю эту ошибку много раз. Чтобы разрешить это, перед fwrite () я добавил сон (5).
Теперь все запросы возвращаются с успехом.
Спасибо за ответ, я нашел похожие решения в Google, что вы должны снова написать в сокет. В коде кода m было выбрано исключение, поэтому я управляю этим. Итак, теперь я делаю это так
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; // Send it to the server try { $result = fwrite($fp, $msg, strlen($msg)); } catch (Exception $ex) { // try once again for socket busy error (fwrite(): SSL operation failed with code 1. // OpenSSL Error messages:\nerror:1409F07F:SSL routines:SSL3_WRITE_PENDING) sleep(5); //sleep for 5 seconds $result = fwrite($fp, $msg, strlen($msg)); if ($result) { return true; } else { return false; } }
Теперь он не бросает эту ошибку в большинстве случаев. Что я обнаружил, что это происходит, когда сокет занят, поэтому я пытаюсь писать снова через 5 секунд. Поэтому я думаю, это не должно повториться. Это еще не живое, но в нашем тестировании мы еще не нашли эту проблему. Можете ли вы предположить, что я иду в правильном направлении? Когда этот код будет жить, тогда будет огромное количество push-уведомлений, тогда в этом случае он будет работать нормально или есть ли какое-либо другое решение в вашем уме? Спасибо за помощь 🙂