2009-09-20 10 views
8

मुझे नहीं लगता कि यह उचित है।PHP_ में काम करने के लिए session_start() से ob_start() क्यों आना चाहिए?

वास्तव में ऐसा नियम क्यों है? और न ही arround दूसरा रास्ता -

+6

स्पष्ट रूप से बोलते हुए: मैंने इस तरह के नियम के बारे में नहीं सुना है! – mauris

उत्तर

13
" सामान्य मामले", मुझे नहीं लगता कि ob_start session_start से पहले के नाम से जाना है करते

, manual page of session_start का हवाला देते हुए, हालांकि:

session_start() यूआरएल को फिर से लिखने के लिए आंतरिक उत्पादन हैंडलर रजिस्टर करेंगे जब ट्रांस sid सक्षम है। यदि कोई उपयोगकर्ता ob_gzhandler का उपयोग करता है या ob_start(), आउटपुट हैंडलर का क्रम उचित आउटपुट के लिए महत्वपूर्ण है। उदाहरण के लिए, उपयोगकर्ता को सत्र शुरू होने से पहले ob_gzhandler पंजीकृत करना होगा।

लेकिन यह एक विशेष मामला किसी तरह का है: बात यहाँ, है, कि उत्पादन संचालकों का क्रम महत्वपूर्ण है: यदि आप चीजों अन्य किया संशोधित करने के लिए एक हैंडलर चाहते हैं, वे में क्रियान्वित किया जा करने के लिए है "सही आदेश।


आम तौर पर, यदि आप संचालकों उस तरह का प्रयोग नहीं करते (अपाचे और mod_deflate बहुत अच्छा काम करते हैं जब यह उत्पादन को संपीड़ित करने के लिए आता है, उदाहरण के लिए), केवल बात यह है कि मायने रखती है कि हेडर नहीं होना चाहिए है session_startपर कॉल करने से पहले भेजा गया (क्योंकि, आपकी कॉन्फ़िगरेशन के आधार पर, session_start कुकीज भेजता है, जो HTTP शीर्षलेख के रूप में पारित होते हैं)

और हेडर डेटा के किसी भी भाग के रूप में जैसे ही भेजा जाता है भेजना होगा - यानी, के रूप में जल्द ही किसी भी उत्पादन, <?php ?> टैग के बाहर भी एक खाली स्थान के रूप में होती है:

नोट: यदि आप कर रहे हैं कुकी-आधारित सत्रों का उपयोग करके, आपको सत्र_स्टार्ट() को ब्राउज़र पर आउटपुट से पहले कॉल करना होगा।

ob_start इंगित करता है PHP डेटा बफ़र नहीं है:

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

इस तरह, उत्पादन नहीं भेजे जाने से पहले आप वास्तव में, "डेटा भेजें", कहते हैं कि अपने आप को। इसका मतलब है कि हेडर तुरंत भेज नहीं रहे हैं - जिसका अर्थ है session_start बाद में कॉल किया जा सकता है, भले ही आउटपुट होना चाहिए, अगर ob_start का उपयोग नहीं किया गया था।


आशा है कि इससे चीजें थोड़ा और स्पष्ट हो जाएंगी ...

5

डिफ़ॉल्ट रूप से अपने output_bufferingOff है और यदि आपके पास पर्याप्त दुर्भाग्यपूर्ण डेटा का एक बाइट ग्राहक तो अपने HTTP हेडर पहले ही भेजा गया है करने के लिए वापस भेजने के लिए किया गया है है। कुकी हेडर को क्लाइंट पर वापस जाने से session_start() प्रभावी ढंग से रोकता है। ob_start() पर कॉल करके आप बफरिंग सक्षम करते हैं और इसलिए http शीर्षलेख भेजने में देरी करते हैं।

0

session_start कुछ कॉन्फ़िगरेशन विकल्प सेट होने पर HTTP शीर्षलेख को संशोधित करना चाहते हैं। उदाहरण के लिए एक session.use_cookies है जिसे सेट-कुकी हेडर फ़ील्ड सेट/संशोधित करने की आवश्यकता है।

HTTP शीर्षलेख को संशोधित करने के लिए आवश्यक है कि क्लाइंट को पहले से भेजा गया कोई भी आउटपुट नहीं है क्योंकि पहले आउटपुट भेजे जाने से ठीक पहले HTTP header भेजा गया है।

तो आप या तो सुनिश्चित करते हैं कि session_start की कॉल से पहले बिल्कुल कोई आउटपुट नहीं है। या आप उत्पादन को बफर करने के लिए output buffering control का उपयोग करते हैं ताकि HTTP शीर्षलेख को पहले से आउटपुट होने पर भी संशोधित किया जा सके।

0

session_start()trans-sid सक्षम होने पर यूआरएल पुनर्लेखन के लिए आंतरिक आउटपुट हैंडलर पंजीकृत करेगा। यदि कोई उपयोगकर्ता ob_gzhandler का उपयोग करता है या ob_start() के साथ, आउटपुट हैंडलर का क्रम उचित आउटपुट के लिए महत्वपूर्ण है।

उदाहरण के लिए, उपयोगकर्ता को सत्र शुरू होने से पहले ob_gzhandler पंजीकृत करना होगा।

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

आम तौर पर, यदि आप उस तरह के हैंडलर का उपयोग नहीं करते हैं (अपाचे और mod_deflate उदाहरण के लिए आउटपुट को संपीड़ित करने की बात आती है तो एक अच्छा काम करते हैं), केवल एक चीज जो मायने रखती है कि हेडर को कॉल करने से पहले नहीं भेजा जाना चाहिए session_start (क्योंकि, आपकी कॉन्फ़िगरेशन के आधार पर, session_start कुकीज़ भेजता है, जो HTTP शीर्षलेख के रूप में पारित होते हैं)।

और हेडर डेटा के किसी भी भाग के रूप में जैसे ही भेजा जाता है भेजना होगा - यानी, के रूप में जल्द ही किसी भी उत्पादन, <?php ?> टैग के बाहर भी एक खाली स्थान के रूप में होती है:

नोट: आप कर रहे हैं कुकी-आधारित सत्रों का उपयोग करके, आपको ब्राउज़र पर कुछ भी आउटपुट करने से पहले session_start() पर कॉल करना होगा।

ob_start इंगित करता है PHP डेटा बफ़र नहीं है:

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

इस तरह, आउटपुट आपको वास्तव में कहने से पहले नहीं भेजा जाता है, स्वयं "डेटा भेजें"। इसका मतलब है कि हेडर तुरंत भेज नहीं रहे हैं - जिसका अर्थ है कि सत्र_स्टार्ट को बाद में कहा जा सकता है, भले ही आउटपुट होना चाहिए, अगर ob_start का उपयोग नहीं किया गया था।

0

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

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