php - 流套接字客户端持续打开多长时间以及如何确认没有重复连接

标签 php sockets ssl push-notification apple-push-notifications

我们正在为我们的应用程序使用 APNS,在连接到 APNS 服务器时突然出现很多延迟后,我发现我们应该保持连接打开。
我对 stream_socket_client 的工作原理知之甚少,似乎无法找到这些问题的答案:

  • 我们正在使用 2 个不同的证书向 2 个不同的应用程序发送通知,是否为两者重复使用相同的连接是否每个都打开一个?
  • 连接的生命周期是多少?它会自动关闭还是我们需要写一些会不时关闭它们的东西?
  • 如何查看打开连接的数量及其信息,以确保我们最终不会出现重复或打开的连接过多?
  • 使用 STREAM_CLIENT_ASYNC_CONNECT 而不是 STREAM_CLIENT_PERSISTENT 有什么优势吗?异步也是持久的吗?

  • 这是我们的连接代码片段供您查看,每次需要发送通知时都会调用它(我们无法批量通知,因为我们的游戏是回合制文字游戏 - Wordspionage - 有一些严格的时间限制)。

    stream_context_set_option($ctx, 'ssl', 'local_cert', $cert);
    stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
    // Open a connection to the APNS server
    $url = 'ssl://gateway.push.apple.com:2195';
    
    $fp = stream_socket_client(
        $url , $err,
        $errstr, 4, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
    

    谢谢您的帮助!

    最佳答案

    我可以回答你的一些问题:

  • 每个应用程序都需要一个单独的连接,因为每个应用程序都有自己的推送证书,这是与 APNS 服务器建立 TLS 连接所必需的。
  • 您不必关闭连接。 Apple 可能随时关闭它(在这种情况下,您应该打开一个新连接)。如果您发送无效数据(例如无效的设备 token 、过长的有效负载等),它肯定会关闭它,但即使没有错误,它也可能会关闭它。
  • 您应该决定您希望同时维护多少个打开的连接(基于您发送通知的频率和发送通知的线程数)。每个应用程序至少需要一个连接,但您可能需要更多。对于每个打开的连接,您应该继续发送通知,直到发送失败,在这种情况下,您可以假设连接已关闭并打开一个新的连接来替换它。
  • 我不知道 PHP,所以我不能帮助你。

  • 另外,我建议你阅读 Push Notification Throughput and Error Checkingthis document .

    关于php - 流套接字客户端持续打开多长时间以及如何确认没有重复连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22384991/

    相关文章:

    php - 在mysql数据库中编辑一行

    php - 高级 PHP 设置 - 选择性地包括内置 PHP 函数

    java - 读取java中的响应结束readLine()

    node.js - ACME - 使用 SAN 获取子域的证书

    asp.net-mvc - ASP.NET MVC : Returning unsecured response to submitted https form on unsecured page

    php - 以有效和简单的方式实现层次结构、父/子关系

    php 这个叫什么名字,有什么作用?

    c - 执行 iptables 代码时出错 “Error commit: Protocol wrong type for socket”

    java - TCP 发送/接收缺失字节

    Android TLS 连接和自签名证书