Intereting Posts
php шифровать и расшифровывать CakePHP 1.3 – Неизвестная колонка в разделе where Создание потоковой частной системы обмена сообщениями, такой как facebook и gmail Нужно ли мне избегать моих переменных, если я использую подготовленные операторы MySQLi? Как перенаправить пользователей на основе случайной строки URL? Как получить последний вставленный id из таблицы MySQL Учет IP для базы данных SQL Как проверить, существует ли время между двумя раз в PHP PHP: индексирование строк Преобразование строки в целое возвращает 2147483647 предотвратить кнопку возврата после выхода из системы Использование проверки подлинности Windows с помощью php? cakephp: Cookie не читает на виду Doctrine2 с идентификатором varchar не вставляет идентификатор в базу данных открыть электронную почту php, используя imap, давая мне эту ошибку Сообщение: imap_open () : Не удалось открыть поток {imap.gmail.com:993/imap/ssl}INBOX

Правильный способ отправки уведомлений IOS Bulk push в PHP

Я пытаюсь отправить 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: установленное соединение было прервано программным обеспечением вашего хост-компьютера.

Мои вопросы:

  1. Правильно ли отправить массовое уведомление?
  2. Я открываю соединение один раз и записываю данные (уведомление) на 100 устройств, а затем закрываю соединение, или лучше открыть соединение для каждого токена устройства, а затем закрыть?
  3. Что вызывает ошибку выше?

Выводы Отправлено приблизительно 90,000 push-уведомлений (100 в разомкнутом соединении разомкнуты и следующие 100 после 1-секундной задержки) Приблизительно 60,000 не удалось (сбой fwrite ) с превышенной ошибкой и приблизительно 30,000 нажатий были успешно отправлены (fwrite вернул положительные целые числа, указывающие количество записанных байтов).