2011-05-15 13 views
12

मैं gzip संपीड़न और क्या एक PHP स्क्रिप्ट में पहले बाहर रखा गया था करने के लिए उपयोग के लिए उत्पादन बफरिंग का उपयोग करें:wether ob_start() को कैसे निर्धारित करें; पहले से ही बुलाया गया है

if(!ob_start("ob_gzhandler")) ob_start(); 

अब अगर है कि स्क्रिप्ट एक और स्क्रिप्ट जहां ob_start() पहले से कार्यरत है में शामिल हो जाता है

चेतावनी:: ob_start() [ref.outcontrol]: मैं एक चेतावनी प्राप्त उत्पादन हैंडलर 'ob_gzhandler' लाइन n

पर फ़ाइल नाम में दो बार नहीं किया जा सकता

तो मैं मौसम परीक्षण करना चाहते हैं ob_start() पहले से ही बुलाया जा चुका है। मुझे लगता है कि ob_get_status() मुझे जो चाहिए वह होना चाहिए, लेकिन इसके लिए परीक्षण में इसका उपयोग करने का सबसे अच्छा तरीका क्या है?

उत्तर

12

ob_get_level सक्रिय उत्पादन नियंत्रण संचालकों की संख्या देता है और ob_list_handlers उन प्रबंधकों की लिफ्ट देता है। तो अगर आप ऐसा कर सकता है:

if (!in_array('ob_gzhandler', ob_list_handlers())) { 
    ob_start('ob_gzhandler'); 
} else { 
    ob_start(); 
} 

हालांकि सामान्य रूप में आप ob_start बार आप चाहते हैं के किसी भी नंबर पर कॉल कर सकते हैं, हैंडलर नहीं के रूप में आप पहले से ही संकुचित डेटा को संपीड़ित हैं कर सकते हैं के रूप में ob_gzhandler का उपयोग कर।

+0

मैं [मैनुअल पर टिप्पणी] (http://www.php.net/manual/en/function.ob-get-level.php) से परेशान था जो दावा करता है "कभी-कभी, ob_get_level() 1 से बंद हो सकता है क्योंकि स्क्रिप्ट की शुरुआत में, यह 1 वापस आ जाएगा, भले ही ob_start() कभी नहीं कहा गया हो "। तो क्या यह बताने का एक विश्वसनीय तरीका है? –

+0

@CO: शायद यह [output_buffering] (http://php.net/manual/en/outcontrol.configuration.php#ini.output-buffering) के कारण हो सकता है: "यदि [output_buffering] (http: // php .net/मैनुअल/en/outcontrol.configuration.php # आरं।आउटपुट-बफरिंग) सक्षम है या 'ob_start()', 'ob_list_handlers()' के साथ एक अनाम फ़ंक्शन का उपयोग किया गया था '' 'डिफ़ॉल्ट आउटपुट हैंडलर' '। " – Gumbo

9
if (ob_get_level()) 
    echo "ob already started"; 
+0

मैं [मैनुअल पर टिप्पणी] [http://www.php.net/manual/en/function.ob-get-level.php) से परेशान था जो दावा करता है "कभी-कभी, ob_get_level() बंद हो सकता है 1 तक क्योंकि स्क्रिप्ट की शुरुआत में, यह 1 वापस आ जाएगा, भले ही ob_start() कभी नहीं कहा गया हो "। तो क्या यह बताने का एक विश्वसनीय तरीका है? –

+0

@ सीओ। मैंने टिप्पणी पढ़ी है, लेकिन यह सच नहीं है। स्क्रिप्ट की शुरुआत में बुलाए जाने पर भी यह 0 वापस आ जाएगा। आप मेरे उदाहरण पर एक नज़र डाल सकते हैं: http://codepad.org/SrZ4YdQn – AndersTornkvist

+1

यह ** ** सत्य है। पिछले सप्ताह एक साझा सर्वर पर इसमें भाग लें। इसे संभालने का सबसे अच्छा तरीका है 'if (ob_get_level()) ob_end_clean();' ob_start() ' – Michel

3

इस तरह इसका उपयोग करने के बारे में क्या?

if (ob_get_level() == 0) ob_start();

+0

मैं [मैनुअल पर टिप्पणी] [http://www.php.net/manual/en/function.ob-get-level.php) से परेशान था जो दावा करता है "कभी-कभी, ob_get_level() 1 से बंद हो सकता है क्योंकि स्क्रिप्ट की शुरुआत में, यह 1 वापस आ जाएगा, भले ही ob_start() कभी नहीं कहा गया हो "। तो क्या यह बताने का एक विश्वसनीय तरीका है? –

+0

कम से कम इस तरह की समस्या के लिए कोई बग रिपोर्ट नहीं है। टिप्पणीकर्ता गलती हो सकती है। http://bugs.php.net/search.php?cmd=display&search_for=ob_get_level&x=0&y=0 –

+0

हां शायद लेकिन यह टिप्पणी मुझे इस प्रश्न को शुरू करने के लिए प्रेरित करती थी। मैं कुछ राय प्राप्त करना चाहता था। तो धन्यवाद। –

4

सामान्य:

if (ob_get_status()) { 
    // ob started 
} 

अधिक विशिष्ट

$status = ob_get_status(); 
if ($status['name']=='ob_gzhandler') { 
// ob named ob_gzhandler started 
} 
+0

यही वह था जिसे मैं ढूंढ रहा था। धन्यवाद। मैं सोचने के ऊपर गम्बो के सुझाव का उपयोग करूंगा। –

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