2011-08-26 6 views
6

私は現在、PHPで書かれたサーバーデーモンを持っています。これは、受信接続を受け入れ、stream_socket_*関数を使用してネットワークストリームを作成し、stream_select()を使用してアクティブなストリームをポーリングします。任意のストリームにzlibフィルタ(string_filter_append()を使用)を追加できるようにしたいのですが、そうすると、stream_select()をフィルタリングされたストリームをポーリングするために使用できないというエラーが表示されます。zlibフィルタでPHPのstream_select()を使用するにはどうすればよいですか?

この制限を回避するにはどうすればよいですか?

答えて

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

フィルタは、ある量のデータが書き込まれた後にのみストリームに書き込むことができます。より多くのデータを書き込んでみてください。また、書き込み側のzlib.deflateフィルタをSTREAM_FILTER_WRITE VSと読み込み側でSTREAM_FILTER_READで試してください。 – arnaud576875