【发布时间】:2015-07-21 19:52:21
【问题描述】:
我有一个无限期运行的类似 PHP 服务器的脚本。它使用 PHP 中的 stream_socket_client 对象连接到 APNS(Apple 推送通知服务)。
问题是,虽然这在大多数情况下都有效,但当我想发送推送通知时,我无法弄清楚如何验证与 APNS 的连接是否可用。该脚本接收传入连接并将内容复制到 APNS。
当它不起作用时,脚本重新连接(stream_copy_to_stream 的返回值为 0 on 0 bytes 写入,这会触发重新连接)然后下一个传入的令牌会成功,但它会记录以下内容当然不会传递消息:
PHP Warning: stream_copy_to_stream(): SSL: An established connection was
aborted by the software in your host machine.
有什么方法可以检测到上述情况,从而在尝试写入套接字之前重新连接到 APNS。
在尝试复制到 APNS 之前执行此操作:
if (!$socketObject) {
// reconnect
}
不起作用,因为对象仍然存在(var_dump 将打印描述)。那么如何检查连接是否仍然打开?
向套接字写入任何不是有效令牌和有效负载的内容都会导致 APNS 断开连接。
执行写入的代码如下所示:
function writeToAPNS($client) {
return stream_copy_to_stream ( $client, $this->connectionAPNS );
}
其中$client 是从stream_socket_accept ( $this->socket, -1 ) 返回的,$this->socket 是一个变量,其中包含侦听传入连接的本地套接字对象。 -1 表示等待传入连接时没有超时。当它工作时,这个函数返回写入的字节数。失败时返回 0。
$this->connectionAPNS是连接APNS时stream_socket_client返回的对象。这是我在执行stream_copy_to_stream 函数之前要检查的有效性。
所以基本上我想检测$this->connectionAPNS 是否有效。
我尝试转储连接对象的元数据,但它没有说明有效性,只有当它超时、协议类型等时才说明。
【问题讨论】:
-
你错过了展示可重现的东西。
-
那我再添加一些代码。等等。