आउटपुट बफ़रिंग क्या है?


जवाबों:


274

वेब डेवलपर्स के लिए आउटपुट बफरिंग, एक शुरुआती गाइड :

आउटपुट बफ़रिंग (डिफ़ॉल्ट) के बिना, आपका HTML आपकी स्क्रिप्ट के माध्यम से PHP प्रक्रियाओं के रूप में ब्राउज़र में भेजा जाता है। आउटपुट बफ़रिंग के साथ, आपका HTML एक चर में संग्रहीत किया जाता है और आपकी स्क्रिप्ट के अंत में एक टुकड़े के रूप में ब्राउज़र को भेजा जाता है।

वेब डेवलपर्स के लिए आउटपुट बफ़रिंग के लाभ

  • अकेले आउटपुट को चालू करने से हमारे HTML को डाउनलोड करने और रेंडर करने में लगने वाले समय की मात्रा घट जाती है क्योंकि यह ब्राउज़र में टुकड़ों में नहीं भेजा जा रहा है क्योंकि PHP HTML को प्रोसेस करता है।
  • सभी फैंसी सामान जो हम PHP स्ट्रिंग्स के साथ कर सकते हैं, अब हम अपने पूरे HTML पेज को एक चर के रूप में कर सकते हैं।
  • यदि आपने कभी भी संदेश का सामना किया है "चेतावनी: कुकीज़ सेट करते समय हेडर जानकारी को पहले से ही (आउटपुट) द्वारा संशोधित नहीं किया जा सकता है, तो आपको यह जानकर खुशी होगी कि आउटपुट बफरिंग आपका जवाब है।

6
+1। यहां एक और सहायक लिंक दिया गया है: php.net/manual/en/function.ob-start.php - एक फ़ंक्शन से निपटने में भी सहायक है जो कि एक वैरिएबल में एक मूल्य है जिसे आप स्टोर करते हैं।
कैम

क्या वास्तव में सबकुछ खत्म हो गया है, या यदि मेरे पास एक लंबा पृष्ठ है तो क्या पेज सिर्फ चंक्स में आएगा?
zedoo

5
@zedoo अगर आप आउटपुट बफरिंग शुरू करते हैं ob_start(), तो वास्तव में सबकुछ बफर हो जाता है। एक वैकल्पिक दूसरा पैरामीटर है ob_start(), int $chunk_sizeजो, यदि सेट किया जाता है, तो बफर को किसी भी आउटपुट कॉल के बाद फ्लश किया जाएगा जो बफ़र की लंबाई को इस आकार के बराबर या उससे अधिक का कारण बनता है।
कुल्हाड़ी।

12
यदि आपको "चेतावनी: शीर्ष लेख की जानकारी को संशोधित नहीं किया जा सकता है", तो इसका मतलब है कि आपको अपने कोड को पहले ऑडिट करना होगा क्योंकि आउटपुट बफ़रिंग सक्षम करना लक्षण का एक निर्धारण है और इसका कारण नहीं है। मोड़ने से पहले कुछ लिख रहा है। इसलिए मैं असहमत हूं, लेकिन जवाब को उछालने के लिए पर्याप्त नहीं हूं।
ग्लेन प्लास

5
मैं केवल बफरिंग का उपयोग करने के रोमांच को देखता हूं, इसलिए यह php में डिफ़ॉल्ट रूप से सक्षम क्यों नहीं है?
थॉमस बंडारेस

69

PHP द्वारा आउटपुट बफ़रिंग का उपयोग प्रदर्शन को बेहतर बनाने और कुछ ट्रिक्स करने के लिए किया जाता है।

  • आप PHP को एक बफर में सभी आउटपुट स्टोर कर सकते हैं और एक बार नेटवर्क प्रदर्शन को बेहतर बनाने के लिए यह सब आउटपुट कर सकते हैं।

  • आप बफर सामग्री को कुछ स्थितियों में ब्राउज़र में वापस भेजे बिना एक्सेस कर सकते हैं।

इस उदाहरण पर विचार करें:

<?php
    ob_start( );
    phpinfo( );
    $output = ob_get_clean( );
?>

उपरोक्त उदाहरण ब्राउज़र को भेजने के बजाय आउटपुट को एक चर में कैप्चर करता है। output_buffering डिफ़ॉल्ट रूप से बंद है।

  • जब आप सामग्री भेजकर हेडर को संशोधित करना चाहते हैं तो आप स्थितियों में आउटपुट बफरिंग का उपयोग कर सकते हैं।

इस उदाहरण पर विचार करें:

<?php
    ob_start( );
    echo "Hello World";
    if ( $some_error )
    {
        header( "Location: error.php" );
        exit( 0 );
    }
?>

एक्स के लिए भी यही सवाल है: आउटपुट बफ़रिंग को शुरू किए बिना बाद में वापस बंद नहीं करना, क्या आपकी स्क्रिप्ट को सभी प्रकार की समस्याओं में चलाने वाला है?
एडवर्ड स्टॉम्पर्ड

1
जब आप फ्लश विधियों (जैसे ob_flush()या ob_end_flush()) में से एक को बुलाते हैं, तो बफर को फ्लश किया जाता है । जब आपकी स्क्रिप्ट समाप्त होती है, तो अचानक या अन्यथा कोई समस्या नहीं होनी चाहिए, तो बफ़र की सामग्री भी फ़्लश हो जाती है।
सलमान ए

17

मुझे पता है कि यह एक पुराना प्रश्न है, लेकिन मैं दृश्य शिक्षार्थियों के लिए अपना उत्तर लिखना चाहता था। मुझे दुनिया भर में वेब पर आउटपुट बफ़रिंग की व्याख्या करने वाला कोई भी चित्र नहीं मिला, इसलिए मैंने विंडोज में स्वयं एक चित्र बनाया mspaint.exe

यदि आउटपुट बफ़रिंग को बंद कर दिया जाता है, तो echoब्राउज़र को तुरंत डेटा भेज देगा।

यहां छवि विवरण दर्ज करें

यदि आउटपुट बफ़रिंग चालू है, तो echoब्राउज़र में भेजने से पहले आउटपुट बफर को डेटा भेज देगा।

यहां छवि विवरण दर्ज करें

phpinfo

यह देखने के लिए कि आउटपुट बफ़रिंग चालू / बंद है या नहीं, कृपया मुख्य भाग पर phpinfo को देखें। output_bufferingनिर्देश आपको पता चलेगा कि आउटपुट बफरिंग / बंद है।

यहां छवि विवरण दर्ज करें इस स्थिति में output_bufferingमान 4096 है जिसका अर्थ है कि बफर का आकार 4 केबी है। इसका अर्थ यह भी है कि आउटपुट बफ़रिंग वेब सर्वर पर चालू है।

php.ini

output_bufferingनिर्देश के मूल्य को बदलकर बफर आकार को चालू / बंद करना और बदलना संभव है । बस इसे ढूंढें php.ini, इसे अपनी पसंद की सेटिंग में बदलें, और वेब सर्वर को पुनरारंभ करें। आप मेरे php.iniनीचे का एक नमूना पा सकते हैं ।

; Output buffering is a mechanism for controlling how much output data
; (excluding headers and cookies) PHP should keep internally before pushing that
; data to the client. If your application's output exceeds this setting, PHP
; will send that data in chunks of roughly the size you specify.
; Turning on this setting and managing its maximum buffer size can yield some
; interesting side-effects depending on your application and web server.
; You may be able to send headers and cookies after you've already sent output
; through print or echo. You also may see performance benefits if your server is
; emitting less packets due to buffered output versus PHP streaming the output
; as it gets it. On production servers, 4096 bytes is a good setting for performance
; reasons.
; Note: Output buffering can also be controlled via Output Buffering Control
;   functions.
; Possible Values:
;   On = Enabled and buffer is unlimited. (Use with caution)
;   Off = Disabled
;   Integer = Enables the buffer and sets its maximum size in bytes.
; Note: This directive is hardcoded to Off for the CLI SAPI
; Default Value: Off
; Development Value: 4096
; Production Value: 4096
; http://php.net/output-buffering
output_buffering = 4096

निर्देशन output_bufferingकेवल आउटपुट बफ़रिंग के बारे में कॉन्फ़िगर करने योग्य निर्देश नहीं है। आप यहां अन्य विन्यास योग्य आउटपुट बफरिंग निर्देश पा सकते हैं: http://php.net/manual/en/outcontrol.configuration.php

उदाहरण: ob_get_clean ()

नीचे आप देख सकते हैं कि echoब्राउज़र पर भेजने से पहले ए को कैसे कैप्चर करें और उसमें हेरफेर करें।

// Turn on output buffering  
ob_start();  

echo 'Hello World';  // save to output buffer

$output = ob_get_clean();  // Get content from the output buffer, and discard the output buffer ...
$output = strtoupper($output); // manipulate the output  

echo $output;  // send to output stream / Browser

// OUTPUT:  
HELLO WORLD

उदाहरण: Hackingwithphp.com

उदाहरण के साथ आउटपुट बफर के बारे में अधिक जानकारी यहां पाई जा सकती है:

http://www.hackingwithphp.com/13/0/0/output-buffering


9

आउटपुट कंट्रोल फ़ंक्शन आपको स्क्रिप्ट से आउटपुट भेजे जाने पर नियंत्रित करने की अनुमति देता है। यह कई अलग-अलग स्थितियों में उपयोगी हो सकता है, खासकर यदि आपको अपनी स्क्रिप्ट के डेटा का उत्पादन शुरू करने के बाद ब्राउज़र को हेडर भेजने की आवश्यकता होती है। आउटपुट कंट्रोल फ़ंक्शंस हेडर () या सेटकुकी () का उपयोग करके भेजे गए हेडर को प्रभावित नहीं करते हैं, केवल फ़ंक्शंस जैसे कि इको () और PHP कोड के ब्लॉक के बीच डेटा।

http://php.net/manual/en/book.outcontrol.php

और अधिक संसाधनों:

PHP के साथ आउटपुट बफरिंग


4

जैसा कि नाम से पता चलता है कि स्क्रिप्ट का आउटपुट कैसे दिखाई देता है इसका प्रबंधन करने के लिए उपयोग किए जाने वाले मेमोरी बफर।

यहाँ विषय के लिए एक बहुत अच्छा ट्यूटोरियल है


1
ob_start();  // turns on output buffering
$foo->bar();  // all output goes only to buffer
ob_clean();  // delete the contents of the buffer, but remains buffering active
$foo->render(); // output goes to buffer
ob_flush(); // send buffer output
$none = ob_get_contents();  // buffer content is now an empty string
ob_end_clean();  // turn off output buffering

बफ़र्स को नेस्ट किया जा सकता है, इसलिए जब एक बफर सक्रिय होता है, तो दूसरा ob_start()एक नया बफर सक्रिय करता है। इसलिए ob_end_flush()और ob_flush()वास्तव में बफर को आउटपुट पर नहीं भेज रहे हैं, लेकिन मूल बफर को। और केवल जब कोई मूल बफर नहीं है, तो सामग्री को ब्राउज़र या टर्मिनल पर भेजा जाता है।

अच्छी तरह से यहाँ समझाया गया: https://phpfashion.com/everything-about-output-buffering-in-php


0

UPDATE 2019। यदि आपके पास सर्वर और SSD या बेहतर NVM है, तो 3.5GHZ। आपको 100ms-150ms में तेजी से भरी हुई वेबसाइट बनाने के लिए बफरिंग का उपयोग नहीं करना चाहिए।

2019 में प्रदर्शन सर्वर (severs, मेमोरी, डिस्क) और APC PHP के साथ चालू होने के साथ बीकाउज़ नेटवर्क धीरे-धीरे स्क्रिप्ट की तुलना में है। उत्पन्न स्क्रिप्ट के लिए कभी-कभी केवल 70ms की आवश्यकता होती है एक और समय केवल नेटवर्क में समय लगता है, 10ms से 150ms तक। उपयोगकर्ता के सर्वर।

इसलिए यदि आप तेज़ 150ms चाहते हैं, तो बफरिंग धीमी हो जाती है, क्योंकि इसे अतिरिक्त लागत के लिए अतिरिक्त संग्रह बफर डेटा की आवश्यकता होती है। 10 साल पहले जब सर्वर 1s स्क्रिप्ट बनाता था, तो यह उपयोगी था।

यदि आप jpg का उपयोग करना चाहते हैं तो इसे लोड करने को स्वचालित और क्रैश भेज सकते हैं।

चीयर्स।

आप तेजी से नदी बना सकते हैं या आप सुरक्षित रूप से तम बना सकते हैं :)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.