Вы можете использовать канал и вместо него добавить фильтр в канал.
Это позволит вам использовать stream_select в потоке, и канал будет служить буфером для zlib.
Считайте необработанные данные из потока select () ed, запишите их в канал и прочитайте декодированные данные с другой стороны:)
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:// поток памяти.