Что такое «Output Buffer» в PHP и его использование / преимущества? Это похоже на буфер обмена? [Дубликат]

Js - однопоточная.

Браузер можно разделить на три части:

1) Event Loop

2 ) Web API

3) Очередь событий

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

Теперь давайте подумаем, что мы поставили две функции в очереди, чтобы получить данные с сервера, а другой использует эти данные. Мы сначала нажали функцию serverRequest () в очереди, а затем применили функцию Data () , Функция serverRequest переходит в цикл событий и делает вызов на сервер, так как мы никогда не знаем, сколько времени потребуется для получения данных с сервера, поэтому ожидается, что этот процесс займет много времени, и поэтому мы заняли наш цикл событий, тем самым повесив нашу страницу, вот где Web API входит в эту роль, он принимает эту функцию из цикла событий и обращается к серверу, создающему цикл событий, так что мы можем выполнить следующую функцию из очереди. Следующая функция в очереди - useData (), которая идет в цикле, но из-за отсутствия данных отходы и выполнение следующей функции продолжаются до конца очереди (это называется Async-вызовом, то есть мы можем сделать что-то еще, пока не получим данные)

Предположим, что наша функция serverRequest () имела оператор возврата в код, когда мы возвращаем данные с сервера Web API, будет выталкивать его в очередь в конце очереди. По мере того, как он заканчивается в очереди, мы не можем использовать его данные, поскольку в нашей очереди нет функции, чтобы использовать эти данные. Таким образом, невозможно вернуть что-то из Async Call.

Таким образом, решение этой проблемы callback или обещают .

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

 function doAjax(callbackFunc, method, url) {
  var xmlHttpReq = new XMLHttpRequest();
  xmlHttpReq.open(method, url);
  xmlHttpReq.onreadystatechange = function() {

      if (xmlHttpReq.readyState == 4 && xmlHttpReq.status == 200) {
        callbackFunc(xmlHttpReq.responseText);
      }


  }
  xmlHttpReq.send(null);

}

В моем коде он называется

function loadMyJson(categoryValue){
  if(categoryValue==="veg")
  doAjax(print,"GET","http://localhost:3004/vegetables");
  else if(categoryValue==="fruits")
  doAjax(print,"GET","http://localhost:3004/fruits");
  else 
  console.log("Data not found");
}

Прочитайте здесь новые методы в ECMA (2016/17) для создания асинхронного вызова (@Felix Kling Answer сверху) https://stackoverflow.com/a/14220323/7579856

174
задан Trilarion 25 February 2015 в 21:17
поделиться

5 ответов

Буферизация вывода для веб-разработчиков, руководство для начинающих :

Без буферизации вывода (по умолчанию) ваш HTML отправляется в браузер в виде процессов PHP через ваш скрипт. С буферизацией вывода ваш HTML хранится в переменной и отправляется в браузер как одна часть в конце вашего скрипта.

Преимущества буферизации вывода для веб-разработчиков

  • Включение только буферизации вывода уменьшает время, затрачиваемое на загрузку и визуализацию нашего HTML-кода, поскольку оно не отправляется в браузер, поскольку PHP обрабатывает HTML.
  • Все фантазии, которые мы можем сделать с PHP strings, теперь мы можем сделать с нашей всей HTML-страницей как одну переменную.
  • Если вы когда-либо сталкивались с сообщением «Предупреждение: невозможно изменить информацию заголовка - заголовки, уже отправленные (вывод)» при настройке файлов cookie, вы будете счастливы узнать, что буферизация вывода - ваш ответ.
232
ответ дан HamZa 28 August 2018 в 21:11
поделиться

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

Вот один очень хороший учебник для темы

4
ответ дан nik 28 August 2018 в 21:11
поделиться

Буферизация вывода используется PHP для повышения производительности и выполнения нескольких трюков.

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

Рассмотрим этот пример:

<?php
    ob_start( );
    phpinfo( );
    $output = ob_get_clean( );
?>

пример захватывает вывод в переменную, а не отправляет ее в браузер. output_buffering отключен по умолчанию.

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

Рассмотрим этот пример:

<?php
    ob_start( );
    echo "Hello World";
    if ( $some_error )
    {
        header( "Location: error.php" );
        exit( 0 );
    }
?>
54
ответ дан Salman A 28 August 2018 в 21:11
поделиться

Функции Output Control позволяют вам контролировать, когда вывод отправляется из сценария. Это может быть полезно в нескольких разных ситуациях, особенно если вам нужно отправить заголовки в браузер после того, как ваш скрипт начал выводить данные. Функции управления выходом не влияют на заголовки, отправленные с помощью header () или setcookie (), только такие функции, как echo () и данные между блоками PHP-кода.

http: / /php.net/manual/en/book.outcontrol.php

Дополнительные ресурсы:

Буферизация вывода с помощью PHP

9
ответ дан Sarfraz 28 August 2018 в 21:11
поделиться
ob_start();  // turns on output buffering
$foo->bar();  // all output goes only to buffer
ob_clean();  // delete the contents of the buffer, but remains buffering active
$foo->render(); // output goes to buffer
ob_flush(); // send buffer output
$none = ob_get_contents();  // buffer content is now an empty string
ob_end_clean();  // turn off output buffering

Буферы могут быть вложенными, поэтому, когда один буфер активен, другой объект ob_start () активирует новый буфер. Таким образом, ob_end_flush () и ob_flush () на самом деле не отправляют буфер на выход, а в родительский буфер. И только тогда, когда нет родительского буфера, содержимое отправляется в браузер или терминал.

Симпатично объяснено здесь: https://phpfashion.com/everything-about-output-buffering-in-php

0
ответ дан sudip 28 August 2018 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: