Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apple推送通知-PHP-SSL操作失败,代码为1_Php_Ios_Apple Push Notifications - Fatal编程技术网

Apple推送通知-PHP-SSL操作失败,代码为1

Apple推送通知-PHP-SSL操作失败,代码为1,php,ios,apple-push-notifications,Php,Ios,Apple Push Notifications,在过去的几天里,当使用套接字连接到生产服务器上的APN服务器时,我们在PHP中遇到了一些奇怪的行为 在大多数情况下,推送有效负载时不会出现任何错误,并且客户端会收到通知。然而,在某些情况下,我们开始接收PHP错误,即使我们正在接收错误,有时会推送通知。当我们开始看到这个错误时,它会持续几个小时,然后消失,PHP继续工作,就像什么都没有发生一样 另一件奇怪的事情是,从shell运行相同的PHP代码不会产生任何错误。从web nginx/php fpm运行它会。。。在shell和web上运行的PHP

在过去的几天里,当使用套接字连接到生产服务器上的APN服务器时,我们在PHP中遇到了一些奇怪的行为

在大多数情况下,推送有效负载时不会出现任何错误,并且客户端会收到通知。然而,在某些情况下,我们开始接收PHP错误,即使我们正在接收错误,有时会推送通知。当我们开始看到这个错误时,它会持续几个小时,然后消失,PHP继续工作,就像什么都没有发生一样

另一件奇怪的事情是,从shell运行相同的PHP代码不会产生任何错误。从web nginx/php fpm运行它会。。。在shell和web上运行的PHP具有相同的配置并共享相同的PHP.ini。唯一的区别是web是在php fpm上运行的

此外,相同的代码+证书在我们的暂存服务器上运行,没有任何错误。生产服务器是临时服务器的副本,因此每个配置都是相同的

我们能够找到一些可能导致此错误的答案,包括stackoverflow.com的答案,但我们无法找到解决方案或解决它

苹果服务器的通知是一个接一个地发送的,而不是捆绑发送。但我们一天可能不会有太多的联系。没有排队系统

简言之

在发送通知时,我们有时会收到一个PHP错误,但并非总是如此。 通过相同的PHP从shell发送通知不会产生任何错误 从临时服务器发送通知不会产生任何错误 我们试过这些

重新创建证书和密钥 重新创建PEM文件 将ssl://更改为sslv3:// 使用流\u套接字\u客户端 使用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/"
stream_socket_connection是出现在错误消息中的第283行 我们没有使用沙箱sslv3://gateway.push.apple.com:2195 PHP版本是5.3.15 这是我们不知道的PHP或OpenSSL错误吗?你知道去哪里查什么吗? 苹果是否有一个我们可以检查APN网络当前运行状况的网站

非常感谢您的帮助。。。
谢谢

请查看此代码以发送多条消息

$i = 0;
while($res = mysql_fetch_array( $result )) {
    $deviceTokens[$i] = $res['token'];
    $i++;
}

// APNs Push testen auf Token
//$deviceToken = $token; // Hier das Device-Token angeben, ist 64-stellig

// Payload erstellen und JSON codieren
$message = $_POST['message'];
$message = utf8_encode($message);


$payload['aps'] = array('alert' => 'Neuer Artikel in Aktuelles', 'badge' => +1, 'sound' => 'default');
if (trim($message) != '') {
    $payload['aps'] = array('alert' => "$message", 'badge' => 1, 'sound' => 'default');
}
$payload = json_encode($payload);

//Development: $apnsHost = 'gateway.sandbox.push.apple.com';
$apnsHost = 'gateway.push.apple.com';
$apnsPort = 2195;

//Development: $apnsCert = 'apsDevBundle.pem';
$apnsCert = 'apns-dev.pem';

// Stream erstellen
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);

$apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext);
if ($error==0)
{     
  for($i = 0; $i<count($deviceTokens); $i++) {

      // Build the binary notification
      $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceTokens[$i])) . chr(0) . chr(strlen($payload)) . $payload;

      fwrite($apns, $apnsMessage);
  }

  // Verbindung schliessen
  fclose($apns);
}
else
{
  var_dump($error);
  var_dump($errorString);
  die("Fehler aufgetreten.");
}

签出此代码可发送多条消息

$i = 0;
while($res = mysql_fetch_array( $result )) {
    $deviceTokens[$i] = $res['token'];
    $i++;
}

// APNs Push testen auf Token
//$deviceToken = $token; // Hier das Device-Token angeben, ist 64-stellig

// Payload erstellen und JSON codieren
$message = $_POST['message'];
$message = utf8_encode($message);


$payload['aps'] = array('alert' => 'Neuer Artikel in Aktuelles', 'badge' => +1, 'sound' => 'default');
if (trim($message) != '') {
    $payload['aps'] = array('alert' => "$message", 'badge' => 1, 'sound' => 'default');
}
$payload = json_encode($payload);

//Development: $apnsHost = 'gateway.sandbox.push.apple.com';
$apnsHost = 'gateway.push.apple.com';
$apnsPort = 2195;

//Development: $apnsCert = 'apsDevBundle.pem';
$apnsCert = 'apns-dev.pem';

// Stream erstellen
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);

$apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext);
if ($error==0)
{     
  for($i = 0; $i<count($deviceTokens); $i++) {

      // Build the binary notification
      $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceTokens[$i])) . chr(0) . chr(strlen($payload)) . $payload;

      fwrite($apns, $apnsMessage);
  }

  // Verbindung schliessen
  fclose($apns);
}
else
{
  var_dump($error);
  var_dump($errorString);
  die("Fehler aufgetreten.");
}

另外:我们增加了linux内核对套接字连接的限制,并发现php.ini套接字连接超时设置为600秒,而不是60秒作为默认值。在这些更改之后,我们还没有看到任何错误。您可以共享您的fsockopen实现吗?我尝试将此函数用于通知。请检查php.ini中的套接字限制,尤其是超时。保持在最低限度。我们的问题是php fpm在释放套接字时遇到问题。如果您使用linux作为服务器,请尝试更改有关tcp/ip堆栈套接字的内核限制。为了改变linux内核的限制,一些IBM网站发表了一些关于这个主题的好文章。然而,这是非常危险的,所以要小心。这也解决了我们在编辑php.ini之前的问题,在过去的8个月里,我们没有看到任何错误。@emrahgunduz您解决过这个问题吗?我今天和APN遇到了同样的事情。但到目前为止,它运行良好。谢谢。@tamak首先,请检查以确保在代码结束之前没有忘记关闭套接字。在后端,如果您使用的是linux,请增加打开文件限制检查内核限制。检查日志,确保没有从php fpm接收到FD_SETSIZE错误。如果在这种情况下,必须在增加内核FD_SETSIZE限制后重新编译php,请搜索-enable FD SETSIZE。如果您使用的是windows,很抱歉,但我不知道。另外:我们增加了linux内核对套接字连接的限制,并发现php.ini套接字连接超时设置为600秒,而不是60秒作为默认值。在这些更改之后,我们还没有看到任何错误。您可以共享您的fsockopen实现吗?我尝试将此函数用于通知。请检查php.ini中的套接字限制,尤其是超时。保持在最低限度。我们的问题是php fpm在释放套接字时遇到问题。如果您使用linux作为服务器,请尝试更改有关tcp/ip堆栈套接字的内核限制。为了改变linux内核的限制,一些IBM网站发表了一些关于这个主题的好文章。然而,这是非常危险的,所以要小心。这也解决了我们在编辑php.ini之前的问题,在过去的8个月里,我们没有看到任何错误。@emrahgunduz您解决过这个问题吗?我今天和APN遇到了同样的事情。但到目前为止,它运行良好。谢谢。@tamak首先,请检查以确保在代码结束之前没有忘记关闭套接字。在后端,如果您使用的是linux,请增加打开文件限制检查内核限制。检查日志,确保未收到来自的FD_SETSIZE错误 php fpm如果在这种情况下,您必须在增加内核FD_SETSIZE limit后重新编译php,请搜索-enable FD SETSIZE。如果你在windows上,对不起,我不知道。