Что в действительности делают функции ob_start и ob_gzhandler - PullRequest
3 голосов
/ 15 марта 2012

Я знаю, что ob_start включает буферизацию вывода, но я не до конца понимаю, что это значит. Для меня это означает, что он просто прекращает вывод данных скрипта.

Это правда? Как браузер выводит данные в этом случае, я должен использовать ob_end_flush (), чтобы отключить их в конце?

Поскольку ob_gzhandler сжимает веб-страницы, как браузеры обрабатывают эти страницы?

Я видел ob_start ("gzhandler") в коде, поскольку ob_gzhandler сжимает веб-страницы, что означает ob_start ("gzhandler") и как он применяется к обеим функциям?

Вся помощь приветствуется!

Ответы [ 2 ]

3 голосов
/ 15 марта 2012

Буферизация вывода означает, что вместо записи вашего вывода непосредственно в поток stdout, он вместо этого записывается в буфер.

Затем, когда скрипт завершает работу (или когда вы вызываете ob_end_flush()), содержимое этого буфера записывается в стандартный вывод.

Использование ob_gzhandler преобразует содержимое буфера перед записью его в стандартный вывод, так что он сжимается в gzip. (Браузеры, поддерживающие сжатие gzip, обращаются к противоположному концу, распаковывая содержимое.)

1 голос
/ 15 марта 2012

Хорошо, позвольте мне объяснить это так,

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

Сначала я хочу, чтобы вы посмотрели на эту анимацию.

Запуск операционной системы

Если у вас есть php-скрипт с такой структурой, основанной на уровнях, например, вы можете написать:

Соединение установлено с сервером базы данных.

База данных выбрана: my_database

Запрос данных запущен

Запрос данных завершен (найдено: 200 строк)

...

и т.д.. но если вы не используете буферизацию и очистку вывода, вы увидите эти строки, когда закончится выполнение всего вашего скрипта. Но когда мысль «Я хочу посмотреть, что делает мой сценарий, когда!», Вам сначала нужно ..

Извините, сначала вам нужно установить implicit_flush в значение "on" в вашем файле php.ini и перезапустить сервер apache, чтобы увидеть все это.

во-вторых, вам нужно открыть буферизацию вывода (сокращение "ob") с помощью "ob_start ();", а затем, поместите где-нибудь в вашем коде операторы "echo" и после этого "ob_flush ();" Команды, чтобы увидеть ваш скрипт работает в режиме реального времени.

Позже он также используется для буферизации статического содержимого на основе файлов, например:

  1. поместите ob_start () в начале вашей страницы (или в начале контента, который вы хотите захватить)
  2. поместите ob_end_flush () в конец вашей страницы (или в конец контента, который вы хотите захватить);

  3. затем $ my_var = ob_get_contents (); получить весь вывод HTML, который сервер создает и отправляет клиенту в переменную my_var, а затем использовать его по своему усмотрению. В основном он сохраняется в файл и, проверяя дату последнего изменения файла, используется как статическая буферизация.

Надеюсь, я смогу зажечь ваши мысли.

...