【问题标题】:In PHP: OpenSSL Error messages: error: 1409F07F: SSL routines: SSL3_WRITE_PENDING: bad write retry在 PHP:OpenSSL 错误消息:错误:1409F07F:SSL 例程:SSL3_WRITE_PENDING:错误写入重试
【发布时间】:2013-01-19 15:42:48
【问题描述】:

我正在尝试使用 PHP 中的 SSL/TLS 连接发送大量数据。如果数据块不是很大或者我不使用 TLS,但我需要(接近 2MiB),fwrite 函数会显示警告:

警告:fwrite():SSL 操作失败,代码为 1。OpenSSL 错误消息:错误:1409F07F:SSL 例程:SSL3_WRITE_PENDING:错误写入重试

我用来连接客户端的相关代码:

$cntxt = stream_context_create(array('ssl' => array('local_cert' => 'certificate.pem')));
$server = stream_socket_server('tls://127.0.0.1:8080', $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $cntxt);

// Wait for client connection //

$client = stream_socket_accept($server);
// Use non-blocking socket to allow answering many clients at a time
stream_set_blocking($client, 0);
$clients[] = $client;

发送数据时,它会附加到缓冲区,并且不时为每个客户端和链接的缓冲区调用此函数:

function trySend($client, &$buffer) {
    if (strlen($buffer)) {
        $len = fwrite($client, $buffer);
        $buffer = substr($buffer, $len);
    }
}

正如我所说,我的代码适用于少量数据或正常(非 TLS)连接。我搜索了这个错误,发现http://www.openssl.org/docs/ssl/SSL_write.html

SSL_write() 只会在长度为 num 的 buf 的完整内容被写入后返回成功。可以使用 SSL_CTX_set_mode(3) 的 SSL_MODE_ENABLE_PARTIAL_WRITE 选项更改此默认行为。设置此标志时,SSL_write() 也将在部分写入成功完成时返回成功。在这种情况下,SSL_write() 操作被认为已完成。字节被发送,并且必须开始使用新缓冲区(已删除已发送的字节)的新 SSL_write() 操作。使用消息块的大小执行部分写入,对于 SSLv3/TLSv1 为 16kB。

但是我如何在 PHP 中做到这一点?

任何帮助表示赞赏:)

【问题讨论】:

    标签: php ssl websocket


    【解决方案1】:

    我发现我可以通过将传递给 fwrite() 的字符串长度限制为 8192 来解决这个问题,这可以防止 fwrite() 警告。

    因此,对于您示例中的代码,我将尝试将 substr() 调用更改为:

    $buffer = substr($buffer, $len, 8192);
    

    【讨论】:

      【解决方案2】:

      解决办法是:

      $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
      try {                           
      $result = fwrite($fp, $msg, strlen($msg));
      }
      catch (Exception $ex) {
      sleep(1); //sleep for 5 seconds
      $result = fwrite($fp, $msg, strlen($msg));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-27
        • 1970-01-01
        • 1970-01-01
        • 2017-05-26
        • 1970-01-01
        • 2013-10-28
        • 2020-09-07
        相关资源
        最近更新 更多