powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Вывод текста в браузер, минуя перехват буфера (ob_start + ob_get_contents + ob_end_clean)
13 сообщений из 13, страница 1 из 1
Вывод текста в браузер, минуя перехват буфера (ob_start + ob_get_contents + ob_end_clean)
    #38799491
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется код:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
superFunc() {
    $str = 'Эта строка должна попасть в браузер';
    ??? // echo $str; // попадёт в логи
}
ob_start();
   superFunc();
   $content = ob_get_contents();
ob_end_clean();
// далее идёт вывод в логи содержимого $content


Сделал так, как указано здесь: http://borkweb.com/story/bypassing-output-buffering-in-php
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
[SRC php]superFunc() {
    $str = 'Эта строка должна попасть в браузер';
    fwrite(defined('STDOUT')? constant('STDOUT'): fopen('php://stdout', 'w'), $str);
}
ob_start();
   superFunc();
   $content = ob_get_contents();
ob_end_clean();
// далее идёт вывод в логи содержимого $content

но в этом случае:
а) строка $str не попадает ни в браузер, ни в логи
б) не генерируется никаких ошибок и предупреждений php (уровень ошибок php у меня максимальный - вплоть до debug)
в) функция fwrite корректно возвращает число байт (байтовую длину строки)

Вопросы:
1) Куда в приведённом коде записывает строку функция fwrite ?
2) Как вывести текст в браузер, минуя перехват буфера
...
Рейтинг: 0 / 0
Вывод текста в браузер, минуя перехват буфера (ob_start + ob_get_contents + ob_end_clean)
    #38803531
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Куда все подевались ?
...
Рейтинг: 0 / 0
Вывод текста в браузер, минуя перехват буфера (ob_start + ob_get_contents + ob_end_clean)
    #38803544
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а нефик в stdout писать.
...
Рейтинг: 0 / 0
Вывод текста в браузер, минуя перехват буфера (ob_start + ob_get_contents + ob_end_clean)
    #38803611
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
 ob_start();
   print("String for buffer...."); 
   $str=ob_get_contents();
   ob_end_clean();

   // .... do some ....

   print($str);
...
Рейтинг: 0 / 0
Вывод текста в браузер, минуя перехват буфера (ob_start + ob_get_contents + ob_end_clean)
    #38804054
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
точно не скажу, но помню что уменя запись в стдаут поламалась, даже если вызвать об_клин при не включеном буфере....

вообщем говоря, как обойти буферизацию.

посути
ИМЕЕМ
включить буфер, выключить буфер, получить буфер, очистить буфер. других функций нам не дано.

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


вам чего надобно то...был код который буферизирует весь вывод, и не переделывая ничего хотите чтото в браузер вывести...

хм... напрашиваеться одно только. создать класс, который будет сам собирать всё что браузеру причитаеться, и назначить ему деструктор, который отключает буферизацию, и делает вывод...но это чревато, ибо после срабатывания деструктора, возможен ещо какойто вывод, что должно было попадать в лог.
...
Рейтинг: 0 / 0
Вывод текста в браузер, минуя перехват буфера (ob_start + ob_get_contents + ob_end_clean)
    #38804072
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибся малёк. почитал и всё стало на свои места.

stdout - это консоль.
вывод в браузер это
output :)
последнее выводит точно тудаже куда и команды ехо.

как сделать вывод кудато

ещо можно писать в php://memory php://temp
но опять же стаёт вопрос - как детектировать что буферы больше не нужны, что уже можно их выключить и делать вывод для браузера, если не менять особо существующий код.
...
Рейтинг: 0 / 0
Вывод текста в браузер, минуя перехват буфера (ob_start + ob_get_contents + ob_end_clean)
    #38830471
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterCyrax_02,

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
 ob_start();
   print("String for buffer...."); 
   $str=ob_get_contents();
   ob_end_clean();

   // .... do some ....

   print($str);

Не совсем понял пример. Вернее, вообще не понял.
Согласно сабжу, вместо print("String for buffer...."); должна выполниться функция, которая принудительно выводит текст в браузер, минуя внешнюю (по отношению к функции) буферизацию. При это менять внешний код (выполняющий буферизацию) мы не можем. Менять можем только действия, выполняемые внутри функции.

авторвам чего надобно то...был код который буферизирует весь вывод, и не переделывая ничего хотите чтото в браузер вывести...Именно. Внутри функции выводим текст в браузер, обойдя при этом внешнюю (по отношению к функции) буферизацию.
...
Рейтинг: 0 / 0
Вывод текста в браузер, минуя перехват буфера (ob_start + ob_get_contents + ob_end_clean)
    #38830476
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторstdout - это консоль.
вывод в браузер это
output :)
последнее выводит точно тудаже куда и команды ехо.
Да, действительно. Вместо STDOUT нужно было использовать OUTPUT.
Но output при использовании fwrite по-прежнему перехватывается внешней буферизацией.

Остаётся только вариант с отключением/включением буферизации...
...
Рейтинг: 0 / 0
Вывод текста в браузер, минуя перехват буфера (ob_start + ob_get_contents + ob_end_clean)
    #38830622
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот решение:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
function superFunc() {
    $str = 'Эта строка должна попасть в браузер';
    
    $obInfo = ob_get_status(true); // full_status
    $obCount = count($obInfo);
    
    for($obLevel = $obCount - 1; $obLevel >= 0; $obLevel--) {
        $obInfo[$obLevel]['content'] = ob_get_clean();
    }
    echo $str;  // fwrite(defined('OUTPUT')? constant('OUTPUT'): fopen('php://output', 'w'), $str);
    
    for($obLevel = 0; $obLevel < $obCount; $obLevel++) {
        $info = $obInfo[$obLevel];
        
        $obCallback = (($info['name'] == 'default output handler')? null: $info['name']);
        ob_start($obCallback, $info['chunk_size'], $info['del']);
        echo $info['content'];
    }
}


Тест:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
echo ' (before buffering 1)';
ob_start();
    echo ' (before buffering 2)';
    ob_start();
        echo ' (before superFunc)';
        superFunc();
        echo ' (after superFunc)';
        $content2 = ob_get_contents();
    ob_end_clean();
    echo ' (after buffering 2)';
    echo ' [capture buffer 2: '.$content2.']';
    $content1 = ob_get_contents();
ob_end_clean();
echo ' (after buffering 1)';
echo ' [capture buffer 1: '.$content1.']';


Получаем:
авторЭта строка должна попасть в браузер
(before buffering 1) (after buffering 1)
[capture buffer 1: (before buffering 2) (after buffering 2) [capture buffer 2 : (before superFunc) (after superFunc) ] ]
Вроде, всё правильно ? Можно вводить в эксплуатацию ?
...
Рейтинг: 0 / 0
Вывод текста в браузер, минуя перехват буфера (ob_start + ob_get_contents + ob_end_clean)
    #38830875
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
Cyrax_02Вот решение:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
function superFunc() {
    $str = 'Эта строка должна попасть в браузер';
    
    $obInfo = ob_get_status(true); // full_status
    $obCount = count($obInfo);
    
    for($obLevel = $obCount - 1; $obLevel >= 0; $obLevel--) {
        $obInfo[$obLevel]['content'] = ob_get_clean();
    }
    echo $str;  // fwrite(defined('OUTPUT')? constant('OUTPUT'): fopen('php://output', 'w'), $str);
    
    for($obLevel = 0; $obLevel < $obCount; $obLevel++) {
        $info = $obInfo[$obLevel];
        
        $obCallback = (($info['name'] == 'default output handler')? null: $info['name']);
        ob_start($obCallback, $info['chunk_size'], $info['del']);
        echo $info['content'];
    }
}


Тест:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
echo ' (before buffering 1)';
ob_start();
    echo ' (before buffering 2)';
    ob_start();
        echo ' (before superFunc)';
        superFunc();
        echo ' (after superFunc)';
        $content2 = ob_get_contents();
    ob_end_clean();
    echo ' (after buffering 2)';
    echo ' [capture buffer 2: '.$content2.']';
    $content1 = ob_get_contents();
ob_end_clean();
echo ' (after buffering 1)';
echo ' [capture buffer 1: '.$content1.']';


Получаем:
авторЭта строка должна попасть в браузер
(before buffering 1) (after buffering 1)
[capture buffer 1: (before buffering 2) (after buffering 2) [capture buffer 2 : (before superFunc) (after superFunc) ] ]
Вроде, всё правильно ? Можно вводить в эксплуатацию ?Cyrax_02, обломайся.
Код: php
1.
2.
3.
4.
5.
ob_start(create_function('$string', 'return strrev($string);'));
echo "\nabcd\n";
//superFunc();
echo "\nabcd\n";
ob_end_flush();

Без superFunc выводит dcba dcba, с superFunc - abcd abcd.
...
Рейтинг: 0 / 0
Вывод текста в браузер, минуя перехват буфера (ob_start + ob_get_contents + ob_end_clean)
    #38830918
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так я знаю про этот "артефакт".
Анонимные callback-обработчики при получении информации о буферах вывода имеют имя "default output handler" - то же самое, что и при отсутствии callback-обработчиков. В вашем примере после вызова superFunc обработчик просто-напросто не вызывается.

Думаю, восстановить анонимный callback-обработчик вам труда не составит ? Или слабо ?
...
Рейтинг: 0 / 0
Вывод текста в браузер, минуя перехват буфера (ob_start + ob_get_contents + ob_end_clean)
    #38831538
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
Cyrax_02Так я знаю про этот "артефакт".
Анонимные callback-обработчики при получении информации о буферах вывода имеют имя "default output handler" - то же самое, что и при отсутствии callback-обработчиков. В вашем примере после вызова superFunc обработчик просто-напросто не вызывается.

Думаю, восстановить анонимный callback-обработчик вам труда не составит ? Или слабо ?Мне то зачем его восстанавливать, это ваша идея. По мне сама ваша постановка задачи - признак ошибки проектирования.
...
Рейтинг: 0 / 0
Вывод текста в браузер, минуя перехват буфера (ob_start + ob_get_contents + ob_end_clean)
    #38831993
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПо мне сама ваша постановка задачи - признак ошибки проектирования. Цыган ? Постановку задачи я не озвучивал ))
Ошибки в проектировании у меня нет. Просто-напросто, пишу свою программную систему (надстройку) над другой постоянно обновляющейся (разработкой которой я не занимаюсь). Естественно, логику работы своей системы я ориентирую на неё, но 100%-ной логической интеграции, очевидно, достичь практически нереально. Более того, данный "хук" использую исключительно в целях отладки и в ядро своей системы не интегрирую.

Да и вообще, с вашей стороны это неконструктивное дистанцирование от озвученной проблемы...
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Вывод текста в браузер, минуя перехват буфера (ob_start + ob_get_contents + ob_end_clean)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]