2010-03-17 3 views
3

У меня есть PHP-файл со следующим контентом, который отлично работает над развитием ceritficates, но когда я переключусь на производственный сертификат на ошибки PHP и даю нижеприведенное сообщение, но он делает это примерно на 50% времени. Другие 50% это работает. Кто-нибудь знает, почему это может произойти?Уведомление об отказе iPhone SDK Push случайно не работает

<?php 
// masked for security reason 
$deviceToken = 'xxxxxx'; // jq 

$ctx = stream_context_create(); 
stream_context_set_option($ctx, 'ssl', 'local_cert', dirname(__FILE__)."/prod.pem"); 

$number = 5; 

$fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx); 
if (!$fp) { 
    print "Failed to connect $err $errstr\n"; 
} 
else { 
    print "Connection OK\n"; 
    $msg = $_GET['msg']; 
    $payload['aps'] = array('alert' => $msg, 'badge' => 1, 'sound' => 'default'); 
    $payload = json_encode($payload); 

    $msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload; 
    print "sending message :" . $payload . "\n"; 
    fwrite($fp, $msg); 
    fclose($fp); 
} 
?> 

РНР ошибка:

Предупреждение: stream_socket_client() [function.stream-сокет-клиент]: Не удается установить локальный сертификат файл цепи `/var/www/vhosts/thissite.com/httpdocs /prod.pem '; Убедитесь, что ваши настройки cafile/capath содержат сведения о вашем сертификате и его эмитенте в /var/www/vhosts/thissite.com/httpdocs/pushMessageLive.php в строке 19

Предупреждение: stream_socket_client() [function.stream-socket -client]: не удалось создать дескриптор SSL в /var/www/vhosts/thissite.com/httpdocs/pushMessageLive.php в строке 19

Предупреждение: stream_socket_client() [function.stream-socket-client]: Failed для включения криптографии в /var/www/vhosts/thissite.com/httpdocs/pushMessageLive.php в строке 19

Предупреждение: stream_socket_client() [function.stream-socket-client]: невозможно подключиться к ssl: // gateway.sandbox.push.apple.com:2195 (Неизвестная ошибка) в /var/www/vhosts/thissite.com/httpdocs/pushMessageLive.php в строке 19 Не удалось подключиться 0

+0

Этот сценарий работает несколько раз подряд? – jtrim

+0

Возможно, флаг STREAM_CLIENT_PERSISTENT поможет ... – Lukas

ответ

-1

Вам следует рассмотреть возможность использования Urban Airship для чего-то подобного. У нас хороший приятный API http://urbanairship.com/docs/push_index.html и множество дополнительных функций, а инди-план бесплатный.

(я там работаю)

+1

Я бы это сделал вторым (и нет, я не работаю там), поскольку я использую Urban Airship для push-уведомлений в своем приложении для iPhone, и он отлично работает. ** супер ** простой API и с 250 000 бесплатных нажатий в месяц, вы не ошибетесь – Alistair

1

Похоже, слишком много коннекторов. В документах Apple указано, что вам необходимо открыть соединение и отправить столько, сколько сможете в одно и то же время. Повторное открытие считается атакой DOS. Поэтому попробуйте сделать это постоянным и посмотреть, не получится ли у вас такая же ошибка.

0

Я не знаю, является ли ошибка, с которой вы столкнулись, из-за слишком большого числа подключений к серверам push ... По моему опыту, эти ограничения немного труднодоступны.

Но, с другой стороны, с другой стороны, PHP действует странно, когда я пытался отправить партии push-уведомлений. Я не уверен в вашем примере кода, но я думаю, вы делаете stream_socket_client() и fclose() за каждое сообщение? Используя этот метод с SSL-сокетами в PHP, единственное, что я лично выполнил, - это сбой ...

Я не уверен, что у вас есть возможность запускать Ruby на вашем сервере, но если вы можете, я рекомендуем перейти на ruby-apns-daemon, чтобы поговорить с серверами Apple. Он легкий и простой в реализации на PHP (вы практически составляете одну и ту же полезную нагрузку - JSON, но отправляете ее на ruby-apns-daemon, а не через сокет).

3

У меня была та же проблема. Вы должны установить постоянное соединение сокета с Apple Push Notification Server. Я написал на учебник для питона демона под названием pyapns (http://github.com/samuraisam/pyapns), которые работали очень хорошо для меня:

http://www.how2s.org/index.php/How_to_get_started_with_Apple_Push_Notifications_for_iPhone_or_iPhone_Touch

Это работает если вы работаете в Debian и имеют доступ к корневой, чтобы установить необходимые пакеты таких как python-twisted, libcurl4-openssl-dev и т. д.

0

У меня была та же проблема, и сертификат был виноват. Вы можете увидеть решения здесь How can I do an SSL connection with PHP и здесь Error using ssl cert with PHP.

Надеюсь, это вам поможет.

И для записи вы не обязаны устанавливать постоянное соединение с APNS. Хотя лучше всего отправлять все ваши сообщения сразу, вы можете подключиться и отключиться несколько раз. Цитирую сайт компании Apple:

You should also retain connections with APNs across multiple notifications. APNs may consider connections that are rapidly and repeatedly established and torn down as a denial-of-service attack. Upon error, APNs closes the connection on which the error occurred.

Если вы не создавать сотни соединений в то время, вы не должны получить неприятности.

Смежные вопросы