2012-09-06 25 views
9

मेरे पास एक php स्क्रिप्ट है जो लगभग 2 घंटे तक चलती है। यह एक क्रॉन नौकरी है। क्रॉन नौकरी हर 4 घंटे चलता है।memory_limit: यह कैसे काम करता है?

स्क्रिप्ट के अंत में, मैं कुछ मेमोरी मान प्रदर्शित करता हूं।

The memory_get_usage() result is 881568 Bytes (0.840766906738M) 
The memory_get_peak_usage() result is 1340304 Bytes (1.27821350098M) 
The memory_get_usage(true) result is 1572864 Bytes (1.5M) 
The memory_get_peak_usage(true) result is 1835008 Bytes (1.75M) 

php.ini में memory_limit 128M था और यह काम नहीं करता था। मैं इसे 256 एम तक बढ़ाता हूं और अब यह काम करता है।

लेकिन जैसे स्क्रिप्ट की स्मृति शिखर 2M से भी कम है ....

तो memory_limit पैरामीटर काम करता है?

क्या यह स्क्रिप्ट द्वारा उपयोग की जाने वाली कुल मेमोरी है? यदि हां, तो मैं इसकी गणना कैसे कर सकता हूं?

क्या यह स्क्रिप्ट का स्मृति शिखर है? यदि हां, तो क्या मैं इसकी गणना कर रहा हूं?

मैं PHP 5.3.16 का उपयोग कर रहा हूं।

संपादित

मैं किसी भी त्रुटि संदेश नहीं है। जब सीमा 128 एम थी, स्क्रिप्ट निष्पादित होती है, लेकिन कभी खत्म नहीं होती है।

+0

आप एक ही सर्वर पर और क्या चल रहे हैं? –

+0

यदि आपकी स्क्रिप्ट मेमोरी सीमा त्रुटि के साथ दुर्घटनाग्रस्त हो गई है, तो आपने लॉग संदेशों को कैसे देखा? – galymzhan

+0

@galymzhan जब सीमा 256 एमबी तक बढ़ी थी तो यह क्रैश नहीं हुआ था, जब यह 128 एमबी पर सेट किया गया था तो यह दुर्घटनाग्रस्त हो गया था। हालांकि अब यह 256 एमबी मार्म पर सेट है यह देखते हैं कि चरम स्मृति उपयोग 128 एमबी सीमा के पास नहीं है, उसका सवाल है तो उसे इसे काम करने के लिए सीमा की आवश्यकता क्यों है? – Lee

उत्तर

4

एक ऐसे फ़ंक्शन का उपयोग करने का प्रयास करें जो आपके ऑपरेटिंग सिस्टम का उपयोग करता है ताकि वास्तविक स्मृति की रिपोर्ट हो सके।

function unix_get_usage() { 
     $pid = getmypid(); 
     exec("ps -o rss -p $pid", $output); 
     return $output[1] *1024; 
} 

function windows_get_usage(){ 
    $output = array(); 
    exec('tasklist /FI "PID eq '.getmypid().'" /FO LIST', $output); 
    return preg_replace('/[^0-9]/', '', $output[5]) * 1024; 
} 

आपकी स्क्रिप्ट शायद याद है कि जब memory_get_usage से लौट रहे पीएचपी पर विचार नहीं करता का एक बहुत की खपत() (जो ढेर पर btw दिखता है)। स्टेक आवंटित चर को स्मृति_get_usage() को कॉल किया गया था और वापस लौटा दिया गया था।

आपको निष्पादन के दौरान अन्य कार्यों पर इस फ़ंक्शन और अन्य को चलाने का भी प्रयास करना चाहिए, उदा। बड़े MySQL कॉल या फ़ाइल प्रसंस्करण के बाद। memory_get_peak_usage() सभी ओएस पर काम नहीं कर सकता है, खासकर संकलन विकल्पों के आधार पर।

+0

यह समझ में आता है, लेकिन क्या यह 'memory_get_peak_usage() 'के साथ कोई समस्या नहीं होनी चाहिए? मैं ऐसा नहीं सोचूंगा, लेकिन जैसा कि आप सुझाव देते हैं, मेमोरी उपयोग को जांचने के लिए यह कोई दिक्कत नहीं होगी। – Wiseguy

+0

यदि दोनों (memory_get_peak_usage और memory_get_usage) केवल ढेर को देखते हैं और आपकी अधिकांश मेमोरी पूरी तरह स्वचालित/स्टैक आवंटित चर है। –

+0

और मुझे इस फ़ंक्शन को हर जगह उन चीज़ों पर कॉल करना होगा जो मैं बहुत मेमोरी का उपयोग करता हूं? क्या स्टैक शिखर पाने के लिए कोई सिस्टम फ़ंक्शन है? क्योंकि मुझे यकीन नहीं है कि मेरी स्क्रिप्ट कितनी मेमोरी का उपयोग करती है – Marm

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