Как использовать PHP stream_select () с фильтром zlib?

В настоящее время у меня есть демон-сервер, написанный на PHP, который принимает входящие подключения и создает для них сетевые потоки, используя функции stream_socket_* и опросы активных потоков, используя stream_select() . Я хотел бы иметь возможность добавлять zlib-фильтр (используя string_filter_append() ) в произвольный поток, но когда я это делаю, я получаю сообщение об ошибке, stream_select() что stream_select() не может использоваться для опроса фильтрованного потока.

Как я могу обойти это ограничение?

    Вы можете использовать трубку и вместо этого добавлять фильтр к трубе.

    Это позволит вам использовать 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: //.