Как осуществлять потоковую фильтрацию стандартных выходных данных PHP? - PullRequest
4 голосов
/ 06 марта 2011

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

standard output  ⟶  output filter  ⟶  standard output

Я уже знаю о ob_start.Но я не хочу обрабатывать весь вывод сразу, а в виде потока, используя php_user_filter или что-то подобное.

Ответы [ 2 ]

3 голосов
/ 06 марта 2011

Я не совсем понимаю, для чего это нужно, но это не причина, чтобы не публиковать ответ.

Вы можете использовать обратный вызов ob_start(), чтобы он обрабатывал частичное содержимое. Все, что вам нужно сделать, это установить ob_implicit_flush() сразу после инициализации. Теперь обычно обратный вызов представляет собой простую функцию in-out, но вы можете сделать ее настолько сложной, насколько вам нужно, с помощью:

class ob_callback {
    function __invoke($part, $end_flag_0x04) {
        return "+$part";
        // or map to $stream->filter($in, $out, &$consumed, $closing)
    }
    function __destruct() { /* cleanup */ }
}

ob_start(new ob_callback, 2);
ob_implicit_flush(TRUE);

Я не уверен, как будет выглядеть потоковое использование. Но я думаю, что нет другого способа перехватить стандартный вывод PHP. Обратите внимание, что неявный сброс не будет работать на CLI.

0 голосов
/ 23 марта 2013

Если я правильно понимаю ваш вопрос, вы можете использовать второй аргумент для ob_start(), $chunk_size для этого.

ob_start('my_callback', 1024);

В приведенном выше примере будет вызываться my_callback() каждый раз, когда вывод приводит к тому, что буфер достигает или превышает один килобайт. Если вы выкладываете несколько килобайт в отдельных выражениях, my_callback() будет срабатывать несколько раз. Это было бы бесполезно, если бы вы выводили несколько килобайт в виде одной строки, так как самое большее my_callback() может быть запущено только один раз для каждого вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...