2011-08-26 11 views
6

Attualmente ho un demone server scritto in PHP che accetta le connessioni in entrata e crea flussi di rete per loro utilizzando le funzioni stream_socket_* e esegue il polling dei flussi attivi utilizzando stream_select(). Mi piacerebbe essere in grado di aggiungere un filtro zlib (usando string_filter_append()) a uno stream arbitrario, ma quando lo faccio, viene visualizzato un errore che mi informa che non è possibile utilizzare stream_select() per eseguire il polling di un flusso filtrato.Come faccio a usare stream_select() di PHP con un filtro zlib?

Come posso aggirare questa limitazione?

risposta

3

È possibile utilizzare un tubo e aggiungere il filtro al tubo.

Ciò consentirà di utilizzare stream_select sullo stream e la pipe fungerà da buffer per zlib.

Leggere i dati grezzi dal flusso di selezione ed(), scrivere al tubo, e leggere i dati decodificati sull'altro lato :)

list($in, $out) = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, 0); 

stream_filter_append($out, 'zlib.inflate', STREAM_FILTER_READ); 
stream_set_blocking($out, 0); 

while (stream_select(...)) { 
    // assuming that $stream is non blocking 
    stream_copy_to_stream($stream, $in); 

    $decoded_data = stream_get_contents($out); 
} 

Lo stesso può probabilmente essere realizzato con un php: // flusso di memoria.

+0

Grazie, questo metodo sembra consentirmi di aggirare la limitazione, tuttavia sto usando "zlib.deflate" e non sto copiando stream-to-stream, ma piuttosto, usando solo fwrite() per inviare server dati generati attraverso i flussi di rete in uscita. Usando questo metodo, stream_get_contents ($ out) restituisce l'intestazione zlib a 2 byte e nient'altro. Se scrivo gli stessi dati su un file, piuttosto che scrivere su $ in e leggere $ out, i dati $ compressi sono scritti completamente. C'è qualcosa in questo metodo che impedirebbe di leggere i dati compressi completi da $ out? – drrcknlsn

+0

Il filtro può scrivere sul flusso solo dopo aver scritto una certa quantità di dati; prova a scrivere più dati. Prova anche con il filtro zlib.deflate sul lato scrittura con STREAM_FILTER_WRITE VS sul lato di lettura con STREAM_FILTER_READ. – arnaud576875