我有一个包含以下内容的PHP文件,它在开发证书上工作得很好,但当我切换到生产证书时,PHP会出现错误,并给出以下消息,但它只有大约50%的时间会这样做。另外50%是有效的。有人知道为什么会发生这种事吗?
<?php
// masked for security reason
$deviceToken = 'xxxxxx'; // jq
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', dirname(__FILE__)."/prod.pem");
$number = 5;
$fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
if (!$fp) {
print "Failed to connect $err $errstr\n";
}
else {
print "Connection OK\n";
$msg = $_GET['msg'];
$payload['aps'] = array('alert' => $msg, 'badge' => 1, 'sound' => 'default');
$payload = json_encode($payload);
$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload;
print "sending message :" . $payload . "\n";
fwrite($fp, $msg);
fclose($fp);
}
?>PHP错误:
警告:cafile()函数.stream-socket-client:无法设置本地证书链文件`/var/www/vhosts/thissite.com/httpdocs/prod.pem';在第19行的/var/www/vhosts/thissite.com/httpdocs/pushMessageLive.php中检查stream_socket_client/capath设置是否包含证书及其颁发者的详细信息
警告: SSL ()函数.stream-socket-client:无法在第19行的/var/www/vhosts/thissite.com/httpdocs/pushMessageLive.php中创建stream_socket_client句柄
警告: stream_socket_client()函数.stream-socket-client:无法在第19行的/var/www/vhosts/thissite.com/httpdocs/pushMessageLive.php中启用加密
警告: stream_socket_client()函数.stream-socket-client:无法连接到ssl://gateway.sandbox.push.apple.com:2195 (未知错误)第19行上的/var/www/vhosts/thissite.com/httpdocs/pushMessageLive.php无法连接0
发布于 2010-05-31 07:17:03
我也有同样的问题。您必须与Apple的推送通知服务器建立持久的套接字连接。我已经为一个名为pyapns (http://github.com/samuraisam/pyapns)的python守护进程写了一个教程,它对我来说工作得很好:
http://www.how2s.org/index.php/How_to_get_started_with_Apple_Push_Notifications_for_iPhone_or_iPhone_Touch
假设您运行的是Debian,并且具有root访问权限来安装所需的包,如python-twisted、libcurl4-openssl-dev等,则此方法可以工作。
发布于 2010-05-11 05:00:49
听起来连接太多了。苹果的文档指出,你需要保持连接打开,并同时发送尽可能多的连接。重新打开被认为是DOS攻击。所以试着让它持久化,看看你是否会得到同样的错误。
发布于 2010-05-13 00:14:33
我不知道你遇到的错误是不是因为到推送服务器的连接太多了…根据我的经验,这些限制有点难以达到。
但另一方面,当我尝试发送批量推送通知时,PHP却表现得很奇怪。我不能从你的示例代码中确定,但我猜你对每条消息都做了一个stream_socket_client()和fclose()?在PHP中使用SSL套接字时,我个人唯一完成的事情就是失败……
我不确定你是否有可能在你的服务器上运行Ruby,但如果你可以,我建议你切换到ruby-apns-daemon来处理与苹果服务器的对话。它是轻量级的,易于在PHP中实现(您实际上编写了相同的有效负载-JSON,但将其发送到ruby-apns-daemon而不是通过套接字)。
https://stackoverflow.com/questions/2462280
复制相似问题