Apple Push Notification - PHP - SSL-Vorgang mit Code 1 fehlgeschlagen

In den letzten Tagen haben wir ein merkwürdiges Verhalten mit PHP, wenn wir Sockets verwenden, um eine Verbindung zu APN-Servern auf unserem Produktionsserver herzustellen.

In den meisten Fällen wird die Nutzlast fehlerfrei übertragen und der Client erhält die Benachrichtigung. In einigen Fällen erhalten wir jedoch einen PHP-Fehler (obwohl wir einen Fehler erhalten, wird die Benachrichtigung manchmal weitergeleitet). Wenn wir diesen Fehler bemerken, bleibt er stundenlang bestehen, verschwindet dann und PHP funktioniert weiter, als wäre nichts passiert.

Eine andere seltsame Sache ist, dass das Ausführen des gleichen PHP-Codes von der Shell aus keinerlei Fehler verursacht. Wenn Sie es aus dem Web ausführen (nginx / php-fpm), hat PHP, das auf der Shell und im Web ausgeführt wird, die gleiche Konfiguration und die gleiche php.ini. Der einzige Unterschied ist, dass das Web auf PHP-FPM läuft.

Derselbe Code + das gleiche Zertifikat wird auch ohne Fehler auf unserem Staging-Server ausgeführt. Der Produktionsserver ist eine Kopie des Staging-Servers, sodass jede Konfiguration identisch ist.

Wir konnten einige Antworten auf die Ursachen dieses Fehlers finden, einschließlich der Antworten von stackoverflow.com, konnten jedoch keine Lösung finden oder lösen.

Benachrichtigungen an Apple-Server werden einzeln und nicht als Bundle gesendet. Aber wir stellen nicht zu viele Verbindungen her (vielleicht tausend am Tag). Es gibt kein Warteschlangensystem.

Also, kurz gesagt

Wir erhalten manchmal einen PHP-Fehler beim Senden unserer Benachrichtigungen, aber nicht immer.Das Senden von Benachrichtigungen von der Shell über dasselbe PHP führt zu keinen FehlernDas Senden von Benachrichtigungen vom Staging-Server führt zu keinen Fehlern

Wir haben es versucht

Zertifikat und Schlüssel neu erstellenNeuerstellung der PEM-DateiÄndern von ssl: // in sslv3: //Verwenden von stream_socket_clientFsockopen verwendenÄndern / Entfernen des Zertifikatkennworts

Der Fehler ist:

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

Der Code, der die Nutzdaten von PHP aus verbindet und sendet, ist Teil einer Klasse. Dieser Teil stellt die Verbindung her und sendet die Nutzdaten:

  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 ist die 283. Zeile in der FehlermeldungWir verwenden die Sandbox nicht (sslv3: //gateway.push.apple.com: 2195)PHP-Version ist 5.3.15

Ist dies ein PHP- oder OpenSSL-Fehler, von dem wir nichts wissen? Irgendwelche Ideen, was und wo zu überprüfen? Hat Apple eine Website, auf der wir den aktuellen Zustand des APN-Netzwerks überprüfen können?

Jede Hilfe wird sehr geschätzt ... Danke

Antworten auf die Frage(1)

Ihre Antwort auf die Frage