खोज…


पैरामीटर

समारोह विवरण
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() बीच ob_start() की गई किसी भी सामग्री को कैप्चर किया जाएगा और उसे चर $content में रखा जाएगा।

ob_get_clean() कॉल 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 में आउटपुट बफर को कैप्चर करते हैं और पृष्ठ में दो बार इसका उपयोग करते हैं।

<?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 output_buffer.php

आपको उन 2 सूची वस्तुओं को देखना चाहिए जिन्हें हमने आउटपुट बफर का उपयोग करके 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; का उपयोग करके करता है echo $html;

कॉलबैक के माध्यम से बफर को संसाधित करना

आप किसी ob_start() करने के लिए किसी भी प्रकार के अतिरिक्त प्रसंस्करण को 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 की संभावना को हटाकर headers already sent त्रुटि उत्पन्न हो सकती है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow