【问题标题】:How to create a SSL connection in PHP with SO_KEEPALIVE?如何使用 SO_KEEPALIVE 在 PHP 中创建 SSL 连接?
【发布时间】:2010-11-10 03:05:03
【问题描述】:

我有一些创建 SSL 连接的简单 PHP 代码

$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $this->sslPem);
stream_context_set_option($streamContext, 'ssl', 'passphrase', $this->passPhrase);

$this->apnsConnection = stream_socket_client('ssl://'.$this->apnsHost.':'.$this->apnsPort, $error, $errorString, 60, STREAM_CLIENT_CONNECT, $streamContext);

但是知道如何将 SO_KEEPALIVE 设置为 true 吗?我也试过 STREAM_CLIENT_PERSISTENT,这不是一回事。

【问题讨论】:

    标签: php networking sockets ssl


    【解决方案1】:

    您是否已验证(通过网络跟踪)您需要设置套接字选项?

    你通过套接字发送什么? HTTP/HTTPS 通过“Connection”标头引入了自己的连接重用功能,因此套接字上的选项不一定是您想要设置的。

    【讨论】:

      【解决方案2】:

      SO_KEEPALIVE 就像在

      The SO_KEEPALIVE option causes a packet (called a 'keepalive probe') to be sent to the remote system if a long time (by default, more than 2 hours) passes with no other data being sent or received.
      ?
      我不知道这与 STREAM_CLIENT_PERSISTENT 有什么关系,但您可以使用socket_set_option 设置该选项(即使用sockets extension 而不是流)。

      【讨论】:

      • 那将是 socket_set_option($socket, SOL_SOCKET, SO_KEEPALIVE, 1)。但是话又说回来,您没有 ssl 支持。我还没有找到设置 ssl-stream 选项的方法。为此,您需要 php_stream_set_option,但它是一个不暴露给 php 脚本的内部函数。
      • 如果你找到了在该流资源上使用 stream_socket_client() 和 SO_KEEPALIVE 的方法,请告诉我。
      【解决方案3】:

      试试这个:

      $streamContext = stream_context_create();
      stream_context_set_option($streamContext, 'ssl', 'local_cert', $this->sslPem);
      stream_context_set_option($streamContext, 'ssl', 'passphrase', $this->passPhrase);
      
      $this->apnsConnection = stream_socket_client('ssl://'.$this->apnsHost.':'.$this->apnsPort, $error, $errorString, 60, STREAM_CLIENT_CONNECT, $streamContext);
      
      $is_keepalive = 0;
      // https://www.php.net/manual/ru/function.socket-import-stream.php
      $socket = socket_import_stream($this->apnsConnection);
      if (socket_set_option($socket, SOL_SOCKET, SO_KEEPALIVE, 1)) {
          $is_keepalive = socket_get_option($socket, SOL_SOCKET, SO_KEEPALIVE);
          //echo 'SO_KEEPALIVE: ' . $is_keepalive . PHP_EOL;
      } else {
          echo 'Unable to set option on socket: '. socket_strerror(socket_last_error()) . PHP_EOL;
      }
      
      if ($is_keepalive) {
          // https://www.php.net/manual/ru/function.socket-export-stream.php
          $this->apnsConnection = socket_export_stream($socket);
      }
      
      // TEST
      //$socket = socket_import_stream($this->apnsConnection);
      //echo 'SO_KEEPALIVE: ' . socket_get_option($socket, SOL_SOCKET, SO_KEEPALIVE);
      

      【讨论】:

        猜你喜欢
        • 2011-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-12
        • 1970-01-01
        • 2010-09-20
        • 1970-01-01
        相关资源
        最近更新 更多