In PHP: OpenSSL Fehlermeldungen: Fehler: 1409F07F: SSL-Routinen: SSL3_WRITE_PENDING: Fehler beim erneuten Schreiben

Ich versuche, eine große Datenmenge über eine SSL / TLS-Verbindung in PHP zu senden. Es funktioniert ziemlich gut, wenn der Datenblock nicht sehr groß ist oder wenn ich kein TLS verwende, aber was ich brauche (in der Nähe von 2 MB), dasfwrite Funktion zeigt die Warnung:

Warnung: fwrite (): Der SSL-Vorgang ist mit Code 1 fehlgeschlagen. OpenSSL-Fehlermeldungen: Fehler: 1409F07F: SSL-Routinen: SSL3_WRITE_PENDING: Fehlerhafte Schreibwiederholung

Der relevante Code, den ich verwende, um Clients zu verbinden:

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

Beim Senden von Daten wird sie an einen Puffer angehängt. Von Zeit zu Zeit wird diese Funktion für jeden Client und verknüpften Puffer aufgerufen:

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

Wie gesagt, mein Code funktioniert für kleine Datenmengen oder für normale (Nicht-TLS-) Verbindungen. Ich habe nach diesem Fehler gesucht und gefundenhttp://www.openssl.org/docs/ssl/SSL_write.html:

SSL_write () wird nur mit Erfolg zurückgegeben, wenn der gesamte Inhalt von buf der Länge num geschrieben wurde. Dieses Standardverhalten kann mit der Option SSL_MODE_ENABLE_PARTIAL_WRITE von SSL_CTX_set_mode (3) geändert werden. Wenn dieses Flag gesetzt ist, wird SSL_write () ebenfalls mit Erfolg zurückgegeben, wenn ein teilweiser Schreibvorgang erfolgreich abgeschlossen wurde. In diesem Fall wird die Operation SSL_write () als abgeschlossen betrachtet. Die Bytes werden gesendet und eine neue SSL_write () - Operation mit einem neuen Puffer (wobei die bereits gesendeten Bytes entfernt wurden) muss gestartet werden. Ein Teilschreibvorgang wird mit der Größe eines Nachrichtenblocks ausgeführt, der für SSLv3 / TLSv1 16 KB beträgt.

Aber wie kann ich das in PHP machen?

Jede Hilfe dankbar :)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage