检测stream_socket是否有效



我有一个无限期运行的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 );
}

相关内容

  • 没有找到相关文章

最新更新