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 में चक्रीय कलेक्टर अब इसका पता लगा सकता है और इन वस्तुओं को साफ कर सकता है।
तो आप जो कह रहे हैं वह यह है कि यह डिफ़ॉल्ट रूप से चालू है, और इसलिए मुझे इसके बारे में चिंता करने की ज़रूरत नहीं है जब तक कि कुछ त्यागने के कारण मैं इसे 'gc_disable' से बंद कर दूं? – Stephen
@ स्टीफन: हाँ, बिल्कुल। ईमानदारी से इस सुविधा को बंद करने का कोई कारण नहीं है। एकमात्र तरीका चक्रीय संदर्भ एकत्र किया जा सकता है जब यह चालू है। – ryeguy
जीसी बंद करने का एकमात्र कारण यह गारंटी देना है कि स्क्रिप्ट प्रदर्शन प्रभावी रूप से जीसी ट्रिगर द्वारा प्रभावित नहीं होता है जो स्क्रिप्ट प्रोसेसिंग को रोक देगा। हालांकि, अगर स्क्रिप्ट जीसी और जीसी को बंद कर देगी, तो आगे के चक्रीय संदर्भ हमेशा के लिए लीक हो जाते हैं (या जब तक ओएस कर्नेल प्रक्रिया को मारता है)। –