Apple Push Notification - PHP - Operacja SSL nie powiodła się z kodem 1

Przez ostatnie kilka dni doświadczamy dziwnego zachowania w PHP podczas używania gniazd do łączenia się z serwerami APN na naszym serwerze produkcyjnym.

Przez większość czasu ładunek jest przesyłany bez błędów i klient otrzymuje powiadomienie. Jednak w niektórych przypadkach zaczynamy otrzymywać błąd PHP (nawet jeśli otrzymujemy błąd, czasami powiadomienie jest wysyłane). Kiedy zaczynamy dostrzegać ten błąd, trwa on przez wiele godzin, a następnie znika, a PHP nadal działa, jakby nic się nie stało.

Inną dziwną rzeczą jest to, że uruchomienie tego samego kodu PHP z powłoki nie powoduje żadnych błędów. Uruchamianie go z web (nginx / php-fpm) robi ... PHP działające na powłoce i sieci mają tę samą konfigurację i współdzielą ten sam php.ini. Jedyną różnicą jest to, że sieć działa na php-fpm.

Również ten sam kod + certyfikat działa na naszym serwerze pomostowym bez żadnych błędów. Serwer produkcyjny jest kopią serwera pomostowego, więc każda konfiguracja jest taka sama.

Udało nam się znaleźć kilka odpowiedzi na pytanie, co może powodować ten błąd, w tym odpowiedzi z stackoverflow.com, ale nie byliśmy w stanie znaleźć rozwiązania lub go rozwiązać.

Powiadomienia do serwerów Apple są wysyłane pojedynczo, a nie jako pakiet. Ale nie tworzymy zbyt wielu połączeń (może tysiąc dziennie). Nie ma systemu kolejek.

Krótko mówiąc

Czasami otrzymujemy błąd PHP podczas wysyłania naszych powiadomień, ale nie zawsze.Wysyłanie powiadomień z powłoki za pomocą tego samego PHP nie powoduje żadnych błędówWysyłanie powiadomień z serwera pomostowego nie powoduje żadnych błędów

Próbowaliśmy tych

Odtwarzanie certyfikatu i kluczaOdtwarzanie pliku PEMZmiana ssl: // na sslv3: //Używanie stream_socket_clientKorzystanie z fsockopenZmiana / usunięcie hasła certyfikatu

Błąd jest:

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/"

Kod łączący i wysyłający ładunek z php jest w rzeczywistości częścią klasy, ta część jest tym, co czyni połączenie i wysyła ładunek:

  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 to 283-ta linia pojawiająca się w komunikacie o błędzieNie używamy piaskownicy (sslv3: //gateway.push.apple.com: 2195)Wersja PHP to 5.3.15

Czy jest to błąd PHP lub OpenSSL, którego nie znamy? Jakieś pomysły co i gdzie sprawdzić? Czy Apple ma witrynę, w której możemy sprawdzić aktualny stan zdrowia sieci APN?

Każda pomoc jest bardzo mile widziana ... Dzięki

questionAnswers(1)

yourAnswerToTheQuestion