PHP
Utgångsbuffring
Sök…
parametrar
Fungera | detaljer |
---|---|
ob_start () | Startar utgångsbufferten, alla utskrifter som placeras efter detta kommer att fångas och visas inte |
ob_get_contents () | Returnerar allt innehåll som fångats av ob_start() |
ob_end_clean () | Tömmer utgångsbufferten och stänger av den för den nuvarande häckningsnivån |
ob_get_clean () | Utlöser både ob_get_contents() och ob_end_clean() |
ob_get_level () | Returnerar den nuvarande häckningsnivån för utgångsbufferten |
ob_flush () | Spola innehållsbufferten och skicka den till webbläsaren utan att avsluta bufferten |
ob_implicit_flush () | Aktiverar implicit spolning efter varje utgångssamtal. |
ob_end_flush () | Spola innehållsbufferten och skicka den till webbläsaren som också slutar bufferten |
Grundläggande användning för att få innehåll mellan buffertar och rensning
Med utgångsbuffring kan du lagra allt textinnehåll (Text, HTML
) i en variabel och skicka till webbläsaren som ett stycke i slutet av ditt skript. Som standard skickar php
ditt innehåll när det tolkar det.
<?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>"
Allt innehåll som matas ut mellan ob_start()
och ob_get_clean()
kommer att fångas och placeras i variabeln $content
.
Att ringa ob_get_clean()
utlöser både ob_get_contents()
och ob_end_clean()
.
Kapslade utgångsbuffertar
Du kan häcka ut buffertar och hämta nivån för dem för att ge olika innehåll med 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--;
}
utgångar:
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
Fångar ut bufferten för att återanvändas senare
I det här exemplet har vi en matris som innehåller vissa data.
Vi fångar ut bufferten i $items_li_html
och använder den två gånger på sidan.
<?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>
Spara koden ovan i en fil output_buffer.php
och kör den via php output_buffer.php
.
Du bör se de två listobjekt som vi skapade ovan med samma listobjekt som vi genererade i PHP med utgångsbufferten:
<!-- 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>
Kör ut buffert före något innehåll
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>
I det här exemplet antar vi att $users
är en multidimensionell matris och vi går igenom den för att hitta alla användare med en åtkomstnivå på 7.
Om det inte finns några resultat, omdirigerar vi till en felsida.
Vi använder utgångsbufferten här eftersom vi utlöser en header()
omdirigering baserat på resultatet av slingan
Använda utgångsbuffert för att lagra innehåll i en fil, användbart för rapporter, fakturor etc.
<?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);
Det här exemplet tar hela dokumentet och skriver det till fil, det skickar inte ut dokumentet i webbläsaren utan gör det genom att använda echo $html;
Bearbetar bufferten via ett återuppringning
Du kan tillämpa alla typer av ytterligare bearbetningar på utgången genom att skicka en konverterbar till 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();
*/
Produktion:
<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>
Strömma utdata till klienten
/**
* 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();
}
Typisk användning och orsaker till att använda ob_start
ob_start
är särskilt praktiskt när du har omdirigeringar på din sida. Till exempel fungerar inte följande kod:
Hello!
<?php
header("Location: somepage.php");
?>
Det fel som kommer att ges är något liknande: headers already sent by <xxx> on line <xxx>
.
För att åtgärda problemet skulle du skriva något liknande i början av din sida:
<?php
ob_start();
?>
Och något liknande i slutet av din sida:
<?php
ob_end_flush();
?>
Detta lagrar allt genererat innehåll i en utgångsbuffert och visar det på en gång. Därför, om du har några omdirigeringssamtal på din sida, kommer dessa att utlösas innan data skickas, vilket tar bort möjligheten att en headers already sent
uppstår.