Apple Push Notification - PHP - Сбой операции SSL с кодом 1

В последние несколько дней мы испытываем странное поведение с PHP при использовании сокетов для подключения к серверам APN на нашем производственном сервере.

В большинстве случаев полезная нагрузка передается без ошибок, и клиент получает уведомление. Однако в некоторых случаях мы начинаем получать ошибку PHP (даже если мы получаем ошибку, иногда уведомление отправляется). Когда мы начинаем видеть эту ошибку, она продолжается в течение нескольких часов, затем исчезает, и PHP продолжает работать, как будто ничего не произошло.

Другая странная вещь заключается в том, что при запуске того же PHP-кода из оболочки не возникает никаких ошибок. Запуск его из Интернета (nginx / php-fpm) делает ... PHP, работающий в оболочке и в Интернете, имеет одинаковую конфигурацию и использует один и тот же php.ini. Разница лишь в том, что web работает на php-fpm.

Кроме того, тот же код + сертификат работает на нашем промежуточном сервере без каких-либо ошибок. Рабочий сервер является копией промежуточного сервера, поэтому каждая конфигурация одинакова.

Нам удалось найти несколько ответов на то, что может быть причиной этой ошибки, включая ответы на stackoverflow.com, но мы не смогли найти решение или решить его.

Уведомления на серверы Apple отправляются по одному, а не в виде пакета. Но мы не делаем слишком много связей (может быть, тысяча в день). Там нет системы очередей.

Итак, короче

We are sometimes receiving a PHP error while sending our notifications, but not always. Sending notifications from shell via same PHP does not produce any errors Sending notifications from staging server does not produce any errors

Мы пробовали это

Recreating the certificate and key Recreating the PEM file Changing ssl:// to sslv3:// Using stream_socket_client Using fsockopen Changing/removing certificate password

Ошибка:

2012/08/28 12:18:09 [error] 4282#0: *225858 FastCGI sent in stderr: 
"PHP message: PHP Warning:  fwrite() [<a href='function.fwrite'>function.fwrite</a>]:
SSL operation failed with code 1. OpenSSL Error messages:
error:1409F07F:SSL routines:func(159):reason(127) in 
/usr/local/nginx/html/play/classes/PushNotification.php on line 283"
while reading response header from upstream, client: 94.---.---.---,
server: play.--------.com, request: "POST /game_request_random.php HTTP/1.1",
upstream: "fastcgi://unix:/var/run/phpfpm.sock:",
host: "play.--------.com", referrer: "http://--------.com/"

Код, соединяющий и отправляющий полезную нагрузку из php, на самом деле является частью класса, эта часть создает соединение и отправляет полезную нагрузку:

  private function ConnectAndSend ( $msg = false ) {
    $ctx = stream_context_create();
    stream_context_set_option( $ctx, 'ssl', 'local_cert', $this->certificate );
    stream_context_set_option( $ctx, 'ssl', 'passphrase', $this->certificatepass );

    // Open a connection to the APNS server
    $fp = stream_socket_client( APN_SERVER, $err, $errstr, 60, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT, $ctx );
    if ( !$fp ) {
      errorlog( "Push notification error : $err $errstr" );
      $this->error = "$err $errstr";
      return;
    }

    // Build the notification
    if ( !$msg ) {
      $msg = chr( 0 ) . pack( 'n', 32 ) . pack( 'H*', $this->devicetoken ) . pack( 'n', strlen( $this->payload ) ) . $this->payload;
    }

    // Send it to the server
    if ( !($result = fwrite( $fp, $msg, strlen( $msg ) )) ) {
      // Could not send
      $this->error = 'Notification could not be send';
      errorlog( "Push notification error : {$this->error}" );
    } else {
      // Notification sent
      $this->error = false;
      errorlog( "Push notification sent" );
    }

    fclose($fp);

    // Reset the content
    $this->devicetoken = false;
    $this->message = false;
    $this->command = false;
    $this->badge = 0;
    $this->payload = false;
    $this->sound = false;
  }
stream_socket_connection is the 283rd line appearing in the error message We are not using the sandbox (sslv3://gateway.push.apple.com:2195) PHP version is 5.3.15

Это ошибка PHP или OpenSSL, о которой мы не знаем? Есть идеи что и где проверить? Есть ли у Apple сайт, на котором мы можем проверить текущее состояние сети APN?

Любая помощь очень ценится ... Спасибо

Ответы на вопрос(1)

Ваш ответ на вопрос