Как использовать PHP stream_select () с фильтром zlib? - PullRequest
6 голосов
/ 26 августа 2011

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

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

1 Ответ

3 голосов
/ 26 августа 2011

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

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

...