PHP बफर ob_flush () बनाम फ्लश ()


79

दोनों में क्या अंतर है ob_flush()और flush()मुझे दोनों को क्यों बुलाना चाहिए?

ob_flush()संदर्भ का कहना है:

यह फ़ंक्शन आउटपुट बफर (यदि कोई हो) की सामग्री भेजेगा।

flush()संदर्भ का कहना है:

PHP के लिखने वाले बफर को फ्लश करता है और PHP जो भी बैकएंड उपयोग कर रहा है (CGI, एक वेब सर्वर, आदि)।

हालांकि, यह कहना जारी है:

[] यह आपके वेब सर्वर की बफरिंग योजना को ओवरराइड करने में सक्षम नहीं हो सकता है ...

तो, मुझे लगता है कि मैं बस ob_flush()समय का उपयोग कर सकता है । हालांकि, मुझे ऐसा करने पर अजीब परिणाम मिलते हैं। क्या कोई सरल शब्दों में समझा सकता है कि यहाँ क्या हो रहा है?

जवाबों:


75

ob_flushएक आवेदन-पहल बफर भेजता है। ob_start()किसी भी PHP स्क्रिप्ट में कई नेस्टेड हो सकते हैं । ob_flushऊपरी परत पर वर्तमान सामग्री को पास करता है।

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

और अब वेब सर्वर स्वयं एक और बफरिंग योजना ( mod_deflateया सामग्री फ़िल्टर) लागू कर सकता है , जिसका आपके ऊपर कोई प्रभाव नहीं है। लेकिन यह शायद ही कभी होता है, क्योंकि इसे विशेष रूप से कॉन्फ़िगर करने की आवश्यकता होती है।

वैसे भी, दोनों का उपयोग करें।


11
Ob_flush का उपयोग करें और फ्लश करें और उन्हें उसी क्रम में उपयोग करें।
रॉबिनो

17
इस उत्तर से गायब महत्वपूर्ण विवरण output_bufferingकॉन्फ़िगरेशन विकल्प है, जिसका php.ini के उत्पादन संस्करणों में डिफ़ॉल्ट मान 4096 है। इसका मतलब है कि जब कोई भी PHP स्क्रिप्ट शुरू होती है, तो आउटपुट के पहले 4096 बाइट्स बफर हो जाते हैं (साथ बफर बफर में ob_flush())। यही कारण है कि इसका इस्तेमाल करने के लिए आवश्यक है है ob_flush()और साथ ही flush()। अक्षम करना output_bufferingphp.ini के माध्यम से या फोन करने ob_end_clean()या ob_end_flush()स्क्रिप्ट के शुरू में इस आवश्यकता को हटा।
मार्क अमेरी

धन्यवाद @MarkAmery, लेकिन ob_end_clean()"स्क्रिप्ट की शुरुआत" में काउंटर-सहज ज्ञान युक्त लगता है। आपका मतलब है कि हमें ob_start()दो फ्लश के तुरंत बाद और पहले इसे शामिल करना चाहिए ?
खोम नाज़िद

खैर मैं एक है ob_start()और एक ob_end_clean()पर बहुत स्क्रिप्ट के शुरू करते हैं। फिर स्क्रिप्ट के दौरान किसी भी "प्रतिध्वनि" के बाद, मैं भी शामिल करता हूं ob_flush(); flush();, और मुझे उम्मीद है कि जबकि स्क्रिप्ट में समय लग रहा है, जो कुछ भी किया गया है वह स्क्रीन पर (ब्राउज़र में) आउटपुट होगा। लेकिन बहुत अंत तक कुछ भी नहीं डाला जाता है। मैं क्या खो रहा हूँ?
खोम नाज़िद

1
@KhomNazid एक ब्राउज़र अवलोकन HTTP स्ट्रीम डिबगिंग के समान नहीं है। अपूर्ण HTML DOM में वृद्धिशील और विलंबित आउटपुट दिखाई देने की संभावना नहीं है। अपने वर्तमान सेटअप के साथ कुछ सीएलआई परीक्षण करें। (और फिर, और उसके बाद ही, इसके बारे में एक अलग सवाल शुरू करें।)
mario

33

ob_flushआउटपुट बफ़र्स को फ्लश करता है जिसे आपने किसी फ़ंक्शन के साथ बनाया हैob_start

flush PHP स्क्रिप्ट के आउटपुट को फ्लश करता है, जो इसके कॉलर पर है


25

ob_flush()एक उच्च स्तरीय फ्लश है। यह उच्च-स्तरीय बफ़र्स को फ्लश करता है और सभी सामग्री को निम्न-स्तर, आंतरिक बफ़र्स में भेजने के लिए तैयार करता है।

  • ध्यान दें कि ob_फ़ंक्शंस का परिवार बफ़र्स के ढेर बनाता है , इसलिए ob_flush()हर जगह बस नेत्रहीन लेखन वास्तव में आपको "अजीब परिणाम" देने जा रहा है यदि कोड इस स्टैकिंग का लाभ लेने के लिए लिखा गया था।

flush() एक निम्न-स्तरीय फ्लश है, PHP को अपने आंतरिक, निम्न-स्तरीय डेटा बफ़र्स को फ्लश करने का निर्देश देता है।

उसके नीचे अभी भी सॉकेट-लेयर बफ़र्स होंगे; नीचे, नेटवर्क-लेयर बफ़र हैं। और, निम्नतम स्तर पर, इलेक्ट्रॉनों की कतार डेटा केबल के नीचे जा रही है।


खैर मैं एक है ob_start()और एक ob_end_clean()पर बहुत स्क्रिप्ट के शुरू करते हैं। फिर स्क्रिप्ट के दौरान किसी भी "प्रतिध्वनि" के बाद, मैं भी शामिल करता हूं ob_flush(); flush();, और मुझे उम्मीद है कि जबकि स्क्रिप्ट में समय लग रहा है, जो कुछ भी किया गया है वह स्क्रीन पर (ब्राउज़र में) आउटपुट होगा। लेकिन बहुत अंत तक कुछ भी नहीं डाला जाता है। मैं क्या खो रहा हूँ?
खोम नाज़िद

@KhomNazid मध्यवर्ती चरणों द्वारा बफरिंग, जैसे वेबसर्वर, प्रॉक्सी, आपका ब्राउज़र ...
ऑर्बिट

11

मुझे लगता है कि यह आपके पिछले प्रश्न के संबंध में है । आउटपुट बफ़रिंग का उपयोग करने का महत्वपूर्ण लाभ यह है कि इसका उपयोग डेटा कम्प्रेशन के साथ किया जाता है। यदि आप उपयोग नहीं कर रहे हैं ob_gzhandler, तो हासिल करने के लिए बहुत कम है। flushअकेले सर्वर पर अभी भी जो भी आउटपुट डेटा है वह कमिट करेगा। साथ ob_startऔर उसके समकक्षों ob_flush, ob_end_cleanऔर ob_end_flushजो कुछ भी संकुचित करने की प्रतीक्षा कर रहा है (कम से देखो flushऔर ob_flushविभिन्न बाल्टी की चर्चा करते हुए के रूप में - obके लिए डेटा भेजता है flush, flushब्राउज़र के लिए डेटा भेजता है - सही नहीं हो सकता, लेकिन यह विचार है) ऊपर लपेट और ग्राहक को भेज दिया जाएगा ।


धन्यवाद, बाल्टी सादृश्य इसका एक अच्छा उदाहरण है।
बेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.