Zoeken…


parameters

Functie Details
ob_start () Hiermee start u de uitvoerbuffer. Alle hierna geplaatste uitvoer wordt vastgelegd en niet weergegeven
ob_get_contents () Retourneert alle inhoud vastgelegd door ob_start()
ob_end_clean () Hiermee maakt u de uitvoerbuffer leeg en schakelt u deze uit voor het huidige nestniveau
ob_get_clean () Triggers zowel ob_get_contents() en ob_end_clean()
ob_get_level () Retourneert het huidige nestniveau van de uitvoerbuffer
ob_flush () Spoel de inhoudsbuffer en verzend deze naar de browser zonder de buffer te beëindigen
ob_implicit_flush () Maakt impliciet doorspoelen na elke uitvoeroproep mogelijk.
ob_end_flush () Spoel de inhoudsbuffer en verzend deze naar de browser die ook de buffer beëindigt

Basisgebruik krijgt inhoud tussen buffers en clearing

Met outputbuffering kunt u alle tekstuele inhoud (tekst, HTML ) in een variabele opslaan en naar de browser verzenden als één stuk aan het einde van uw script. Standaard verzendt php uw inhoud zoals deze wordt geïnterpreteerd.

<?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>"

Alle inhoud die tussen ob_start() en ob_get_clean() wordt uitgevoerd, wordt vastgelegd en in de variabele $content .

Calling ob_get_clean() activeert zowel ob_get_contents() en ob_end_clean() .

Geneste uitvoerbuffers

U kunt uitvoerbuffers nesten en het niveau ophalen voor verschillende inhoud met behulp van de functie 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--;
}

uitgangen:

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

De uitvoerbuffer vastleggen om later opnieuw te gebruiken

In dit voorbeeld hebben we een array met enkele gegevens.

We vangen de uitvoerbuffer in $items_li_html en gebruiken deze twee keer op de pagina.

<?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>

Bewaar de bovenstaande code in een bestand output_buffer.php en voer het uit via php output_buffer.php .

Je zou de 2 lijstitems die we hierboven hebben gemaakt moeten zien met dezelfde lijstitems die we in PHP hebben gegenereerd met behulp van de uitvoerbuffer:

<!-- 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>

Uitvoerbuffer uitvoeren vóór inhoud

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>

In dit voorbeeld gaan we ervan uit dat $users een multidimensionale array zijn, en we lopen er doorheen om alle gebruikers met een toegangsniveau van 7 te vinden.

Als er geen resultaten zijn, verwijzen we naar een foutpagina.

We gebruiken de uitvoerbuffer hier omdat we een header() -omleiding activeren op basis van het resultaat van de lus

Uitvoerbuffer gebruiken om inhoud in een bestand op te slaan, handig voor rapporten, facturen, enz

<?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);

In dit voorbeeld wordt het volledige document genomen en naar het bestand geschreven. Het wordt niet in de browser uitgevoerd, maar met echo $html;

Verwerking van de buffer via een callback

U kunt elke vorm van extra verwerking op de uitvoer toepassen door een opvraagbaar door te ob_start() aan 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();
*/

Output:

<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>

Stream output naar client

/**
 * 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();
}

Typisch gebruik en redenen voor het gebruik van ob_start

ob_start is vooral handig als je omleidingen op je pagina hebt. De volgende code werkt bijvoorbeeld niet:

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

De fout die wordt gegeven, is zoiets als: headers already sent by <xxx> on line <xxx> .

Om dit probleem op te lossen, zou je zoiets aan het begin van je pagina moeten schrijven:

<?php
  ob_start();
?>

En zoiets aan het einde van uw pagina:

<?php
  ob_end_flush();
?>

Hiermee wordt alle gegenereerde inhoud in een uitvoerbuffer opgeslagen en in één keer weergegeven. Als u omleidingsoproepen op uw pagina heeft, worden deze geactiveerd voordat er gegevens worden verzonden, waardoor de kans bestaat dat een headers already sent foutmelding hebben ontvangen.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow