Per qualche motivo, il filtro zlib.deflate
non sembra funzionare con le coppie di socket generate da stream_socket_pair()
. Tutto ciò che può essere letto dal secondo socket è l'intestazione zlib a due byte, e tutto ciò che segue è NULL.Utilizzo del filtro zlib con una coppia di socket
Esempio:
<?php
list($in, $out) = stream_socket_pair(STREAM_PF_UNIX,
STREAM_SOCK_STREAM,
STREAM_IPPROTO_IP);
$params = array('level' => 6, 'window' => 15, 'memory' => 9);
stream_filter_append($in, 'zlib.deflate', STREAM_FILTER_WRITE, $params);
stream_set_blocking($in, 0);
stream_set_blocking($out, 0);
fwrite($in, 'Some big long string.');
$compressed = fread($out, 1024);
var_dump($compressed);
fwrite($in, 'Some big long string, take two.');
$compressed = fread($out, 1024);
var_dump($compressed);
fwrite($in, 'Some big long string - third time is the charm?');
$compressed = fread($out, 1024);
var_dump($compressed);
uscita:
string(2) "x�"
string(0) ""
string(0) ""
Se io commento la chiamata a stream_filter_append()
, la scrittura flusso/lettura funzioni correttamente, con i dati oggetto di dumping nella sua interezza tutte e tre le volte e se indirizzo il flusso filtrato di zlib in un file invece che attraverso la coppia di socket, i dati compressi sono scritti correttamente. Quindi entrambe le parti funzionano correttamente separatamente, ma non insieme. È un bug PHP che dovrei segnalare o un errore da parte mia?
Questa domanda è derivata da una soluzione a this related question.
Grazie mille per la spiegazione. Ho implementato lo stesso progetto in Ruby e ho dovuto passare 'Zlib :: SYNC_FLUSH' come secondo argomento a' Zlib :: deflate() 'per farlo funzionare. Suppongo che questo stia scrivendo e poi immediatamente lo scarico dopo la scrittura. Ho notato che PHP sta usando 'Z_SYNC_FLUSH' solo se il flag' PSFS_FLAG_FLUSH_INC' è impostato, ma come hai detto, i bit di flag non sembrano essere esposti. – FtDRbwLXw6