Suche…


Parameter

Funktion Einzelheiten
ob_start () Startet den Ausgabepuffer. Alle danach platzierten Ausgaben werden erfasst und nicht angezeigt
ob_get_contents () Gibt alle von ob_start() erfassten ob_start()
ob_end_clean () Leert den Ausgabepuffer und schaltet ihn für die aktuelle Schachtelungsebene aus
ob_get_clean () ob_get_contents() sowohl ob_get_contents() als auch ob_end_clean()
ob_get_level () Gibt den aktuellen Verschachtelungsgrad des Ausgabepuffers zurück
ob_flush () Löschen Sie den Inhaltspuffer und senden Sie ihn an den Browser, ohne den Puffer zu beenden
ob_implicit_flush () Aktiviert das implizite Leeren nach jedem Ausgabeaufruf.
ob_end_flush () Leeren Sie den Inhaltspuffer und senden Sie ihn an den Browser

Grundlegende Verwendung zum Abrufen von Inhalten zwischen Puffern und Löschen

Mit der Ausgabepufferung können Sie beliebigen Textinhalt (Text, HTML ) in einer Variablen speichern und als ein Teil am Ende Ihres Skripts an den Browser senden. Standardmäßig sendet php Ihren Inhalt bei der Interpretation.

<?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 Inhalte, die zwischen ob_start() und ob_get_clean() ausgegeben werden, werden erfasst und in der Variablen $content abgelegt.

Der Aufruf von ob_get_clean() löst sowohl ob_get_contents() als auch ob_end_clean() .

Verschachtelte Ausgabepuffer

Sie können Ausgabepuffer verschachteln und die Ebene ob_get_level() , um mit der Funktion ob_get_level() unterschiedlichen Inhalt 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--;
}

Ausgänge:

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

Erfassen des Ausgabepuffers zur späteren Wiederverwendung

In diesem Beispiel haben wir ein Array, das einige Daten enthält.

Wir erfassen den Ausgabepuffer in $items_li_html und verwenden ihn zweimal auf der Seite.

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

Speichern Sie den obigen Code in einer Datei output_buffer.php und führen Sie ihn über php output_buffer.php .

Sie sollten die zwei Listenelemente sehen, die wir oben mit den gleichen Listenelementen erstellt haben, die wir in PHP mit dem Ausgabepuffer erstellt haben:

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

Ausgabepuffer vor Inhalt ausführen

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 diesem Beispiel nehmen wir an, dass $users ein mehrdimensionales Array ist, und wir durchlaufen es, um alle Benutzer mit einer Zugriffsebene von 7 zu finden.

Wenn keine Ergebnisse vorhanden sind, werden wir auf eine Fehlerseite weitergeleitet.

Wir verwenden den Ausgabepuffer hier, weil wir eine header() Umleitung basierend auf dem Ergebnis der Schleife auslösen

Verwendung des Ausgabepuffers zum Speichern von Inhalten in einer Datei, nützlich für Berichte, Rechnungen usw

<?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 diesem Beispiel wird das vollständige Dokument in eine Datei geschrieben. Das Dokument wird nicht im Browser ausgegeben, sondern mit echo $html;

Bearbeitung des Puffers über einen Rückruf

Sie können jede Art von zusätzlicher Verarbeitung auf die Ausgabe anwenden, indem Sie eine ob_start() an 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();
*/

Ausgabe:

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

Streamen Sie die Ausgabe an den 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();
}

Typische Verwendung und Gründe für die Verwendung von ob_start

ob_start ist besonders praktisch, wenn Sie Weiterleitungen auf Ihrer Seite haben. Der folgende Code funktioniert beispielsweise nicht:

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

Der Fehler, der gegeben wird, ist etwa wie: headers already sent by <xxx> on line <xxx> .

Um dieses Problem zu beheben, schreiben Sie am Anfang Ihrer Seite Folgendes:

<?php
  ob_start();
?>

Und so etwas am Ende Ihrer Seite:

<?php
  ob_end_flush();
?>

Dies speichert den generierten Inhalt in einem Ausgabepuffer und zeigt ihn auf einmal an. Wenn Sie also Umleitungsaufrufe auf Ihrer Seite haben, werden diese ausgelöst, bevor Daten gesendet werden, wodurch die Möglichkeit eines headers already sent Fehlers ausgeschlossen wird.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow