2008-11-15 13 views
14

मैंने पिछले समय बहुत सारे ob_get_clean() को देखा है। आम तौर पर मैंने $test .= 'test'

मुझे आश्चर्य है कि कोई तेज और/या दूसरे से बेहतर है।

यहाँ कोड ob_get_clean() उपयोग कर रहा है:

ob_start(); 

foreach($items as $item) { 
    echo '<div>' . $item . '</div>'; 
} 

$test = ob_get_clean(); 

यहाँ कोड $test .= 'test' उपयोग कर रहा है:

$test = ''; 

foreach($items as $item) { 
    $test .= '<div>' . $item . '</div>'; 
} 

कौन सा बेहतर है?

+0

मैं हाल ही में यह सोच रहा हूं। जवाब नहीं पता, लेकिन मुझे पता है कि आप "echo $ test;" खो रहे हैं बाद में ... – da5id

+0

पहला व्यक्ति चर को प्रतिबिंबित नहीं करता है। बस पूरे echo'd बाहर भाग $ परीक्षण में डालता है। और अगर आपको यह पसंद है तो वोट दें :) –

उत्तर

6

आउटपुट बफर में वैश्विक चर के सभी नुकसान हैं। आपको ob_start() से ob_get_clean() पर सभी निष्पादन पथों से अवगत होना चाहिए। क्या आप वाकई वहां पहुंच जाएंगे, और बीच में खोले गए किसी भी बफर को बंद कर दिया जाएगा? ध्यान रखें कि कोड अपवाद फेंक सकता है। अगले व्यक्ति को ट्रैक करने के लिए यह वास्तव में मजेदार बग हो सकता है।

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

6

परिणाम समान हैं, और मुझे लगता है कि प्रदर्शन अंतर भिन्न होने पर नगण्य हैं। असल में, व्यक्तिगत शैली वरीयता का मामला। मैं खुद को संगठनात्मकता के साथ जाऊंगा - मैं केवल आउटपुट बफरिंग का उपयोग करता हूं जब concatenation एक विकल्प नहीं है।

इसके अलावा, ob_get_contents() और ob_clean() दोनों को चलाने के बजाय बस ob_get_clean() चलाएं जो दोनों एक साथ प्रदर्शन करता है।

+0

ob_get_contents बनाम ob_get_clean पर अच्छी कॉल। बदल गया –

+1

4 साल पुरानी पोस्ट को पुनर्जीवित करने के लिए खेद है, लेकिन मैंने इसे भर दिया और यह इंगित करना चाहता था कि 'ob_get_contents()' के बाद 'ob_clean()' 'ob_get_clean()' जैसा नहीं है। ओपी के उद्देश्यों के लिए, यह शायद ठीक है, लेकिन 'ob_get_clean()' ** आउटपुट बफरिंग ** समाप्त होता है जबकि 'ob_get_contents()' और 'ob_clean()' नहीं। मैनुअल के मुताबिक, 'ob_get_clean()' अनिवार्य रूप से 'ob_get_contents()' के रूप में चल रहा है, इसके बाद ** 'ob_end_clean()' **। – Travesty3

2

मुझे लगता है कि जब आप भारी तारों का उपयोग कर रहे हैं तो आउटपुट बफरिंग का उपयोग थोड़ा सा लाभ हो सकता है, लेकिन सामान्य उपयोग के लिए आप मेरी राय में संगतता के साथ बेहतर हैं क्योंकि यह कोड शायद दूसरों को समझना और डीबग करना आसान होगा।

एक छोटा सा बिंदु है, लेकिन आप उत्पादन बफरिंग दृष्टिकोण का उपयोग करने जा रहे हैं, आप के साथ-साथ यह पूरी तरह से उपयोग कर सकते हैं:

ob_start(); 

foreach($items as $item) { 
    echo '<div>'; 
    echo $item; 
    echo '</div>'; 
} 

$test = ob_get_clean(); 
+1

"विशाल" कितना बड़ा है? –

+0

हम्म, हाँ, डुनो। मैंने कोई माप नहीं किया है। निष्पक्ष बिंदु –

2

ऊपर उल्लेख किया है, उत्पादन बफरिंग प्रदर्शन के लिए बेहतर है। बड़े तारों के लिए, प्रदर्शन अंतर बिल्कुल लापरवाही नहीं है। आप PHP में आउटपुट बफरिंग को जावा में स्ट्रिंगबफर/स्ट्रिंगबिल्डर से तुलना कर सकते हैं; स्ट्रिंग कॉन्सटेनेशन के लिए, पूरे स्ट्रिंग को हर बार स्मृति में कॉपी करने की आवश्यकता होती है। आउटपुट बफरिंग के लिए, टेक्स्ट एक बफर में जाता है जो समझदार वृद्धि में बढ़ता है, और प्रत्येक आउटपुट के लिए डेटा कॉपी करने की आवश्यकता नहीं होती है।

आप इनलाइन HTML (यहां तक ​​कि तेज़) का उपयोग करने के बारे में भी सोच सकते हैं। इनलाइन एचटीएमएल के लिए जोड़ा गया लाभ यह है कि आपका आईडीई एचटीएमएल पर सिंटैक्स हाइलाइटिंग कर सकता है, जो तब नहीं होगा जब एचटीएमएल एक PHP स्ट्रिंग के अंदर है। संशोधित कोड (अपेक्षित पर short_open_tags =):

ob_start(); 
?> 

<? foreach($items as $item) { ?> 
    <div><?= $item ?></div> 
<? } ?> 

<? 
$test = ob_get_clean(); 
4

आप स्ट्रिंग संयोजन की भूमि के ऊपर के बारे में चिंतित हैं, तो आप ध्यान दें होना चाहिए कि यह:

गूंज '<div>' $ परीक्षण।।'</div >';

इस से कुछ हद धीमी है:

गूंज '<div>', $ परीक्षण, '</div >';

पहले दो स्ट्रिंग कॉन्सट्स को एक गूंज के बाद संकलित करता है, जबकि दूसरा केवल तीन इकोज़ तक संकलित होता है, जो वास्तव में तेज़ होता है।

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

  • कोई संबंधित समस्या नहीं^_^