Где находится буфер обмена и что это такое…. Реализация буферизации вывода в PHP. Что такое буфер обмена, на нормальном языке

Эту статью, я хотел бы посвятить вопросу, который волнует многих начинающих пользователей -

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

Что такое буфер обмена, на нормальном языке?

Сначала дам определение, которое дается во всех компьютерных словарях. Буфер обмена — промежуточное хранилище данных, предоставляемое программным обеспечением и предназначенное для переноса или копирования между приложениями или частями одного приложения. Приложение может использовать свой собственный буфер, доступный только в нём, или общий, предоставляемый операционной системой или другой средой через определённый интерфейс.

А теперь объясню своими словами.

Буфер обмена - это невидимая часть памяти, в которое временно сохраняется информация, которую вы скопировали, перед тем, как вставить в нужное место. То есть, вы выделили какой-либо файл(ы), папку(и), текст, или что-нибудь другое, нажали правой кнопкой мыши, после чего нажали на пункт «Копировать» или просто нажали Ctrl+C (горячая клавиша), подробнее читайте .

Они скопировались в невидимую часть

После чего, вы перешли в нужное место, нажали правой кнопкой мыши и выбрали пункт «Вставить» или нажили на клавиатуре комбинацию Ctrl+V.

И теперь, то, что вы скопировали, вставилось туда, куда вам нужно. Вот и все. Надеюсь, вы поняли, где находится буфер обмена - нигде:).

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

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

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

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

Как очистить буфер обмена от скопированных файлов?

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

Многие мастера предлагают, различные программы для этого дела, но есть метод проще. После того, как вы скопировали большой объем информации, из буфера обмена, в то место, в которое вам надо, просто выделите какой-нибудь текст (можно даже одно слово), нажмите правой кнопкой мыши, после «Копировать» или просто нажмите Ctrl+C и все. Тот, огромный по весу файл, удалиться и на его месте появиться маленький кусочек текста, который почти ничего не весит.

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

Дополнение.

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

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

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

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

Где находится буфер обмена в Windows 7 и Vista?

Начну я ответ на данный вопрос не с Windows 7 и Vista, а с XP.

В Windows XP буфер обмена можно было легко найти. Все что вы скопировали, хранилось в файле clipbrd.exe . Путь к нему был такой: Диск C (системный диск) -> папка WINDOWS -> папка system32 -> clipbrd.exe. И если бы вы открыли его, то обнаружили бы в нем тот текст или картинку (или что-либо другое), которую вы скопировали.

Что касается систем Windows 7 и Vista, то там уже файла clipbrd.exe нет, там есть файл clip.exe и если вы попробуете его открыть, то у вас ничего не получиться. Хотя при наведении мышкой на данный файл, высветиться пояснительное окно с описанием, и там будет написано «Clip - копирование данных в буфер обмена». Именно этот файл отвечает в Windows 7 и Vista за буфер обмена, но к нему нет доступа.

Можно конечно скопировать файл clipbrd.exe в папку system32 систем Windows 7 и Vista, в интернете есть много инструкций, но вопрос - зачем?

Во многих статьях о буфере обмена, написано что-то типа - в Windows XP была эта архи важная функция, но по какой-то причине разработчики убрали её. Вопрос к тем, кто кидал разные претензии по этому поводу в комментариях - зачем новичку эта функция? Вопрос, наверняка, ввел многих «умников» в ступор, потому что ответ, скорее всего, будет однозначен - незачем. В итоге, если бы я ответил на вопрос, где находиться буфер обмена, подобным образом, я бы еще больше запутал людей, и вместо ответа у них была бы каша в голове. Однако, если вам вдруг, по какой-либо причине, нужно брать из буфера обмена предыдущие записи, то эта настройка есть в программе Punto Switcher, подробнее о ней вы можете прочитать в данной статье —

Некоторые начинающие пользователи могут спросить - почему же ты сразу нам не сказал, что в Windows XP, буфер , можно «пощупать»? Ответ, я говорил, и не раз - начинающим пользователям, не стоит лишний раз залазить в файл Windows, потому что там находиться все и вся операционной системы. Не дай Бог, вы решите что-то «отредактировать», или случайно удалите что-нибудь «лишнее», то вся работоспособность системы может быть нарушена. Так что как только посмотрите это самый файл clipbrd.exe, сразу же уходите оттуда, чтобы не натворить дел, которые, чаще всего, творятся случайно.

Ну вот и все, надеюсь данная статья будет вам полезной. Всем удачи, пока!

P.S. Все комментарии с нецензурной лексикой были удалены.

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

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

Примечание : Статья написана для начинающих пользователей и поэтому не содержит в себе большую часть технических аспектов.

Что такое буфер обмена и к чему он относится?

Буфер обмена или clipboard - это промежуточное хранилище данных, которое позволяет переносить или копировать данные между частями программ или разными программами. При этом такие хранилища обязательно должны поддерживать три вида операций - копировать, вырезать и вставить. Стоит знать, что буфер обмена хоть и является чисто программной возможностью, то есть это не аппаратное устройство, а программный механизм и у каждой утилиты он может быть свой собственный, чаще всего при словах буфер обмена имеют ввиду именно хранилище операционной системы Windows, которое входит в ее состав по умолчанию.

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

Важная особенность - данные во временном хранилище Windows хранятся до перезагрузки компьютера или выхода из системы.

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

Есть один важный нюанс. Если программа, в которую вы собираетесь вставить данные, не поддерживает какую-то часть, то результат вставки может быть совершенно другим. Рассмотрим простой пример. Опять же скопируйте любую веб-страницу. Откройте блокнот и попытайтесь вставить текст. Вы увидите, что оформления нет, а так же, что все картинки были заменены либо их названиями в подсказках, либо именами файлов. Этот нюанс порой приходится выяснять эмпирическим образом, то есть пробовать.

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

Горячие клавиши для буфера обмена Windows

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

А вот и сами комбинации:

1. "Ctrl + C " - копирование выделенной части во временное хранилище

2. "Ctrl + X " - копирование во временное хранилище и удаление из места, где было скопировано. Стоит понимать, что если программа не поддерживает удаление текста, картинки и прочих объектов, то эта комбинация будет действовать аналогично предыдущей.

3. "Ctrl + V " - вставить данные из буфера обмена в указанное место. Стоит знать, что вы можете вставлять информацию сколько угодно раз, так как вставка не приводит к очищению буфера обмена.

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

  • Перевод

В этой статье я хочу рассказать о том, как реализован слой «буферизации вывода» в PHP, как работает и как с ним взаимодействовать из PHP. В этом слое нет ничего сложного, но многие разработчики либо совсем не понимают, как с ним обращаться, либо не имеют полной ясности. Всё, о чём я буду писать, относится к PHP версии 5.4 и выше. Именно начиная с неё изменились многие вещи, связанные с буфером вывода (БВ). По сути, этот функционал был полностью переписан, поэтому совместимость с версией 5.3 сохранилась лишь частично.

Что такое буфер вывода?

Поток вывода в PHP содержит байты, обычно в виде текста, которые разработчику надо вывести на экран. Чаще всего для этого используется конструкция echo или printf() . Во-первых, нужно понимать, что любая функция, которая что-то выводит, будет использовать БВ из области PHP. Если говорить о расширениях для PHP, то можно получить доступ к функциям, пишущим в SAPI напрямую, в обход любого вышерасположенного БВ. API C задокументировано в lxr.php.net/xref/PHP_5_5/main/php_output.h , отсюда можно почерпнуть немало информации, например, о размере буфера по умолчанию.

Второй важный момент: слой БВ является не единственным слоем, в котором буферизуются выводимые данные.

И третье: в зависимости от SAPI, который вы используете (веб или cli), слой БВ может вести себя по-разному.

Ниже представлена схема, которая поможет понять всё вышесказанное:

Здесь мы видим, что для управления выводимыми данными в PHP используется три логических слоя буферизации. Два из них принадлежат тому самому «буферу вывода», а третий - SAPI. Когда поток вывода покидает область PHP, чтобы попасть на нижний уровень архитектуры, «по пути» могут возникнуть новые буферы: буфер терминала, буфер FastCGI, буфер веб-сервера, буфер операционной системы, буферы стеков TCP/IP. Не забывайте об этом. Хотя в рамках данной статьи мы будем говорить только о PHP, в стеке на пути данных к нижнему слою и пользователю встретится ещё немало программных средств.

Важное замечание относительно CLI SAPI: он отключает в PHP любой буфер вывода по умолчанию, присвоив в ini параметру output_buffering значение 0. Так что, пока вы в CLI не пропишете вручную функции ob_() , по умолчанию все выводимые данные будут напрямую попадать в слой SAPI. Более того, в CLI для параметра implicit_flush жёстко указано значение 1. Суть этого параметра разработчики вечно понимают неправильно, хотя код говорит совершенно недвусмысленно: когда implicit_flush имеет значение 1, буфер слоя SAPI сбрасывается при каждой записи. То есть каждый раз, когда вы записываете данные для вывода с помощью CLI SAPI, они немедленно отправляются на нижний уровень, где записываются в виде stdout, а потом сбрасываются.

Стандартный PHP-слой буферизации вывода

Если вы используете SAPI не так, как CLI, а например, PHP-FPM, то можете поэкспериментировать с тремя параметрами в ini, имеющими отношение к буферу:
  • output_buffering
  • implicit_flush
  • output_handler
Обратите внимание, что использование с ними ini_set() не даст никакого эффекта, поскольку их значения считываются в момент запуска PHP, до того, как он может запустить какой-либо скрипт. Если использовать ini_set() с любым из этих параметров, то он меняет значение, однако оно уже нигде не будет использоваться. Слишком поздно - слой БВ уже запущен и активен. Изменить эти параметры можно, отредактировав php.ini или применив ключ –d к бинарнику PHP.

По умолчанию в php.ini, идущем в составе поставки PHP, output_buffering присвоено значение «4096» (байт). Если вы не используете php.ini (или запускаете PHP с ключом –n ), то значением по умолчанию будет «0», то есть отключено. Если захардкодить значение «On», то будет назначен стандартный размер буфера вывода (16 КБ).

Как вы уже, наверное, догадались, использование буфера для вывода в веб-окружении благотворно влияет на производительность. Начальных 4 КБ вполне достаточно, ведь это означает, что вы можете записать до 4096 ASCII-символов, пока PHP не начнёт взаимодействовать с нижерасположенным слоем SAPI. В условиях веба отправка данных побайтно, напротив, производительность не улучшает. Гораздо лучше, если сервер отправляет весь контент скопом или большими частями. Чем реже уровни обмениваются данными, тем лучше с точки зрения производительности. Поэтому обязательно используйте буфер вывода. PHP отправит его содержимое в конце запроса и вам для этого ничего не придётся делать.

В предыдущей главе я упоминал об implicit_flush в контексте CLI. В случае с любым другим SAPI implicit_flush изначально отключён. Это хорошо, поскольку вряд ли вы будете приветствовать сброс SAPI сразу же после записи в него. Для протокола FastCGI сброс можно сравнить с завершением и отправкой пакета после каждой записи. Однако лучше сначала полностью заполнить буфер FastCGI, а уже потом слать пакеты. Если вам нужно вручную сбросить буфер SAPI, используйте для этого PHP-функцию flush() . Для сброса после каждой записи, как уже говорилось выше, можно использовать параметр implicit_flush в php.ini. Как вариант - однократный вызов PHP-функции ob_implicit_flush() .

К содержимому буфера до его вывода можно применять callback output_handler . Вообще, благодаря расширениям PHP нам доступно немало callback-ов (пользователи тоже могут их писать, об этом я расскажу в следующей главе).

  • ob_gzhandler: компрессия вывода с помощью ext/zlib
  • mb_output_handler: перевод кодировки символов с помощью ext/mbstring
  • ob_iconv_handler: перевод кодировки символов с помощью ext/iconv
  • ob_tidyhandler: очистка вывода HTML с помощью ext/tidy
  • ob__handler: компрессия вывода с помощью ext/http
  • ob_etaghandler: автоматическая генерация заголовков ETag с помощью ext/http

Вы можете использовать только один callback, который получит содержимое буфера и сделает полезные преобразования для вывода, что не может не радовать. Для анализа данных, которые PHP отправляет веб-серверу, а тот отсылает пользователю, полезно использовать callback-и буфера вывода. Кстати, под «выводом» я подразумеваю как заголовок, так и тело. HTTP-заголовки тоже являются частью слоя буферизации вывода.

Тело и заголовки

Когда вы используете буфер вывода (неважно, пользовательский или один из стандартных), то можете отправлять HTTP-заголовки и содержимое как угодно. Любой протокол требует сначала отсылать заголовок, а уже потом тело, но за вас это сделает сам PHP, если вы используете слой БВ. Любая PHP-функция, работающая с заголовками (header(), setcookie(), session_start() ), фактически использует внутреннюю функцию sapi_header_op(), которая просто заполняет буфер заголовков. Если после этого записать выводимые данные, например, с помощью printf() , то они запишутся в один из соответствующих буферов вывода. И во время отправки буфера PHP сначала

Отсылает заголовки, а уже потом тело. Если вам не нравится такая забота со стороны PHP, то придётся вообще отключить слой БВ.

Пользовательские буферы вывода

Давайте разберём на примерах, как это работает, и что вы можете сделать. Имейте в виду, что если вы хотите использовать стандартный PHP-слой буферизации, то не сможете воспользоваться CLI, поскольку он отключается как слой.

Ниже приведён пример работы со стандартным PHP-слоем с помощью внутреннего веб-сервера SAPI:

/* запущено так: php -doutput_buffering=32 -dimplicit_flush=1 -S127.0.0.1:8080 -t/var/www */ echo str_repeat("a", 31); sleep(3); echo "b"; sleep(3); echo "c";

Мы запустили PHP со стандартным буфером вывода на 32 байта, после чего сразу же записали в него 31 байт, пока не включилась задержка исполнения. Экран чёрный, пока ничего не отправлено. Затем действие sleep() заканчивается, и мы записываем ещё один байт, тем самым полностью заполняя буфер. После этого он сразу же сбрасывает себя в буфер слоя SAPI, а тот сбрасывает себя в вывод, поскольку implicit_flush имеет значение 1. На экране появляется строка aaaaaaaaaa{31 раз}b , после чего опять начинает действовать sleep() . По его завершении пустой 31-байтный буфер заполняется одним-единственным байтом, после чего PHP завершается и сбрасывает буфер. На экране появляется с .

Так выглядит работа стандартного PHP-буфера без вызова каких-либо ob-функций. Не забудьте, что это именно стандартный буфер, то есть он уже имеется в наличии (только нельзя использовать CLI).

Теперь с помощью ob_start() можно запускать пользовательские буферы, причем столько, сколько нужно, пока память не закончится. Каждый буфер будет помещаться за предыдущим и немедленно сбрасываться в следующий, что постепенно приведёт к переполнению.

Ob_start(function($ctc) { static $a = 0; return $a++ . "- " . $ctc . "\n";}, 10); ob_start(function($ctc) { return ucfirst($ctc); }, 3); echo "fo"; sleep(2); echo "o"; sleep(2); echo "barbazz"; sleep(2); echo "hello"; /* 0- FooBarbazz\n 1- Hello\n */

Устройство буферизации вывода

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

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

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

#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_ini.h" #include "main/php_output.h" #include "php_myext.h" static int myext_output_handler(void **nothing, php_output_context *output_context) { char *dup = NULL; dup = estrndup(output_context->in.data, output_context->in.used); php_strtoupper(dup, output_context->in.used); output_context->out.data = dup; output_context->out.used = output_context->in.used; output_context->out.free = 1; return SUCCESS; } PHP_RINIT_FUNCTION(myext) { php_output_handler *handler; handler = php_output_handler_create_internal("myext handler", sizeof("myext handler") -1, myext_output_handler, /* PHP_OUTPUT_HANDLER_DEFAULT_SIZE */ 128, PHP_OUTPUT_HANDLER_STDFLAGS); php_output_handler_start(handler); return SUCCESS; } zend_module_entry myext_module_entry = { STANDARD_MODULE_HEADER, "myext", NULL, /* Function entries */ NULL, NULL, /* Module shutdown */ PHP_RINIT(myext), /* Request init */ NULL, /* Request shutdown */ NULL, /* Module information */ "0.1", /* Replace with version number for your extension */ STANDARD_MODULE_PROPERTIES }; #ifdef COMPILE_DL_MYEXT ZEND_GET_MODULE(myext) #endif

Подводные камни

По большей части они задокументированы, некоторые из них вполне очевидны, а некоторые не слишком. К очевидным можно отнести, например, то, что не следует вызывать какие-либо функции буфера изнутри callback-а БВ, также как и записывать выводимые оттуда данные.

К неочевидным подводным камням можно отнести то, что некоторые функции PHP используют внутренний БВ для самих себя, заполняя его, а затем сбрасывая или возвращая. При этом следующий буфер ставится в стек. К подобным функциям относятся print_r(), highlight_file() и SoapServer::handle() . Не следует использовать их изнутри callback-а БВ – это может привести к непредсказуемым последствиям.

Заключение

Слой вывода можно сравнить со своеобразной сетью, которая улавливает любые возможные «утечки» вывода из PHP и сохраняет их в буфере заданного размера. Когда буфер заполняется, он сбрасывается (записывается) в нижний уровень, если таковой есть. Как минимум в самый нижний из имеющихся - в буфер SAPI. Пользователи могут управлять количеством буферов, их размером и операциями, которые могут быть разрешены в каждом слое буфера (очистка, сброс или удаление). Это очень гибкий инструмент, позволяющий, например, создателям библиотек и фреймворков полностью контролировать поток вывода, направляя его в глобальный буфер и обрабатывая там. При этом PHP сам регулирует порядок отправки заголовков и потока вывода.

По умолчанию имеется один буфер вывода, управляемый тремя настройками в ini-файле. Он устроен так, чтобы реже осуществлять операции записи и не слишком часто обращаться к слою SAPI, а значит и к сети. Это сделано для улучшения общей производительности. Также расширения PHP могут декларировать callback-и, запускаемые в каждом буфере - например, для компрессии данных, замены строк, управления HTTP-заголовками и многих других операций.

Зачем нужна буферизация вывода в PHP? Что это такое? Как ее реализовать? Ответы на эти вопросы вы найдете в нашей статье. Сейчас мы детально рассмотрим практическое применение php буферизации и посмотрим реальные примеры. Как и во всяком деле поставим для себя цели и будем их достигать понемногу:

Слово буферизация говорит само за себя, это значит, что мы что-то копируем, помещаем в буфер. В php, буферизация позволяет скопировать определенную часть выводимого контента (html) в браузер, обработать ее нужными нам функциями и показать его пользователю. Зачем это нам? Например, можно реализовать , или замены некоторых сущностей на другие, да что угодно. Более детально рассмотрим применение php буферизации в последнем пункте статьи.

Реализация буферизации вывода в PHP

Буферизация начинается с функции ob_start();. После ее объявления буферизироваться будет все, что выводится в окно браузера. Аргумент callback это пользовательская функция, через которую можно пропустить и обработать выводимый текст, она должна возвращать одну строку.

ob_end_clean(); - завершает буферизацию и чистит буфер, но в браузер ничего не посылается.

Существует много функций для работы с буферизацией вывода в php. Сейчас посмотрим маленький практический пример для большей ясности дела. Например, у Вас генерируется страница, но при этом необходимо в тексте страницы заменить все буквы "ё" на буквы "е. Тогда делается примерно такое:

генерируется страница;

$page = ob_get_contents();

$page = str_replace("ё", "е", $page);

Применение буферизации вывода

Рассмотрим некоторые практические стороны применения буферизации вывода. Как уже упоминалось, предположительно мы имеем часть выводимого html кода или весь выводимый код. Что же с ним можно сделать?

Реализация автообновления на вашем сайте.

Обновление в смысле обновление контента. Посмотрев лекции Каширина, я узнал, что для того, что-бы страничка сайта была обновляемой в глазах поискового робота, необходимо, что-бы 25% содержимого страницы поменялось коренным образом. В начале, я просто создавал блок анонса, который выводил 25% символов от статьи, блок был одним и тем же на всех страницах, обновлялся 1 раз в сутки, выбирался случайным образом из массы всех статей. Он выглядел таким образом:

Но здесь была проблемка, одна статья была на 1500 символов, другая на 10000 символов, и если анонсом выбиралась та, что на 10000 символов, и анонс отображался на той статье в которой 1500 символов, то получалось что блок анонса составлял 5000 символов, это гораздо больше, нежели сама статья. Может, вы думаете, что нужно было, узнать количество символов исходной статьи и вывести в 4 раза меньше в анонсе. Я тоже так думал, но есть еще много факторов, таких как комментарии, новости сайта… В общем, нужно было знать количество символов всей странички, в этом мне помогла php буферизация или php буферизация вывода, называйте как хотите. Ниже код как я это реализовал.

// Текст странички после … в общем вся страница до того места где нужно вставить блок анонса

В файле anons.php, узнаем количество символов контента страницы без html тегов используя функции strip_tags() и strlen(). Далее дело техники, вычисляем блок анонса, его html код пишем в $show_anons и прицепляем после буферизированного контента ($buffer). Вот так вот мне помогла буферизация вывода в php. Ниже, скриншоты блока анонса, написанного с помощью использования php буферизации.

Вполне приличные блоки анонсов. Автообновление странички организовано, кричу УРА php буферизации.

Сжатие html кода

Об этом у меня есть отдельно написанная статья: , но я предоставлю пример php кода, в нем тоже используется PHP буферизация.

[^S ]+/s","/[^S ]+","<","1"); return preg_replace($i, $ii, $compress); } ?>

Другие варианты

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