W PHP: OpenSSL Komunikaty o błędach: błąd: 1409F07F: Procedury SSL: SSL3_WRITE_PENDING: ponowna próba zapisu

Próbuję wysłać ogromną ilość danych przy użyciu połączenia SSL / TLS w PHP. Działa całkiem dobrze, jeśli porcja danych nie jest zbyt duża lub jeśli nie używam TLS, ale to, czego potrzebuję (blisko 2MiB), tofwrite funkcja wyświetla ostrzeżenie:

Ostrzeżenie: fwrite (): Operacja SSL nie powiodła się z kodem 1. OpenSSL Komunikaty o błędach: błąd: 1409F07F: Procedury SSL: SSL3_WRITE_PENDING: zła próba zapisu

Odpowiedni kod, którego używam do łączenia klientów:

$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;

Podczas wysyłania danych jest dołączany do bufora i od czasu do czasu ta funkcja jest wywoływana dla każdego klienta i połączonego bufora:

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

Jak już wspomniałem, mój kod działa dla małych ilości danych lub dla normalnych połączeń (nie TLS). Szukałem tego błędu i znalazłemhttp://www.openssl.org/docs/ssl/SSL_write.html:

SSL_write () powróci tylko z powodzeniem, gdy zostanie zapisana pełna zawartość buf o długości num. To domyślne zachowanie można zmienić za pomocą opcji SSL_MODE_ENABLE_PARTIAL_WRITE w SSL_CTX_set_mode (3). Gdy ta flaga jest ustawiona, SSL_write () również powróci z powodzeniem, gdy częściowe zapisanie zakończy się pomyślnie. W tym przypadku operacja SSL_write () jest uważana za zakończoną. Bajty są wysyłane i musi zostać uruchomiona nowa operacja SSL_write () z nowym buforem (z usuniętymi już wysłanymi bajtami). Częściowe zapisywanie odbywa się przy rozmiarze bloku wiadomości, który wynosi 16 kB dla SSLv3 / TLSv1.

Ale jak mogę to zrobić w PHP?

Każda pomoc doceniana :)

questionAnswers(2)

yourAnswerToTheQuestion