APNS + PHP “stream_socket_client(): 无法启用加密”

我在将 APNS 与 PHP 一起使用时遇到问题,并收到以下消息:

stream_socket_client(): Failed to enable crypto

问题只是有时发生,而其他时候它实际上会发送推送。

由于我的测试脚本在10次迭代的循环中,因此我有时会得到这个:

stream_socket_client(): SSL: Connection reset by peer

我正在使用沙盒服务器进行测试tls://gateway.sandbox.push.apple.com:2195

这是我尝试过的:

  • 我试图重新颁发PEM和所有证书。
  • 我玩了一下请求协议和.sslv3://tls://
  • 我玩了一下密码(顺便说一句,没有密码短语的推送工作)
  • 我尝试在堆栈溢出中搜索解决方案,但没有任何效果。
  • 已检查 pem 文件权限644
  • 已检查 pem 父目录权限755

似乎我在Google和SO上找到的所有解决方案都是人们在推动方面遇到问题。

我觉得服务是有限的价格也许?因为我们等了一段时间(大约15分钟),然后再次尝试,并且能够成功推送大约100条消息,直到我再次开始收到该消息。


答案 1

沙盒推送服务受速率限制。我在测试时亲身经历过这种情况,但从未在使用生产API时遇到过任何此类限制。

您可能还会遇到他们的其他保护措施。

您是否打开连接,发送消息,关闭连接,然后循环并再次执行所有操作?

这将使您的通知被删除。Apple 希望您使用相同的连接发送多个推送通知,而不是每次都发送新的推送通知。

管理连接的最佳做法

您可以与同一网关或多个网关实例建立多个连接。如果需要发送大量远程通知,请通过连接到多个不同的网关来分发这些通知。与使用单个连接相比,这可以提高性能:它使您可以更快地发送远程通知,并使APN更快地发送通知。

通过多个通知保持与APNs的连接打开;不要重复打开和关闭连接。APNs 将快速连接和断开连接视为拒绝服务攻击。您应该将连接保持打开状态,除非您知道该连接将在很长一段时间内处于空闲状态,例如,如果您每天仅向用户发送一次通知,则可以每天使用新连接。

来自 Apple Docs @ https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html


答案 2

我的PHP代码生成以下错误:

PHP Warning:  stream_socket_client(): Failed to enable crypto in /private/tmp/t.php on line 12
PHP Warning:  stream_socket_client(): unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Unknown error) in /private/tmp/t.php on line 12
PHP Warning:  fclose() expects parameter 1 to be resource, boolean given in /private/tmp/t.php on line 24

问题是,该死的证书,前天过期了!:-)你能相信吗?

因此,我需要重新创建我的PEM文件。


推荐