PHP
Uitgangsbuffering
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: £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.