Я пытаюсь отправить push-уведомление на IOS, используя PHP, есть 300 000 токенов устройства
Я написал небольшую процедуру, при каждом выполнении подпрограмма отправляет уведомление на 100 устройств, и после того, как 1-секундная процедура задержки выполняется снова и уведомление отправляется на следующие 100 устройств, процедура выглядит следующим образом
$body['aps'] = array('alert' => 'Energy is full', 'sound' => 'default', 'badge' => '0' ); $url = 'ssl://gateway.push.apple.com:2195'; $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', 'ProductionCertificate.pem'); stream_context_set_option($ctx, 'ssl', 'passphrase', 'my pass phrase'); stream_context_set_option($ctx, 'ssl', 'cafile', 'trusted_ca.cer'); $fp = stream_socket_client($url, $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); if (!$fp) { return -1;} foreach($OneHundredTokens as $deviceToken) { $payload = json_encode($body, 256); $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; $result = fwrite($fp, $msg, strlen($msg)); } fclose($fp);
Некоторое время эта процедура работает отлично, и я видел отправленные уведомления на устройствах.
Однако несколько раз он дает следующую ошибку
Предупреждение: fwrite (): SSL: установленное соединение было прервано программным обеспечением вашего хост-компьютера.
Мои вопросы:
Выводы Отправлено приблизительно 90,000
push-уведомлений (100 в разомкнутом соединении разомкнуты и следующие 100 после 1-секундной задержки) Приблизительно 60,000
не удалось (сбой fwrite
) с превышенной ошибкой и приблизительно 30,000
нажатий были успешно отправлены (fwrite вернул положительные целые числа, указывающие количество записанных байтов).