我正在尝试在PHP中使用SSL/TLS连接发送大量数据。如果数据块不是很大或者我没有使用TLS,那么它的工作非常好,但是我需要的(接近2MiB)
当发送数据时,它会被附加到缓冲区中,并且定期地为每个客户端和链接的缓冲区调用此函数:
正如我所说,我的代码适用于少量数据或普通(非TLS)连接。我搜索了这个错误并找到了http://www.openssl.org/docs/ssl/SSL_write.html:
感谢任何帮助 :)
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:
但是我该如何在PHP中实现这一点?只有当长度为num的buf的全部内容被写入时,SSL_write()才会成功返回。可以使用SSL_CTX_set_mode(3)的SSL_MODE_ENABLE_PARTIAL_WRITE选项更改此默认行为。当设置了此标志时,SSL_write()也将在成功完成部分写入时返回成功。在这种情况下,SSL_write()操作被认为已完成。字节被发送,必须开始一个新的SSL_write()操作,其中包含一个新的缓冲区(已删除已发送的字节)。消息块的大小为16kB,适用于SSLv3/TLSv1。
感谢任何帮助 :)