Поиск…


параметры

функция подробности
ob_start () Запускает выходной буфер, любой вывод, размещенный после этого, будет снят и не будет отображаться
ob_get_contents () Возвращает весь контент, захваченный ob_start()
ob_end_clean () Опорожняет выходной буфер и отключает его для текущего уровня вложенности
ob_get_clean () Триггеры: ob_get_contents() и ob_end_clean()
ob_get_level () Возвращает текущий уровень вложенности выходного буфера
ob_flush () Сбросьте буфер содержимого и отправьте его в браузер без завершения буфера
ob_implicit_flush () Включает скрытую промывку после каждого выходного вызова.
ob_end_flush () Сбросьте буфер содержимого и отправьте его в браузер, также закончив буфер

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

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

<?php

// Turn on output buffering
ob_start();

// Print some output to the buffer (via php)
print 'Hello ';

// You can also `step out` of PHP
?>
<em>World</em>
<?php
// Return the buffer AND clear it
$content = ob_get_clean();

// Return our buffer and then clear it
# $content = ob_get_contents();
# $did_clear_buffer = ob_end_clean();

print($content);

#> "Hello <em>World</em>"

Любое содержимое, выводимое между ob_start() и ob_get_clean() будет захвачено и помещено в переменную $content .

Вызов ob_get_clean() вызывает как ob_get_contents() и ob_end_clean() .

Вложенные выходные буферы

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

<?php

$i = 1;
$output = null;

while( $i <= 5 ) {
    // Each loop, creates a new output buffering `level`
    ob_start();
    print "Current nest level: ". ob_get_level() . "\n";
    $i++;
}

// We're at level 5 now
print 'Ended up at level: ' . ob_get_level() . PHP_EOL;

// Get clean will `pop` the contents of the top most level (5)
$output .= ob_get_clean();
print $output;

print 'Popped level 5, so we now start from 4' . PHP_EOL;

// We're now at level 4 (we pop'ed off 5 above)

// For each level we went up, come back down and get the buffer
while( $i > 2 ) {
    print "Current nest level: " . ob_get_level() . "\n";
    echo ob_get_clean();
    $i--;
}

Выходы:

Current nest level: 1
Current nest level: 2
Current nest level: 3
Current nest level: 4
Current nest level: 5
Ended up at level: 5
Popped level 5, so we now start from 4
Current nest level: 4
Current nest level: 3
Current nest level: 2
Current nest level: 1

Захват выходного буфера для повторного использования позже

В этом примере у нас есть массив, содержащий некоторые данные.

Мы $items_li_html выходной буфер в $items_li_html и дважды используем его на странице.

<?php

// Start capturing the output
ob_start();

$items = ['Home', 'Blog', 'FAQ', 'Contact'];

foreach($items as $item):

// Note we're about to step "out of PHP land"
?>
  <li><?php echo $item ?></li>
<?php
// Back in PHP land
endforeach;

// $items_lists contains all the HTML captured by the output buffer
$items_li_html = ob_get_clean();
?>

<!-- Menu 1: We can now re-use that (multiple times if required) in our HTML. -->
<ul class="header-nav">
    <?php echo $items_li_html ?>
</ul>

<!-- Menu 2 -->
<ul class="footer-nav">
    <?php echo $items_li_html ?>
</ul>

Сохраните приведенный выше код в файле output_buffer.php и запустите его через php output_buffer.php .

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

<!-- Menu 1: We can now re-use that (multiple times if required) in our HTML. -->
<ul class="header-nav">
  <li>Home</li>
  <li>Blog</li>
  <li>FAQ</li>
  <li>Contact</li>
</ul>

<!-- Menu 2 -->
<ul class="footer-nav">
  <li>Home</li>
  <li>Blog</li>
  <li>FAQ</li>
  <li>Contact</li>
</ul>

Запуск выходного буфера перед любым контентом

ob_start();

$user_count = 0;
foreach( $users as $user ) {
    if( $user['access'] != 7 ) { continue; }
    ?>
    <li class="users user-<?php echo $user['id']; ?>">
        <a href="<?php echo $user['link']; ?>">
            <?php echo $user['name'] ?>
        </a>
    </li>
<?php
    $user_count++;
}
$users_html = ob_get_clean();

if( !$user_count ) {
    header('Location: /404.php');
    exit();
}
?>
<html>
<head>
    <title>Level 7 user results (<?php echo $user_count; ?>)</title>
</head>

<body>
<h2>We have a total of <?php echo $user_count; ?> users with access level 7</h2>
<ul class="user-list">
    <?php echo $users_html; ?>
</ul>
</body>
</html>

В этом примере мы предполагаем, что $users является многомерным массивом, и мы прокручиваем его, чтобы найти всех пользователей с уровнем доступа 7.

Если результатов нет, мы перенаправляем страницу ошибки.

Мы используем выходной буфер здесь, потому что мы запускаем перенаправление header() на основе результата цикла

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

<?php
ob_start();
?>
    <html>
    <head>
        <title>Example invoice</title>
    </head>
    <body>
    <h1>Invoice #0000</h1>
    <h2>Cost: &pound;15,000</h2>
    ...
    </body>
    </html>
<?php
$html = ob_get_clean();

$handle = fopen('invoices/example-invoice.html', 'w');
fwrite($handle, $html);
fclose($handle);

Этот пример берет полный документ и записывает его в файл, он не выводит документ в браузер, но с помощью echo $html;

Обработка буфера с помощью обратного вызова

Вы можете применить любую дополнительную обработку к выходу, передав вызов ob_start() .

<?php
function clearAllWhiteSpace($buffer) {
    return str_replace(array("\n", "\t", ' '), '', $buffer);
}

ob_start('clearAllWhiteSpace');
?>
<h1>Lorem Ipsum</h1>

<p><strong>Pellentesque habitant morbi tristique</strong> senectus et netus et malesuada fames ac turpis egestas. <a href="#">Donec non enim</a> in turpis pulvinar facilisis.</p>

<h2>Header Level 2</h2>

<ol>
   <li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li>
   <li>Aliquam tincidunt mauris eu risus.</li>
</ol>

<?php
/* Output will be flushed and processed when script ends or call
     ob_end_flush();
*/

Выход:

<h1>LoremIpsum</h1><p><strong>Pellentesquehabitantmorbitristique</strong>senectusetnetusetmalesuadafamesacturpisegestas.<ahref="#">Donecnonenim</a>inturpispulvinarfacilisis.</p><h2>HeaderLevel2</h2><ol><li>Loremipsumdolorsitamet,consectetueradipiscingelit.</li><li>Aliquamtinciduntmauriseurisus.</li></ol>

Поток для клиента

/**
 * Enables output buffer streaming. Calling this function
 * immediately flushes the buffer to the client, and any
 * subsequent output will be sent directly to the client.
 */
function _stream() {
    ob_implicit_flush(true);
    ob_end_flush();
}

Типичное использование и причины использования ob_start

ob_start особенно удобен, когда у вас есть перенаправления на вашей странице. Например, следующий код не будет работать:

Hello!
<?php
  header("Location: somepage.php");
?>

Ошибка, которая будет указана, выглядит примерно так: headers already sent by <xxx> on line <xxx> .

Чтобы исправить эту проблему, вы должны написать что-то вроде этого в начале своей страницы:

<?php
  ob_start();
?>

И что-то вроде этого в конце вашей страницы:

<?php
  ob_end_flush();
?>

Это сохраняет все сгенерированное содержимое в выходной буфер и отображает его за один раз. Следовательно, если у вас есть какие-либо вызовы перенаправления на вашей странице, они будут запускаться до того, как будут отправлены какие-либо данные, что исключает возможность появления headers already sent ошибок.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow