2009-02-09 12 views
5

यदि मैं नीचे दिए गए कोड के समान नोड्स की वृक्ष संरचना का उपयोग कर रहा हूं, तो क्या मुझे परिपत्र संदर्भ के बारे में चिंता करने की ज़रूरत है?
मैंने पढ़ा है कि PHP मेमोरी आवंटन तंत्र का उपयोग करता है जो परिपत्र संदर्भों में शामिल होने पर कचरा कलेक्टर के लिए जीवन को बहुत कठिन बना सकता है।PHP की परिपत्र संदर्भ समस्या का स्तर क्या है और क्या मुझे इसके बारे में चिंता करनी चाहिए?

क्या मैं जानना चाहता हूँ है:

  • मेरी पेड़ केवल कुछ नोड्स के होते हैं, तो 25 कहते हैं, यह एक समस्या है?
  • क्या स्मृति को स्क्रिप्ट के अंत में मुक्त किया जाएगा या क्या मैं धीरे-धीरे सर्वर के लिए समस्या पैदा कर रहा हूं?
  • स्क्रिप्ट निष्पादन के दौरान इस समस्या का क्या असर होगा?
  • मैन्युअल रूप से संदर्भों को नष्ट करने से समस्या हल हो जाएगी और क्या मुझे हमेशा ऐसा करना चाहिए?
class Node { 
    private $parent; 
    private $children; 

    function addChild(Node $child) { 
     $this->children[] = $child; 
     $child->setParent($this); 
    } 

    function setParent($parent) { 
     $this->parent = $parent; 
    } 
} 

//eg 
$node0 = new Node; 
$node1 = new Node; 

// nodes 1 and 2 have a circular reference to each other 
$node0->addChild($node1); 
+0

मुझे लगता है कि यह ठीक होना चाहिए। AFAIK, इस प्रकार PHP डीओएम कार्यान्वयन काम करता है। –

उत्तर

4

प्वाइंट:

  • मेरी पेड़ केवल कुछ नोड्स के होते हैं, का कहना है कि 25, यह एक समस्या है?

जब तक आपके नोड असली राक्षस न हों।

  • स्मृति स्क्रिप्ट के अंत में मुक्त हो जाएगा या मैं धीरे धीरे सर्वर के लिए एक समस्या पैदा कर रहा हूँ?

जब दुभाषिया बंद हो जाता है तो सभी स्मृति जारी हो जाती है।

  • के तहत किन परिस्थितियों इस समस्या को स्क्रिप्ट निष्पादन के दौरान असर पड़ेगा?

मुझे शक है आप के बारे में जब तक आप बहुत कम स्मृति सीमा या बहुत बड़ी गतिशील डेटा संरचनाओं है चिंता करने के लिए कुछ भी करेंगे।यदि आपके पास 25 नोड्स हैं जिन्हें अक्सर बनाया/मुक्त नहीं किया जा रहा है तो आपको कोई समस्या नहीं होगी।

  • मैन्युअल को नष्ट करेंगे संदर्भ समस्या का समाधान और मैं हमेशा यह करना चाहिए?

इससे मदद मिलेगी। प्रोपेल के साथ हमारे डेटाबेस में एक बड़ा डेटा सेट लोड करते समय हम स्मृति खपत के साथ बहुत सारी समस्याएं चलाते थे जिसे हमने परिपत्र संदर्भों को ट्रैक नहीं किया था। हमारा समाधान एक विधि को कॉल करना था जो सभी संदर्भों को मंजूरी दे दी थी।

+0

आपने यह तरीका कैसे बनाया है। मैं अपने स्वयं के ओआरएम के साथ एक ही समस्या में भाग रहा हूं। – andho

+0

केवल परीक्षण में समस्याएं हैं, क्योंकि अन्यथा स्क्रिप्ट इतनी लंबी नहीं हैं। – andho

+0

दुर्भाग्यवश यह लंबे समय से रहा है क्योंकि मैंने प्रोपेल पर काम किया है और अब मुझे कोड तक पहुंच नहीं है। क्षमा करें, और कौन। – sig11

3

हो सकता है कि ऐसा है, लेकिन जब से यह हर अनुरोध के अंत में सभी वस्तुओं को बाहर फेंक (जब तक आप कैशिंग कर रहे हैं), मैं नहीं कई पीएचपी प्रोग्रामर इस बारे में चिंता लगता।

यदि आप PHP में कमांड लाइन स्क्रिप्ट लिख रहे हैं, तो शायद आपको इसके बारे में चिंता करने का मामला मिल गया है, लेकिन इससे पहले कि आप चिंता करने योग्य कुछ हो जाए, आपको कुछ सुंदर ठोस PHP कोड लिखना होगा। और यदि ऐसा है तो आपको बड़ी समस्याएं हैं।

शुभकामनाएं।

+0

इसके अतिरिक्त, __destruct() विधि है। –

2

अधिकांश PHP पृष्ठों की प्रकृति को देखते हुए - यानी, यह प्रक्रिया वेबपृष्ठ के लिए चलती है और इसे पूरा होने पर फेंक दिया जाता है - मुझे संदेह है कि यह एक समस्या है। मैंने सर्कुलर संदर्भों से पहले समस्याओं को नहीं देखा है और बिना किसी समस्या के उन्हें इस्तेमाल किया है। मेरे अनुभव में, आप केवल स्मृति खपत के साथ और अधिक समस्याओं में भाग लेंगे, लेकिन PHP 5 ने कुछ हद तक बताया है कि कुछ हद तक वस्तुओं और सरणी की प्रतिलिपि बनाने से दूर स्थानांतरित हो गया है। बिंदु से

2

PHP 5.3 में परिपत्र संदर्भ पहचान और विनाश सुविधाएं शामिल होंगी। यह एक वैकल्पिक सेटिंग है, और इसे केवल तभी उपयोग किया जाना चाहिए जब कचरा कलेक्टर प्रदर्शन प्रदर्शन करेगा, लेकिन यह आपके उदाहरण के लिए बनाया गया है।

अब विकसित करें, __destruct() विधि में स्पष्ट रूप से अव्यवस्था के लिए सावधानी बरतें, और जब संभव हो तो 5.3 तक अपग्रेड करें।

+3

जहां तक ​​मुझे याद है (php5.3 से पहले) __destruct केवल तब कॉल किया जाता है जब ऑब्जेक्ट को कोई संदर्भ नहीं दिया जाता है। इसलिए __destruct को स्पष्ट रूप से बुलाया जाना चाहिए यदि यह एक परिपत्र संदर्भ का हिस्सा है। – dsas

+0

'__destruct' को PHP 5.3 में स्क्रिप्ट के अंत में' शट डाउन अनुक्रम 'के हिस्से के रूप में बुलाया जाएगा। हालांकि, उस स्थिति में कॉलिंग अनुक्रम यादृच्छिक है (यानी, '__destruct' कहा जा सकता है जबकि अन्य ऑब्जेक्ट्स में अभी भी ऑब्जेक्ट के संदर्भ हैं)। –

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

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