我有一个无限期运行的php服务器的脚本。它通过php中的stream_socket_client对象连接到apns( apple push Notification Service )。
问题是,虽然大多数情况下这起作用,但我无法弄清楚当我想发送推送通知时是否可以验证与APN的连接。该脚本接收传入的连接并将内容复制到APN。
当它不起作用时,脚本重新连接(stream_copy_to_tream的返回值为0 on 0字节,触发的重新连接),然后下一个传入的代币将成功,但它当然不会登录以下和交货消息:
PHP Warning: stream_copy_to_stream(): SSL: An established connection was
aborted by the software in your host machine.
是否有任何方法可以检测到上述并在之前重新连接到apns >试图写入套接字。
在尝试复制APN之前这样做:
if (!$socketObject) {
// reconnect
}
由于对象仍然存在(VAR_DUMP将打印描述)。那么如何检查连接是否仍打开?
将任何内容都写在插座上,这些令牌和有效载荷将导致APN断开连接。
执行写作的代码如下:
function writeToAPNS($client) {
return stream_copy_to_stream ( $client, $this->connectionAPNS );
}
从stream_socket_accept ( $this->socket, -1 )
返回$client
,$this->socket
是一个变量,包含local套接字对象侦听传入连接。-1意味着在等待传入连接时没有超时。工作时,此功能返回编写的字节数。失败时,它将返回0。
$this->connectionAPNS
是连接到APN时从stream_socket_client
返回的对象。这是我要在执行stream_copy_to_stream
函数之前要检查的有效性。
基本上我想检测$this->connectionAPNS
是否是有效。
我尝试将元数据倾倒为连接对象,但是它没有说明有效性,只有在时间时才,协议类型等。
您是否在官方stream_socket_client文档中看到了此注释?
UDP插座有时似乎已经打开而没有错误,即使远程主机无法实现。仅当您读取或从套接字> 中读取或写入数据时,错误才会变得显而易见。原因是因为UDP是一个"无连接"协议,这意味着操作系统不会试图在插座上建立链接,直到它实际需要发送或接收数据为止。
请在连接上尝试此methiod stream_get_meta_data,以尝试检测差异。我现在无法测试,但它可能会对您有所帮助。特别是 TIMED_OUT 属性。
至少要静音错误消息的另一个选项,因为您正在处理错误消息,是在stream_socket_client上设置适当的 errno 。
好吧,正如M.K.所解释的那样,这就是UDP的工作原理。顺便说一下,您的代码有效。您的问题是警告,通过将 @添加到您的写入功能中很容易消除。然后,您的代码看起来像:
function writeToAPNS($client) {
return @stream_copy_to_stream ( $client, $this->connectionAPNS );
}