आप सभी पर चबाने के लिए के लिए एक काल्पनिक सवाल ...PHP में असीमित रिकर्सिव फ़ंक्शन क्यों एक segfault का कारण बनता है?
मैं हाल ही में एसओ जहां एक PHP स्क्रिप्ट segfaulting गया था पर एक और सवाल का जवाब है, और यह मुझे कुछ मैं हमेशा आश्चर्य होता है की याद दिला दी है, तो देखते हैं अगर कोई शेड कर सकते हैं उस पर कोई प्रकाश।
निम्नलिखित पर विचार करें:
<?php
function segfault ($i = 1) {
echo "$i\n";
segfault($i + 1);
}
segfault();
?>
जाहिर है, इस (बेकार) समारोह असीम लूप। और अंततः, स्मृति से बाहर हो जाएगा क्योंकि पिछले एक से पहले समारोह में प्रत्येक कॉल निष्पादित हो गया है। फोर्किंग के बिना एक कांटा बम की तरह सॉर्ट करें।
लेकिन ... आखिरकार, पॉज़िक्स प्लेटफॉर्म पर, स्क्रिप्ट एसआईजीएसईजीवी के साथ मर जाएगी (यह विंडोज़ पर भी मर जाती है, लेकिन अधिक सुन्दरता से - जहां तक मेरा बेहद सीमित निम्न-स्तर डिबगिंग कौशल बता सकता है)। लूप की संख्या सिस्टम कॉन्फ़िगरेशन (PHP, 32 बिट/64 बिट इत्यादि को आवंटित स्मृति) और ओएस के आधार पर भिन्न होती है लेकिन मेरा असली सवाल यह है - यह एक सेगफॉल्ट के साथ क्यों होता है?
- क्या यह आसानी से PHP "आउट-ऑफ-मेमोरी" त्रुटियों को कैसे संभालता है? निश्चित रूप से इसे संभालने का एक और अधिक शानदार तरीका होना चाहिए?
- क्या यह ज़ेंड इंजन में एक बग है?
- क्या कोई तरीका है जिसे इसे PHP स्क्रिप्ट के भीतर से अधिक सुन्दर तरीके से नियंत्रित या संभाला जा सकता है?
- क्या ऐसी कोई सेटिंग है जो आमतौर पर उस कार्य में किए जा सकने वाले रिकर्सिव कॉल की अधिकतम संख्या को नियंत्रित करती है?
PHP (5 iirc) के आधुनिक संस्करणों को रोकने के लिए रिकर्सन पर गहराई सीमा है इस तरह की चीज़। अगर यह segfaulting है, यह निश्चित रूप से एक बग है कि रिपोर्ट किया जाना चाहिए ... – ircmaxell
[PHP के अनुसार] (https://bugs.php.net/bug.php?id=43187), यह इरादा व्यवहार है। – NullUserException
यदि आप एक ऐसी भाषा की तलाश में हैं जिसमें रिकर्सन सीमा है, तो [पायथन] (http://docs.python.org/library/sys.html#sys.setrecursionlimit) – NullUserException