В настоящее время у меня есть демон-сервер, написанный на 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: //.