2011-04-19 17 views
7

मुझे लगता है किआउटपुट बफरिंग के पेशेवर और विपक्ष क्या हैं?

ob_start(); 

का उपयोग कर अपने पृष्ठ लोड समय में वृद्धि कर सकते कई वेबसाइटों पर पढ़ा है, के रूप में यह एक चर में php संग्रहीत करता है और यह प्रदर्शित करता है एक php एक समय का एक सा प्रसंस्करण के बजाय जाना में।

यह भी है, है ना कुछ लोगों का कहना है कि इस स्पेगेटी कोड है, लेकिन जब तक कोड स्पष्ट और किसी भी प्रोग्रामर के लिए संक्षिप्त है के रूप में तो यह एक समस्या नहीं होनी चाहिए के लिए

header('location: /'); 

अत्यंत उपयोगी है?

इसका उपयोग करने के आपके विचार क्या हैं, और आप अपने आउटपुट बफरिंग के रूप में क्या सेट करते हैं, क्या पेशेवरों और विपक्ष हैं कि कैसे, कब और क्यों मुझे इसका उपयोग करना चाहिए या नहीं।

+1

दूसरे प्रश्न भाग के संबंध में: [क्या यह सभी PHP पृष्ठों की शुरुआत में "ob_start()" है "? (Http://stackoverflow.com/questions/4168009/is-it-ok- टू-ओ-ओ-स्टार्ट-इन-द-स्टार्ट-इन-द-ऑल-पीएचपी-पेज) - इसे व्यापक रूप से हैक माना जाता है यदि इसका उद्देश्य केवल हेडर को पहले से ही त्रुटि को रोकने के लिए है। लेकिन फिर, यह एक कार्यात्मक हैक है। बस सावधान रहें कि विश्वसनीयता गीले PHP पर निर्भर करती है जो स्पष्ट रूप से फ्लश करती है (डिफ़ॉल्ट बफर आकार php.ini सेटिंग्स पर निर्भर करता है)। – mario

उत्तर

-1

कुछ उपयोगकर्ता न php अच्छी तरह से पता के बारे में कुछ बहुत अच्छा कमेंटरी है। इसलिए वे ob_start गलत तरीके से उपयोग करते हैं।

यदि आप हेडर फ़ंक्शन जैसे हेडर(), कुकी(), सत्र का उपयोग कर रहे हैं, तो आपको कोई आउटपुट भेजने की आवश्यकता नहीं है। इन फ़ंक्शन को आउटपुट से पहले उपयोग करना होगा।

लेकिन कुछ उपयोगकर्ता ob_start या आउटपुट बफरिंग फ़ंक्शन का उपयोग करके आउटपुट भेजने को रोकना है।

ताकि आप उपयोगकर्ता को अग्रेषित करने के लिए जावास्क्रिप्ट या मेटा फॉरवर्डिंग का उपयोग कर सकें।

<script language="javascript"> window.location = 'some.php'; </script> 

या आप उपयोगकर्ता को आगे बढ़ाने के लिए मेटा रीफ्रेश का उपयोग कर सकते हैं।

<META HTTP-EQUIV="Refresh" CONTENT="0;URL=some.php"> 

आप न करना होगा यदि आप वास्तव में हैडर फ़ंक्शन का उपयोग करना किसी भी उत्पादन भेजने के लिए (भूल जाते हैं कि चरित्र या अंतरिक्ष में प्रवेश न है या UTF-8 हस्ताक्षर उत्पादन भी है)

+0

-1 - आउटपुट भेजने से रोकने के तरीके के रूप में 'ob_start' का उपयोग करना गलत नहीं है। हालांकि, आमतौर पर, यह शायद प्रदर्शन को प्रभावित कर सकता है और इसका मतलब है कि आपके कोड में एक लेयरिंग समस्या है। –

1

उत्पादन बफरिंग का मुख्य लाभ यह है कि आप इसे ob_gzhandler के साथ उपयोग कर सकते हैं जो आपके आउटपुट को संपीड़ित करेगा ताकि आप कम बैंडविड्थ का उपयोग कर सकें। यदि आपका सर्वर संपीड़ित php फ़ाइलों को भेजने के लिए सेटअप नहीं है तो उपयोग करने के लिए अच्छा है।

एक और फायदा यह है कि यदि आपकी स्क्रिप्ट किसी डेटाबेस या अन्य बाधित संसाधनों का उपयोग करती है और आपके पास कनेक्शन बंद करने या उन संसाधनों को जारी करने से पहले कुछ आउटपुट होता है।इसके बजाय बात इस तरह का होने के: डेटाबेस के लिए

  1. कनेक्ट
  2. प्रारंभ उपयोगकर्ता के लिए उत्पादन भेजने
  3. उपयोगकर्ता के लिए
  4. प्रतीक्षा सब कुछ
  5. बंद डेटाबेस कनेक्शन प्राप्त करने के लिए

आप है:

  1. बफरिंग
  2. कनेक्ट डेटाबेस के लिए
  3. आउटपुट कुछ चीजें
  4. बंद डेटाबेस कनेक्शन
  5. उपयोगकर्ता के लिए बफर भेजें।

जब अपनी स्क्रिप्ट डेटाबेस के लिए 100ms और अपने उपयोगकर्ता के लिए जोड़ा जा करने की आवश्यकता होगी इसे डाउनलोड करने के लिए 300 से अधिक की जरूरत है, तो आप समझ सकते हैं कि कैसे उत्पादन बफरिंग डेटाबेस कनेक्शन सीमा पर कुछ तनाव जारी कर सकते हैं।

मुझे पता है कि एक अच्छी तरह से कॉन्फ़िगर किए गए सर्वर का उपयोग करके अच्छी तरह से कोडित किया गया है, उन फायदों को कम कर सकता है, लेकिन आप कभी नहीं जानते कि आपके बाद कौन कोड करेगा और आपके पास हमेशा सर्वर पर नियंत्रण नहीं होता है।

संबंधित मुद्दे