2011-01-17 20 views
12

इससे पहले कि आप मुझे बता मैनुअल पढ़ने की, बाहर की जाँच php.net documentation for this function:PHP का gc_enable फ़ंक्शन वास्तव में क्या करता है?

चेतावनी
इस समारोह वर्तमान में दर्ज नहीं किया जाता है; केवल इसकी तर्क सूची उपलब्ध है।

यह सहायक था!

This page बताता है कि यह चक्रीय संदर्भों के लिए कचरा संग्रह सक्षम बनाता है। यह कब और कब उपयोगी है? क्या कोई मुझे इसके उपयोग का एक उदाहरण दिखा सकता है? अधिमानतः एक उदाहरण जहां एक चक्रीय संदर्भ बनाया गया है और फिर एकत्र किया गया है।

उत्तर

14

gc_enable केवल तभी आवश्यक है जब आप gc_disable पर कॉल करें। ऐसा करने के लिए वास्तव में कोई सौहार्दपूर्ण कारण नहीं है, क्योंकि इससे चक्रीय संदर्भों को कचरा नहीं बनाया जाएगा (जैसे प्री-5.3, जब चक्रीय जीसी मौजूद नहीं था)।

PHP का कचरा कलेक्टर संदर्भ गिनती द्वारा काम करता है। आप किसी ऑब्जेक्ट को "पॉइंटर" के रूप में एक चर के बारे में सोच सकते हैं। जब किसी ऑब्जेक्ट के पास कोई संकेत नहीं होता है, तो यह "मृत" होता है क्योंकि कुछ भी नहीं पहुंच सकता है, इसलिए यह कचरा इकट्ठा होता है।

//one thing points to the Foo object 
$a = new Foo(); 

//now two things do 
$b = $a; 

//now only $b points to it 
$a = null; 

//now nothing points to Foo, so php garbage collects the object 
$b = null; 

हालांकि इस पर विचार करें:

$a = new Foo(); 
$b = new Bar(); 
$b->foo = $a; 
$a->bar = $b; 

$a = $b = null; 

इस बात कुछ भी नहीं पर $ एक या $ वस्तुओं खुद को छोड़कर ख को पकड़ने में किया जाता है। यह एक चक्रीय संदर्भ है, और PHP के पिछले संस्करणों में (< 5.3), एकत्र नहीं किया जाएगा। 5.3 में चक्रीय कलेक्टर अब इसका पता लगा सकता है और इन वस्तुओं को साफ कर सकता है।

+0

तो आप जो कह रहे हैं वह यह है कि यह डिफ़ॉल्ट रूप से चालू है, और इसलिए मुझे इसके बारे में चिंता करने की ज़रूरत नहीं है जब तक कि कुछ त्यागने के कारण मैं इसे 'gc_disable' से बंद कर दूं? – Stephen

+0

@ स्टीफन: हाँ, बिल्कुल। ईमानदारी से इस सुविधा को बंद करने का कोई कारण नहीं है। एकमात्र तरीका चक्रीय संदर्भ एकत्र किया जा सकता है जब यह चालू है। – ryeguy

+0

जीसी बंद करने का एकमात्र कारण यह गारंटी देना है कि स्क्रिप्ट प्रदर्शन प्रभावी रूप से जीसी ट्रिगर द्वारा प्रभावित नहीं होता है जो स्क्रिप्ट प्रोसेसिंग को रोक देगा। हालांकि, अगर स्क्रिप्ट जीसी और जीसी को बंद कर देगी, तो आगे के चक्रीय संदर्भ हमेशा के लिए लीक हो जाते हैं (या जब तक ओएस कर्नेल प्रक्रिया को मारता है)। –

8

एक पूर्ण chapter on Garbage Collection in the PHP Manual इस समझा है:

मैं आम तौर पर सिर्फ ऑफसाइट लिंक नहीं की कोशिश, लेकिन यह बहुत ज्यादा संक्षेप में प्रस्तुत करने के लिए लग रहा है।

+1

उत्कृष्ट ...इसे वास्तव में संदर्भित दस्तावेज़ प्रलेखन में जोड़ा जाना चाहिए। – Stephen

+0

@Stephen [zend.enable_gc] (http://us3.php.net/manual/en/info.configuration.php#ini.zend.enable-gc) के लिए (संक्षिप्त) विवरण भी है [ini में सेक्शन] (http://us3.php.net/manual/en/ini.list.php) जो इसे डिफ़ॉल्ट रूप से सक्षम करता है। – Gordon

1

ऐसे कारण हैं जिनका हम gc_disable और gc_enable का उपयोग करते हैं।

नवीनतम पीएचपी पुस्तिका में, यह

में कहा गया है, बड़े परियोजनाओं के लिए बहुत उपयोगी हो सकता है जब आप वस्तुओं है कि स्मृति में रहना चाहिए की एक बहुत कुछ पैदा करते हैं। तो जीसी उन्हें साफ नहीं कर सकता और बस सीपीयू समय बर्बाद कर सकता है।

संगीतकार में

मुद्दा: https://github.com/composer/composer/pull/3482#issuecomment-65199153

समाधान और लोगों को उत्तर: https://github.com/composer/composer/commit/ac676f47f7bbc619678a29deae097b6b0710b799

कृपया याद दिलाया जाना है कि दूसरी कड़ी ऊपर ग्राफिक्स के साथ टिप्पणियों का एक बहुत कुछ शामिल है।

+0

ये उत्तरों बहुत ही अच्छे हैं। –

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