在过去的几天里,我们正在使用插座时,连接到服务器的APN我们的生产服务器上遇到PHP一些奇怪的行为。
对于大部分的时间,有效载荷被推动而没有任何错误,并在客户端接收该通知。 但是在某些情况下,我们开始接收一个PHP错误(即使我们收到一个错误,有时会通知推)。 当我们开始看到这个错误,它继续了几个小时便消失了,PHP继续工作就像什么都没有发生。
另一个奇怪的是,从shell中运行相同的PHP代码产生任何没有错误。 从网页(nginx的/ PHP-FPM)不运行它...上壳和网络运行PHP具有相同的配置和共享相同的php.ini。 唯一不同的是网络上的php-fpm的运行。
此外,我们没有任何错误临时服务器相同的代码+证书运行。 生产服务器是临时服务器的副本,所以每一个配置是一样的。
我们能够找到一些答案,什么可能导致这个错误,包括来自stackoverflow.com答案,但我们没能找到一个解决方案或解决它。
通知苹果服务器由一个发送一个,而不是作为一个包。 但我们不会做太多的连接(每天大约有1,000)。 没有排队系统。
因此,简而言之
- 我们有时会收到一个PHP错误,而把我们的通知,但并非总是如此。
- 通过同样的PHP从外壳发送通知,不会产生任何错误
- 从临时服务器发送通知,不会产生任何错误
我们尝试了这些
- 重新创建证书和密钥
- 重新创建PEM文件
- 更改SSL://到SSLV3://
- 使用stream_socket_client
- 使用fsockopen
- 更改/删除证书密码
错误是:
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是出现在错误消息中的第283行
- 我们没有使用沙盒(SSLV3://gateway.push.apple.com:2195)
- PHP的版本是5.3.15
这是一个PHP或OpenSSL的错误,我们不知道的? 任何想法什么和在哪里检查? 苹果公司是否有一个网站,我们可以检查APN网络的当前健康?
任何帮助是极大的赞赏...谢谢