Что такое код ob_get_level

Ob_get_level() начинается с уровня 1

Имеет несколько проблем с буферизацией вывода. В основном, я пытаюсь запустить буферизацию вывода с обратным вызовом ob_gzhandler, но он продолжает говорить мне, используя неподдерживаемый тип сжатия. Все включено, и я считаю, что проблема заключается в том, что запуск ob_get_level() в начале моего script создает уровень 1. php.ini имеет мое значение output_buffering, равное 4096.

Если я запустил что-то вроде:

Затем я могу успешно запустить ob_start() с обратным вызовом ob_gzhandler. Но мне интересно, должно ли это быть проблемой. Во время моего script я делаю вызовы ob_clean() в разных точках, так как я избегаю стекирования слишком большого количества буферов, поскольку я читал, что это может повысить производительность. Я просто не уверен, что я должен здесь делать.

У вас включена буферизация вывода по умолчанию (см. документы) — это означает, что каждый PHP script начинается с ob_start().

Если вы хотите отключить OB по умолчанию для всех скриптов PHP, в вашем php.ini установите output_buffering = Off .

Если вы хотите отключить OB по умолчанию для этого конкретного script, используйте цикл while — это совершенно правильно.

Что касается ob_clean — вы уверены, что хотите удалить вывод, который находится в вашем буфере? ИМО это действительно не нужно, если только вы не видите значительных медленных нагрузок страниц. Не беспокойтесь об оптимизации этого (по крайней мере, не сейчас).

FPublisher

Web-технологии: База знаний

Документация PHP

ob_get_level

(PHP 4 >= 4.2.0, PHP 5)

ob_get_level — Return the nesting level of the output buffering mechanism

Описание

int ob_get_level ( void )

Returns the nesting level of the output buffering mechanism.

Возвращаемые значения

Returns the level of nested output buffering handlers or zero if output buffering is not active.

Смотрите также

Последние поступления:

ТехЗадание на Землю

Размещена 14 марта 2020 года

Пpоект Genesis (из коpпоpативной пеpеписки)

Шпаргалка по работе с Vim

Размещена 05 декабря 2020 года

Vim довольно мощный редактор, но работа с ним не всегда наглядна.
Например если нужно отредактировать какой-то файл например при помощи crontab, без знания специфики работы с viv никак.

Ошибка: Error: Cannot find a val >Размещена 13 сентабря 2020 года

Если возникает ошибка на centos 5 вида
YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
Eg. Invalid release/

Linux Optimization

Размещена 30 июля 2012 года

Ob_get_level() начинается с уровня 1

Имеет несколько проблем с буферизацией вывода. В основном, я пытаюсь запустить буферизацию вывода с обратным вызовом ob_gzhandler, но он продолжает говорить мне, используя неподдерживаемый тип сжатия. Все включено, и я считаю, что проблема заключается в том, что запуск ob_get_level() в начале моего script создает уровень 1. php.ini имеет мое значение output_buffering, равное 4096.

Если я запустил что-то вроде:

Затем я могу успешно запустить ob_start() с обратным вызовом ob_gzhandler. Но мне интересно, должно ли это быть проблемой. Во время моего script я делаю вызовы ob_clean() в разных точках, так как я избегаю стекирования слишком большого количества буферов, поскольку я читал, что это может повысить производительность. Я просто не уверен, что я должен здесь делать.

У вас включена буферизация вывода по умолчанию (см. документы) — это означает, что каждый PHP script начинается с ob_start().

Если вы хотите отключить OB по умолчанию для всех скриптов PHP, в вашем php.ini установите output_buffering = Off .

Если вы хотите отключить OB по умолчанию для этого конкретного script, используйте цикл while — это совершенно правильно.

Что касается ob_clean — вы уверены, что хотите удалить вывод, который находится в вашем буфере? ИМО это действительно не нужно, если только вы не видите значительных медленных нагрузок страниц. Не беспокойтесь об оптимизации этого (по крайней мере, не сейчас).

Вопросы по фрагменту исходного кода в Codeigniter 2.2

Я пытаюсь прочитать исходный код CI 2, я запутался в этом
В метод просмотра ядра / класса загрузчика:

Я не могу понять смысл этого фрагмента,

первая:
Комментарий кода говорит, что это для вложенных представлений, но я думаю, что он будет сброшен в следующем случае:

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

2-й: почему мы должны немедленно очистить самый ранний буфер?

Так как в конце они будут автоматически очищены, на самом деле я обнаружил, что в конечном методе рендеринга Output -> _ display () нет ‘ob_end_flush’, что означает, что CI все еще полагается на функцию автоматической очистки, верно?

3-е: Почему состояние текущего уровня ob больше уровня по умолчанию +1?

Если я загружу два вида, второй вид вызовет сброс, верно?

4-е: если здесь вручную сбросить вид, будет ли он все еще корректироваться с помощью Вывод -> _ display ()?

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

Решение

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

Нет. Это произойдет, только если при загрузке одного файла представления другой вызов $this->load->view() называется.

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

2-й: почему мы должны немедленно очистить самый ранний буфер?

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

3-е: Почему состояние текущего уровня ob больше уровня по умолчанию +1?

Я думаю, что ответили. когда ob_get_level() > $this->_ci_ob_level + 1 тогда мы пытаемся позвонить load->view() снова в представлении, которое в настоящее время загружается.

4-е: если здесь вручную сбросить вид, будет ли он все еще корректироваться с помощью Вывод -> _ display ()?

Где это «тут»? Но я думаю, что ответ — нет.

Ob_get_level

Php функции


Php скрипты


ob_get_level

(PHP 4 >= 4.2.0, PHP 5)

ob_get_level — Return the nesting level of the output buffering mechanism

Description

int ob_get_level ( void )

This will return the level of nested output buffering handlers or zero if output buffering is not activated.

User Contributed Notes

Sometimes, ob_get_level () may be off by 1 because at the start of the script, it will return 1 even if ob_start() has never been called (and clearing the output buffer via ob_end_clean () and the like can be done without error). As a result, the first ob_start () will have an ob_get_level () of 2, the second will be 3, and so on.

Илон Маск рекомендует:  Что такое код escape

I’m not sure if this is a PHP 5 thing or possibly because our server is set to gzip all html documents.

Also, up until at least PHP 5.0.4 ( current version), ob_get_level () will always return 0 ins >for output buffers has already done before the destructor is called. If you want to do something with the output buffer from within an object before the script exits, using a callback function with ob_start () is the way to go.
bonzini at gnu dot org
07-Jul-2004 08:03

Even under older PHP, you can dec >if output buffering is active (i.e. ob_get_level () > 0) using

$ob_active = ob_get_length () !== FALSE

Paolo
tit dot petric at nospam dot telemach dot net
22-Jun-2002 11:01

function condor_error( $errno , $errstr , $errfile , $errline )
<
$errors = array (E_USER_ERROR, E_ERROR, E_PARSE);
if ( in_array ( $errno , $errors )) <
while ( ob_get_level ()) <
ob_end_clean ();
>
echo » FATAL [ «. $errno .» ] «. $errstr .»
\n»;
echo «Fatal error at line «. $errline .» of file «. $errfile ;
echo «, PHP «.PHP_VERSION.» («.PHP_OS.»)
\n»;
echo «Aborting.

in case you wanted to use a function to use for deleting all buffered output (to clearly display errors), you have it above

this eliminates the need for ob_end_clean_all() in php. good code :)

Как устроена работа буферизации в php?

Существует 2 вида буферов в php:

  1. Cистемный буфер
  2. Пользовательский буфер

Так могут возникнуть проблемы с работой с буфером. Для работы с системным буфером есть одна единственная функция — flush() . Для работы с пользовательским буфером остальные функции с приставкой ob_ (Функция ob_implicit_flush() — не относится к данному списку, она больше подходит к системному буферу).

Код для демонстрации:

Внимание использована инструкция в файле .htaccess
php_value output_buffering off

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

Код для демонстрации — 2:

Внимание использована инструкция в файле .htaccess
php_value output_buffering 4096

В этом примере мы не увидим кусочный вывод текста мы увидем его только когда исполнится весь код. Даже flush() здесь не поможет. Здесь между прочим используется не только системный, но и пользовательский буфер. Кстати вылезут ошибочки по поводу заголовков. тут конечно я не могу объяснить ситуацию из-за чего. Я в конце выскажу свои предположения и вопросы. stay here.

Код для демонстрации — 3:

Внимание использована инструкция в файле .htaccess
php_value output_buffering 4096

В этом примере информация будет выводиться кусками. Этот пример как вы могли заметить отличается только дополнительной функцией ob_flush() . Она таки высвобождает накопленные данные в системный буфер. Следом вызывается flush() который информацию выводит прямо в браузер. Первый пример кода тому явное подтверждение. В конце будут отправлены ошибки о заголовках, оно и понятно данные были уже отправлены.

Код для демонстрации — 4:

Внимание использована инструкция в файле .htaccess
php_value output_buffering off

Интересно, а для чего я этот код добавил? Никаких флюшей здесь нет, даже функций, которые работают с буфером вывода. Все гораздо проще чем может показаться на первый взгляд. Дело в том что если мы запустим этот код он отработает как надо и выведет ошибки об уже отправленных заголовках. what? Выходит системный буфер не такой и буфер если он вызывает ошибку о заголовках, однако данные выведутся только тогда когда закончится скрипт. Вот так вот.

Эпилог:

Мои суждения:

Т.к существует 2 буфера в php то получается один зависит от другого: чтобы вывести информацию со свежевыпеченного echo, мы должны сначала высвободить информацию с «нашего» буфера в «казенный» php буфер, после этого мы должны вызвать операцию для «казенного» php буфера на вывод.

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

Информация всегда будет попадать в системный буфер хочешь ты того или нет!

Пользовательский буфер — это станция где люди ожидают свой самолет. Системный буфер — это самолет, который вмещает в себя людей. Заголовки — это купленные билеты (Вы же не можете купить билет уже в самолете (Ну по крайней мере я ни разу такого не видел)), если самолет имеет время ожидания вы можете купить билет прямо на станции. Одно без другого жить не может, нет пользовательского буфера — нет времени для покупки билета, нет системного буфера — нет самолета. Выводом буфера будет являться то, когда самолет прибудет на станцию и высадит пассажиров

Вопросы:

Мой второй пример, мне не понятно по какой причине мне в конце работы скрипта php пишет ошибку, по факту flush() не срабатывает ввиду того что мы находимся в пользовательском буфере. (Хотя возможно то что в системном буфере ничего нет и этим вызовом мы уже отправляем заголовки)

Если опять же во втором примере мы заменим flush() => ob_flush() , мы получим ошибки об отправленных заголовках. why? Как я писал есть 2 буфера системный и пользовательский, по логике в системном буфере лежит пользовательский и как вы могли видеть при наличии пользовательского буфера необходимо вызвать 2 флюша, а если у нас имелся только системный то хватало системного флюша.

Если мы в файле .htaccess напишем php_value output_buffering on то размер буфера станет unlimited как сообщает php.ini , отнюдь если мы в скрипте вызовем функцию ob_get_level() то получим 0, если вы запускали код, который я писал выше то могли заметить если у нас буфер был заданного размера то мы получали 1, если мы его удаляли или писали off то он у нас был 0 (хочу заметить я знаю что могут быть вложенные буферы и значение может быть куда выше). собственно почему у нас 0 если размер буфера on?

Переосмысление (ответы на первый, второй и третий вопросы):

Если данные попадают в системный буфер то заголовки будут отправлены, не важно вызвали вы flush() или нет, как следствие — варн об от отправленных заголовках*

Если вы вызовете flush() , но в системный буфер до этого ничего не попадало, это будет означать что данные нужно вывести на экран немедленно из системного буфера, как следствие — отправка заголовков и варн*

Если вы пишите ob_flush() в пользовательском буфере с уровнем echo в системном буфере), то вы получите варн* так как вы пробрасываете содержимое в системный буфер, а как я писал выше системный буфер если видит какие-то выводимые данные он начинает отправлять заголовки, в этом случае происходит то же самое.

Илон Маск рекомендует:  Что такое код gzclose

Если мы в файле .htaccess напишем php_value output_buffering on при вызове phpinfo() в php файле мы увидим в колонке Local Value — on . В итоге у нас буфер 0! Как так? Все просто. Эта директива (output_buffering) не поддерживает такое значение. У этой директивы есть несколько состояний: 0 — выключенный буфер, 1 — безлимитный буфер и любое число. Кроме того если мы напишем текст вроде: on , off , true , false , sampletext — то в Local Value мы увидим подобные значения, но они будут интерпетироваться как 0. Если мы будем писать текст через пробел то получим ошибку 500, например php_value output_buffering hello world .

* Если вы отправляете заголовки после.

** php_value , php_flag , output_buffering — директивы.

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

2 ответа 2

Отвечу только на часть вашего вопроса, по крайней мере на текущий момент.

Ваш комментарий к нему:

Интересно, а для чего я этот код добавил? Никаких флюшей здесь нет, даже функций, которые работают с буфером вывода. Все гораздо проще чем может показаться на первый взгляд. Дело в том что если мы запустим этот код он отработает как надо и выведет ошибки об уже отправленных заголовках. what? Выходит системный буфер не такой и буфер если он вызывает ошибку о заголовках, однако данные выведутся только тогда когда закончится скрипт. Вот так вот.

Так вот. Не совсем понятно, почему вы в этом, четвертом примере решили (если я вас верно понял), почему не должно быть предупреждений насчет заголовков. Так или иначе, вы в любом случае должны послать их самыми первыми, до посыла всяких там текстовых сообщений через echo — банально потому, что именно такого поведения от веб-сервера ожидают браузеры. И php тут просто уведомляет вас, что вы неверно пытаетесь сообщить браузеру что-либо через заголовки.

Для понимания этого стоит обратиться к собственно протоколу HTTP , а именно к его структуре. Ответ веб-сервера в общем случае состоит из трех частей: Starting line , Headers и Message Body . Первое отвечает за тип сообщения, второе за заголовки и третье собственно за то, что получит браузер в качестве ответа.

Соответственно, когда приведенный код выше начинает выполняться, вне зависимости от того, играетесь ли вы с буфером или нет, веб-сервер, который работает с вашим интерпретатором php , будь он apache ‘ем или чем угодно еще, при получении от php первого же текстового сообщения в третьей строке вашего кода (а оно будет первым, данный код же будет выполняться последовательно), сформирует ответ браузеру, который будет состоять из трех перечисленных выше частей. И далее веб-браузер может всего лишь досылать что-либо в Message Body , но заголовки уже будут отправлены.

Другими словами, если вы хотите что-то вывести в заголовках, то вам нужно сформировать их до первого любого вывода в браузер, или же выстроить логику своего приложения каким-либо иным образом, где функция header() не будет использоваться после любой функции, реализующей вывод чего бы то ни было браузеру посредством HTTP .

Как правильно организовать вложенную буферизацию на php?

Как правильно организовать вложенную буферизацию на php и возможно ли такое сделать?

Например есть следующий код:

ob_start();
echo ‘text-1’;

ob_start();
echo ‘text-2’;
$content2 = ob_get_content();
ob_end_clean();

$content1 = ob_get_content();
ob_end_clean();

Так получается почти то, что нужно, только то, что после первого ob_get_content() уже не попадает в буфер.
Есть некая функция ob_get_level(), которая возвращает уровень вложенности, но как получить контент только с определенного уровня непонятно, видать функция чисто информативная.

Решение проблемы длительных операций и интерактивного отображения статуса выполняемой операции в PHP

В процессе работы мы не раз сталкивались с проблемой выбора решения для той или иной задачи. Порой можно, не особо мучаясь, взяться за самый очевидный и распространенный метод как говориться, “решать в лоб”. В большинстве случаев такой подход так или иначе даст результат, но он может затребовать от вас серьезных умственных и временных затрат.

Поэтому в ситуации, когда перед вами стоит нестандартная задача, возможно, стоит отойти от привычных методов, а попробовать рассмотреть несколько вариантов, пусть даже они поначалу кажутся не слишком удачными или к ним просто неохота прибегать, потому что “обычно мы так не делаем”. Тут главное не бояться экспериментировать, потестировать каждый из методов, и наконец, выбрать наиболее подходящий, отвечающий всем вашим запросам и обеспечивающий требуемый результат.

Нам, разработчикам, с такими проблемами приходиться бороться очень часто. Об одной такой сложной и трудоемкой задаче, потребовавшей перебора нескольких подходов к ее решению, и пойдет речь ниже.

Предыстория

На одном из PHP проектов среднего размера возникли проблемы, связанные с выполнением тяжеловесных операций и интерактивном отображении статуса исполняемой операции. Кроме блокировки исполнения других запросов и перехода по другим ссылкам портала пользователь пребывал в неведении и не догадывался, что же происходит в данный момент времени, когда же закончится операция, возможно, произошла ошибка и т.д. Проект изначально носил статус экспериментального, требования к выполняемым фазам часто менялись на лету, изменялись приоритеты и вектор развития системы. Для формирования большего представления хотелось бы описать стек используемых технологий на проекте:

  • MVC Framework CakePHP 2.1 (PHP5.3);
  • MVC Framework CakePHP 2.1 (PHP5.3);
  • MySQL;
  • jQuery, jQuery UI, jQuery plugins;
  • Selenium server, Snoopy server s >В качестве операционной системы была выбрана: CentOS

Выбор фреймворка был обусловлен опытом его использования командой разработчиков, выбор же реляционной СУБД MySQL в качестве data storage является довольно стандартным решением и обусловлено стабильностью и распространенностью использования этой СУБД в качестве “движка” хранения данных.

На этапе проектирования системы сразу было трудно предугадать, что в системе появятся очень “тяжелые” операции, процесс выполнения которых придется пересматривать, реализовывать дополнительные компоненты и в общем перерабатывать архитектуру приложения. К тому же система была неким прототипом, где требования часто менялись, как и то, куда будет расти система в дальнейшем.

На одном из этапов был реализован ряд операций, которые оказались довольно “тяжеловесными” (highweighted operations) и мало того, что они блокировали выполнение других операций в рамках той же сессии, но и вообще процесс перехода по ссылкам системы становился невозможным до тех пор, пока “тяжелая” операция не была завершена. При рассмотрении проблемы на более низком уровне оказалось, что любой запрос блокировал файл сессии при его открытии, соответственно, пока операция не выполниться полностью и процесс не сбросит (flush) сессионные данные в файл сессии и не освободит его, сняв блокировку, другие запросы будут терпеливо ждать в очереди. Действительно, по умолчанию в PHP в качестве механизма хранения сессий используется файл. При открытии сессии срабатывает функция, наподобие fopen(), которая и блокирует файл на чтение и запись для других процессов. Сразу напрашивается решение о смене session storage для снятия блокировки, но поговорим об этом попозже.

Подходы

  1. Разбиение операции на шаги
  2. Ajax Polling
  3. Long Polling
  4. Forever lframe
  5. Streaming
  6. Comet-server
  7. Web-sockets

Коротко рассмотрим каждый из этих подходов для решения задачи выполнения тяжеловесных операций и интерактивного оповещения пользователя о прогрессе выполнения.

Разбиение операции на шаги

Первое что приходит в голову — операцию разделить на шаги. После выполнения очередного шага и отправки ответа браузеру пользователя, он инициирует следующий шаг сам, отправив соответствующий ajax-запрос на сервер.

В выполняемом проекте данный подход оказался не слишком удачным по причине того, что тяжеловесные операции были практически не делимы на шаги. Кроме того использовались сторонние и запущенные на сервере сервисы, для работы с которыми приходилось создавать и подготавливать соответствующие объекты во время исполнения запроса. После исполнения запроса, которые представлял 1 шаг операции, объекты “прибивались”. Возможно стоило подумать о их переиспользовании, но до мы этого не дошли.

Ajax Polling

Следующее решение, которое напрашивается, заключается в запуске операции на сервере и постоянном опросе сервера о статусе выполняемой операции путем посылки серии ajax-запросов через определенные интервалы времени. На клиенте же можно проанализировать такой ответ сервера (например, это может быть JSON, содержащий “message”, “percentage”, “error” и “redirect”) и отрисовать progress-bar, отображающий статус выполнения текущей операции.

Была попытка использования Polling подхода на проекте с двумя разными способами хранения результата выполнения операции:

Хранение результатов выполнения в файле – + .txt

Хранение результатов в БД, в соответствующей таблице – high_weight_operations

Пользователь инициировал выполнение операции с помощью ajax-запроса, после этого клиентский скрипт периодически опрашивал сервер и получал статус и прогресс текущей операции – /operations/get_status/ .

Но мы столкнулись со следующей проблемой: длительная операция стартовала, но блокировала файл сессии, тем самым исключала возможность выполнения параллельных запросов в рамках той же сессии. Иными словами, после запуска длительной операции все запросы, опрашивающие сервер, попадали в очередь и ждали момента, когда основной запрос освободит файл сессии.

Первое решение возникшей проблемы заключалась в освобождении файла сессии. Для этого в PHP предусмотрена функция – session_write_close(), с помощью которой можно закрыть сессию на запись. Действительно, можно запустить операцию, прочесть данные сессии, сделать в них изменения и закрыть сессию на запись.

Но в реалиях проекта, с учетом устоявшейся архитектуры, данное решение применить не удалось. Требовалась запись сессии во многих местах длительной операции. К тому же такое решение нельзя назвать “чистым”, т.к. пользователю, возможно, понадобиться ”попутешествовать” по сайту или запустить еще одну тяжелую операцию параллельно. Поэтому нужна была альтернатива.

Решение заключалось в смене Session Storage, что обеспечивало работу с сессией без блокировки при ее открытии. В качестве нового хранилища сессии можно выбрать один из следующих вариантов:

Для того, чтобы сменить Session Storage в PHP предусмотрена функция – session.save_handler(), которая устанавливает пользовательские функции хранения сессии. Они используются для хранения и получения данных, ассоциированных с сессией. В сети можно найти множество примеров её использования, существуют уже реализованные классы, служащие для переноса сессии в БД или memcached.

Примечание: Для работы функции необходимо установить опцию session.save_handler в значение user в вашем файле конфигурации php.ini.

На проекте в качестве эксперимента было использовано хранение сессий в mysql и mongodb.

Примечание: Если понадобится, чтобы только что записанный в сессию параметр был доступен для других запросов, то сессию необходимо “сбосить (flush)” в mysql или mongodb, чтобы отработала функция записи сессии. Для этого необходимо закрыть её на запись и переоткрыть снова:

После реализации соответствующих компонент, сессия перестала блокироваться и позволила обрабатываться нескольким запросам, ассоциируемых с одной и той же сессией, одновременно. Теперь она не “лочится” ( lock ), как это было с файлами, при открытии файла функцией fopen , плюс ко всему скорость работы сессии значительно возросла.

Примечание: Для использования mongodb в PHP необходимо установить mongodb как сервис, а также драйвер работы на PHP.

Пример установки на CentOS :

  1. Заполнить содержимым (в зависимости от разрядности ОС)

ob_get_status

(PHP 4 >= 4.2.0, PHP 5)

ob_get_status — Get status of output buffers

Описание

ob_get_status() returns status information on either the top level output buffer or all active output buffer levels if full_status is set to TRUE.

Список параметров

TRUE to return all active output buffer levels. If FALSE or not set, only the top level output buffer is returned.

Возвращаемые значения

If called without the full_status parameter or with full_status = FALSE a simple array with the following elements is returned:

If called with full_status = TRUE an array with one element for each active output buffer level is returned. The output level is used as key of the top level array and each array element itself is another array holding status information on one active output level.

The full output contains these additional elements:

Вопросы по фрагменту исходного кода в Codeigniter 2.2

Я пытаюсь прочитать исходный код CI 2, я запутался в этом
В метод просмотра ядра / класса загрузчика:

Я не могу понять смысл этого фрагмента,

первая:
Комментарий кода говорит, что это для вложенных представлений, но я думаю, что он будет сброшен в следующем случае:

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

2-й: почему мы должны немедленно очистить самый ранний буфер?

Так как в конце они будут автоматически очищены, на самом деле я обнаружил, что в конечном методе рендеринга Output -> _ display () нет ‘ob_end_flush’, что означает, что CI все еще полагается на функцию автоматической очистки, верно?

3-е: Почему состояние текущего уровня ob больше уровня по умолчанию +1?

Если я загружу два вида, второй вид вызовет сброс, верно?

4-е: если здесь вручную сбросить вид, будет ли он все еще корректироваться с помощью Вывод -> _ display ()?

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

Решение

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

Нет. Это произойдет, только если при загрузке одного файла представления другой вызов $this->load->view() называется.

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

2-й: почему мы должны немедленно очистить самый ранний буфер?

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

3-е: Почему состояние текущего уровня ob больше уровня по умолчанию +1?

Я думаю, что ответили. когда ob_get_level() > $this->_ci_ob_level + 1 тогда мы пытаемся позвонить load->view() снова в представлении, которое в настоящее время загружается.

4-е: если здесь вручную сбросить вид, будет ли он все еще корректироваться с помощью Вывод -> _ display ()?

Где это «тут»? Но я думаю, что ответ — нет.

Илон Маск рекомендует:  Как заменить текст изображением
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL