2011-08-26 55 views
6

我現在有一個用PHP編寫的一個服務器守護程序它接收並使用stream_socket_*功能和投票活動流使用stream_select()爲他們創建網絡流。我希望能夠(使用string_filter_append())zlib的一個過濾器添加到任意流,但是當我做,我得到一個錯誤,告訴我,stream_select()不能使用輪詢過濾的流。如何將PHP的stream_select()與zlib過濾器一起使用?

我怎樣才能繞過這個限制?

回答

3

您可以使用管道和過濾器添加到一個管道。

這將允許您在流使用stream_select和管道將作爲zlib的緩衝區。

閱讀來自選擇()的流中的原始數據,將其寫入到管道,並讀取在另一側:)的解碼數據

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); 
} 

相同的大概可以用一個PHP實現: //內存流。

+0

謝謝你,這種方法似乎讓我來規避限制,但是我使用「zlib.deflate」,我不是複製流來流,而是隻用fwrite()將發送服務器 - 通過出站網絡流生成數據。使用這種方法,stream_get_contents($ out)返回2字節的zlib頭,沒有別的。如果我將相同的數據寫入文件,而不是寫入$ in並讀取$ out,則會完全寫入壓縮的$數據。有沒有關於這種方法會阻止從$ out讀取完整的壓縮數據? – drrcknlsn

+0

只有在寫入了一定數量的數據後,過濾器纔可以寫入流;嘗試寫更多的數據。也可以使用STREAM_FILTER_WRITE VS在寫入側的zlib.deflate過濾器和STREAM_FILTER_READ在讀取側嘗試使用。 – arnaud576875

相關問題