Влияет ли ob_start на производительность файлов, хранящихся в CDN? - PullRequest
4 голосов
/ 30 марта 2012

Я использую объектную буферизацию для буферизации вывода моих php-страниц, используя ob_start('ob_gzhandler');. Влияет ли это на производительность файлов, хранящихся в CDN?

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

Не могли бы вы уточнить?

Ответы [ 4 ]

8 голосов
/ 30 марта 2012

Использование ob_start определенно повлияет на время загрузки ваших страниц - , а не"производительность вашего скрипта PHP", что, на мой взгляд, полностью вводит в заблуждение.Но давайте начнем с самого начала.

Время загрузки, воспринимаемое пользователем

Упоминаемая вами сторона, похоже, относится к времени загрузки страницы в восприятии пользователя .То есть, предположим, что у вас есть 10 КБ HTML для отправки, и вы отправляете 1 КБ каждые 50 мс.Также предположим, что браузер не использует свою собственную логику в процессе, и он просто рендерит так быстро, как может читать входящие данные (, что, безусловно, неверно! ).50 мс достаточно для восприятия человеком, поэтому пользователь будет видеть загрузку страницы по частям.

С другой стороны, предположим, что все 10 КБ HTML отправляются за один раз после 500 мс.Хотя это приведет к тому, что пользователь будет ждать одинаковое общее количество времени, страница будет отображаться одним махом, и пользователь будет воспринимать это как быстрее , поскольку "он потратил меньше времени на загрузку".

Я должен также упомянуть, что если вы возьмете тот же самый пример и увеличите время загрузки до 5 секунд (или 10 частей по 0,5 секунды), тогда восприятие пользователя будет изменено на противоположное: теперь вторая страница медленнее потому что "потребовалось так много времени, чтобы начать работу".

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

Буферизация вывода

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

Теперь, если вы выполняете буферизацию нана стороне сервера вы действительно заставляете браузер адаптировать к вашему представлению о том, как все должно работать.Давайте вернемся к примеру рендеринга на стороне клиента и рассмотрим браузер, который получает HTML небольшими порциями , но решает отложить рендеринг для того, чтобы он отображался быстрее .Это не означает, что браузер должен делать ничего во время задержки;на самом деле, он, скорее всего, проанализирует HTML и сразу начнет загружать зависимости (таблицы стилей, изображения и т. д.), даже если пока не намеревается отображать страницу.Это логично: если быть открытым, то в конечном итоге содержимое этих ресурсов будет доступно раньше, и вы выиграете войну с «предполагаемой скоростью».

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

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

TL; версия DR

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

2 голосов
/ 30 марта 2012

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

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

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

Другое преимущество заключается в том, что он позволяет вам создавать свою собственную систему кэширования.

Iне знаю, что вы используете CDN, но если он предназначен для хранения изображений, он не зависит от php-буферизации.

1 голос
/ 17 января 2017

Этот ответ не предназначен для объяснения того, что делает ob_start, это всего лишь тест

Я только что провел некоторый тест с моим собственным веб-сайтом, который загружает более или менее 70 файлов PHP на запрос и выполняет MySQL Query

 Size|Finish|DOM Loaded|Load

 //Procedural output
 16 KB 543 ms 440 ms 544 ms
 --    598 ms 465 ms 599 ms
 --    604 ms 469 ms 604 ms
 --    598 ms 474 ms 599 ms
 --    595 ms 465 ms 596 ms
 --    595 ms 465 ms 596 ms

 //echo ob_get_clean();
 --    1140 ms 740 ms 1140 ms
 --    852 ms 654 ms 853 ms
 --    7xx ms 5xx ms 7xx ms
 --    8xx ms 6xx ms 8xx ms
 --    7xx ms 5xx ms 7xx ms
 --    8xx ms 6xx ms 8xx ms

В моем случае это сильно влияет на время загрузки (PHP 7.1)

0 голосов
/ 30 марта 2012

Использование ob_start() не повлияет на производительность при использовании CDN.CDN доставит ваш контент, как только получит его с вашего сайта.Тот факт, что вы используете ob_start() будет прозрачным.Тот факт, что вы используете ob_gzhandler, будет виден CDN, но не повлияет на его собственную производительность.

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

...