परिचय
आपको उपयोग करना चाहिए memory_get_usage(false)
क्योंकि आप जो चाहते हैं वह मेमोरी है जिसका उपयोग मेमोरी आवंटित नहीं किया गया है।
क्या फर्क पड़ता है
आपके द्वारा आपके लिए भंडारण का Google Mail
आवंटन किया जा सकता है 25MB
लेकिन इसका मतलब यह नहीं है कि आपने इस समय क्या उपयोग किया है।
यह वही है जो PHP डॉक्टर कह रहा था
सिस्टम से आवंटित स्मृति का वास्तविक आकार प्राप्त करने के लिए इसे TRUE पर सेट करें। यदि सेट नहीं किया गया है या एफएएलएसई केवल एमालोक () द्वारा उपयोग की जाने वाली मेमोरी को सूचित करता है।
दोनों तर्क स्मृति सीमा के सापेक्ष आवंटित स्मृति को लौटा देंगे लेकिन मुख्य अंतर यह है:
memory_get_usage(false)
emalloc()
जब memory_get_usage(true)
मील का पत्थर इस्तेमाल किया जाता है तो मेमोरी दें जो यहां मेमोरी माइल स्टोर का प्रदर्शन हो सकता है
मैं जानना चाहता हूं कि उस सीमा को हिट करने के लिए स्क्रिप्ट कितनी करीब थी।
यह कुछ गणित लेगा और केवल लूप या विशिष्ट उपयोग के मामलों में काम कर सकता है। मैंने ऐसा क्यों कहा?
कल्पना कीजिए
ini_set('memory_limit', '1M');
$data = str_repeat(' ', 1024 * 1024);
The above script would fail before you even get the chance to start start checking memory
।
जहाँ तक मुझे पता है एक ही रास्ता है कि मैं PHP के एक चर या विशिष्ट खंड के लिए उपयोग की जाने वाली मेमोरी की जाँच कर सकता हूँ:
$start_memory = memory_get_usage();
$foo = "Some variable";
echo memory_get_usage() - $start_memory;
स्पष्टीकरण देखें , लेकिन यदि आप किसी लूप या पुनरावर्ती फ़ंक्शन में हैं, तो आप अधिकतम मेमोरी उपयोग का उपयोग करके सुरक्षित रूप से अनुमान लगाने के लिए कर सकते हैं कि मेमोरी पीक कब तक पहुंच जाएगी।
उदाहरण
ini_set('memory_limit', '1M');
$memoryAvailable = filter_var(ini_get("memory_limit"), FILTER_SANITIZE_NUMBER_INT);
$memoryAvailable = $memoryAvailable * 1024 * 1024;
$peekPoint = 90; // 90%
$memoryStart = memory_get_peak_usage(false);
$memoryDiff = 0;
// Some stats
$stat = array(
"HIGHEST_MEMORY" => 0,
"HIGHEST_DIFF" => 0,
"PERCENTAGE_BREAK" => 0,
"AVERAGE" => array(),
"LOOPS" => 0
);
$data = "";
$i = 0;
while ( true ) {
$i ++;
// Get used memory
$memoryUsed = memory_get_peak_usage(false);
// Get Diffrence
$memoryDiff = $memoryUsed - $memoryStart;
// Start memory Usage again
$memoryStart = memory_get_peak_usage(false);
// Gather some stats
$stat['HIGHEST_MEMORY'] = $memoryUsed > $stat['HIGHEST_MEMORY'] ? $memoryUsed : $stat['HIGHEST_MEMORY'];
$stat['HIGHEST_DIFF'] = $memoryDiff > $stat['HIGHEST_DIFF'] ? $memoryDiff : $stat['HIGHEST_DIFF'];
$stat['AVERAGE'][] = $memoryDiff;
$stat['LOOPS'] ++;
$percentage = (($memoryUsed + $stat['HIGHEST_DIFF']) / $memoryAvailable) * 100;
// var_dump($percentage, $memoryDiff);
// Stop your scipt
if ($percentage > $peekPoint) {
print(sprintf("Stoped at: %0.2f", $percentage) . "%\n");
$stat['AVERAGE'] = array_sum($stat['AVERAGE']) / count($stat['AVERAGE']);
$stat = array_map(function ($v) {
return sprintf("%0.2f", $v / (1024 * 1024));
}, $stat);
$stat['LOOPS'] = $i;
$stat['PERCENTAGE_BREAK'] = sprintf("%0.2f", $percentage) . "%";
echo json_encode($stat, 128);
break;
}
$data .= str_repeat(' ', 1024 * 25); // 1kb every time
}
उत्पादन
Stoped at: 95.86%
{
"HIGHEST_MEMORY": "0.71",
"HIGHEST_DIFF": "0.24",
"PERCENTAGE_BREAK": "95.86%",
"AVERAGE": "0.04",
"LOOPS": 11
}
लाइव डेमो
यह अभी भी विफल हो सकता है
यह विफल हो सकता है क्योंकि इसके बाद if ($percentage > $peekPoint) {
भी अभी भी अतिरिक्त कार्य करने के लिए जोड़ने के साथ भी मेमोरी की खपत होती है
print(sprintf("Stoped at: %0.2f", $percentage) . "%\n");
$stat['AVERAGE'] = array_sum($stat['AVERAGE']) / count($stat['AVERAGE']);
$stat = array_map(function ($v) {
return sprintf("%0.2f", $v / (1024 * 1024));
}, $stat);
$stat['LOOPS'] = $i;
$stat['PERCENTAGE_BREAK'] = sprintf("%0.2f", $percentage) . "%";
echo json_encode($stat, 128);
break;
If the memory to process this request is grater than the memory available the script would fail.
निष्कर्ष
इसका एक सही समाधान नहीं है, लेकिन अंतराल पर स्मृति की जांच करें और यदि इसकी अधिक मात्रा (जैसे 90%) exit
झटपट दिखाई दे और फैंसी सामान छोड़ दें