我有一个PHP文件,其中包含以下内容,可以完美地用于开发ceritficates,但是当我切换到生产证书时,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错误:
警告:stream_socket_client()[function.stream-socket-client]:无法设置本地证书链文件`/var/www/vhosts/thissite.com/httpdocs/prod.pem';在第19行的/var/www/vhosts/thissite.com/httpdocs/pushMessageLive.php中检查您的cafile / capath设置是否包含证书及其颁发者的详细信息
警告:stream_socket_client()[function.stream-socket-client]:无法在第19行的/var/www/vhosts/thissite.com/httpdocs/pushMessageLive.php中创建SSL句柄
警告:stream_socket_client()[function.stream-socket-client]:无法在第19行的/var/www/vhosts/thissite.com/httpdocs/pushMessageLive.php中启用加密
警告:stream_socket_client()[function.stream-socket-client]:无法连接到/ var / www / vhosts / thissite中的ssl://gateway.sandbox.push.apple.com:2195(未知错误)第19行的.com / httpdocs / pushMessageLive.php 无法连接0
答案 0 :(得分:3)
我有同样的问题。您必须与Apple的推送通知服务器建立持久套接字连接。我已经编写了一个名为 pyapns (http://github.com/samuraisam/pyapns)的python守护程序的教程,该程序非常适合我:
这可以假设您正在运行Debian并具有root权限来安装所需的软件包,例如python-twisted,libcurl4-openssl-dev等。
答案 1 :(得分:1)
听起来有太多连接。 Apple的文档声明您需要保持连接打开并同时发送尽可能多的连接。重新开放被认为是DOS攻击。所以试着让它持久化,看看你是否得到同样的错误。
答案 2 :(得分:0)
我不知道你遇到的错误是因为推送服务器连接太多......根据我的经验,这些限制有点难以达到。
但另一方面,当我尝试发送批量推送通知时,PHP表现得很奇怪。我不确定您的示例代码,但我猜你为每条消息做了stream_socket_client()
和fclose()
?在PHP中使用SSL套接字技术,我个人唯一能做到的就是失败......
我不确定您是否有可能在服务器上运行Ruby,但如果可以,我建议切换到ruby-apns-daemon来处理与Apple服务器的对话。它很轻巧,易于在PHP中实现(您实际上组成了相同的有效负载-JSON,但是将其发送到ruby-apns-daemon而不是通过套接字)。
答案 3 :(得分:0)
我遇到了同样的问题,证书有问题。您可以在此处How can I do an SSL connection with PHP和此处Error using ssl cert with PHP查看解决方案。
希望它能帮到你。
对于记录,您没有义务与APNS建立持久的联系。虽然最好一次发送所有邮件,但您可以多次连接和断开连接。我引用Apple的网站:
您还应保留连接 与APN跨越多个 通知。 APN可能会考虑 快速连接 反复建立和拆除 作为拒绝服务攻击。上 错误,APN关闭连接 哪个错误发生了。
如果你不是一次创造数百个连接,你就不应该遇到麻烦。