जवाबों:
वेब डेवलपर्स के लिए आउटपुट बफरिंग, एक शुरुआती गाइड :
आउटपुट बफ़रिंग (डिफ़ॉल्ट) के बिना, आपका HTML आपकी स्क्रिप्ट के माध्यम से PHP प्रक्रियाओं के रूप में ब्राउज़र में भेजा जाता है। आउटपुट बफ़रिंग के साथ, आपका HTML एक चर में संग्रहीत किया जाता है और आपकी स्क्रिप्ट के अंत में एक टुकड़े के रूप में ब्राउज़र को भेजा जाता है।
वेब डेवलपर्स के लिए आउटपुट बफ़रिंग के लाभ
- अकेले आउटपुट को चालू करने से हमारे HTML को डाउनलोड करने और रेंडर करने में लगने वाले समय की मात्रा घट जाती है क्योंकि यह ब्राउज़र में टुकड़ों में नहीं भेजा जा रहा है क्योंकि PHP HTML को प्रोसेस करता है।
- सभी फैंसी सामान जो हम PHP स्ट्रिंग्स के साथ कर सकते हैं, अब हम अपने पूरे HTML पेज को एक चर के रूप में कर सकते हैं।
- यदि आपने कभी भी संदेश का सामना किया है "चेतावनी: कुकीज़ सेट करते समय हेडर जानकारी को पहले से ही (आउटपुट) द्वारा संशोधित नहीं किया जा सकता है, तो आपको यह जानकर खुशी होगी कि आउटपुट बफरिंग आपका जवाब है।
ob_start()
, तो वास्तव में सबकुछ बफर हो जाता है। एक वैकल्पिक दूसरा पैरामीटर है ob_start()
, int $chunk_size
जो, यदि सेट किया जाता है, तो बफर को किसी भी आउटपुट कॉल के बाद फ्लश किया जाएगा जो बफ़र की लंबाई को इस आकार के बराबर या उससे अधिक का कारण बनता है।
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 );
}
?>
ob_flush()
या ob_end_flush()
) में से एक को बुलाते हैं, तो बफर को फ्लश किया जाता है । जब आपकी स्क्रिप्ट समाप्त होती है, तो अचानक या अन्यथा कोई समस्या नहीं होनी चाहिए, तो बफ़र की सामग्री भी फ़्लश हो जाती है।
मुझे पता है कि यह एक पुराना प्रश्न है, लेकिन मैं दृश्य शिक्षार्थियों के लिए अपना उत्तर लिखना चाहता था। मुझे दुनिया भर में वेब पर आउटपुट बफ़रिंग की व्याख्या करने वाला कोई भी चित्र नहीं मिला, इसलिए मैंने विंडोज में स्वयं एक चित्र बनाया 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
उदाहरण के साथ आउटपुट बफर के बारे में अधिक जानकारी यहां पाई जा सकती है:
आउटपुट कंट्रोल फ़ंक्शन आपको स्क्रिप्ट से आउटपुट भेजे जाने पर नियंत्रित करने की अनुमति देता है। यह कई अलग-अलग स्थितियों में उपयोगी हो सकता है, खासकर यदि आपको अपनी स्क्रिप्ट के डेटा का उत्पादन शुरू करने के बाद ब्राउज़र को हेडर भेजने की आवश्यकता होती है। आउटपुट कंट्रोल फ़ंक्शंस हेडर () या सेटकुकी () का उपयोग करके भेजे गए हेडर को प्रभावित नहीं करते हैं, केवल फ़ंक्शंस जैसे कि इको () और PHP कोड के ब्लॉक के बीच डेटा।
http://php.net/manual/en/book.outcontrol.php
और अधिक संसाधनों:
जैसा कि नाम से पता चलता है कि स्क्रिप्ट का आउटपुट कैसे दिखाई देता है इसका प्रबंधन करने के लिए उपयोग किए जाने वाले मेमोरी बफर।
यहाँ विषय के लिए एक बहुत अच्छा ट्यूटोरियल है
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
UPDATE 2019। यदि आपके पास सर्वर और SSD या बेहतर NVM है, तो 3.5GHZ। आपको 100ms-150ms में तेजी से भरी हुई वेबसाइट बनाने के लिए बफरिंग का उपयोग नहीं करना चाहिए।
2019 में प्रदर्शन सर्वर (severs, मेमोरी, डिस्क) और APC PHP के साथ चालू होने के साथ बीकाउज़ नेटवर्क धीरे-धीरे स्क्रिप्ट की तुलना में है। उत्पन्न स्क्रिप्ट के लिए कभी-कभी केवल 70ms की आवश्यकता होती है एक और समय केवल नेटवर्क में समय लगता है, 10ms से 150ms तक। उपयोगकर्ता के सर्वर।
इसलिए यदि आप तेज़ 150ms चाहते हैं, तो बफरिंग धीमी हो जाती है, क्योंकि इसे अतिरिक्त लागत के लिए अतिरिक्त संग्रह बफर डेटा की आवश्यकता होती है। 10 साल पहले जब सर्वर 1s स्क्रिप्ट बनाता था, तो यह उपयोगी था।
यदि आप jpg का उपयोग करना चाहते हैं तो इसे लोड करने को स्वचालित और क्रैश भेज सकते हैं।
चीयर्स।
आप तेजी से नदी बना सकते हैं या आप सुरक्षित रूप से तम बना सकते हैं :)