Giriş
Kullanmalısınız memory_get_usage(false)
çünkü istediğiniz bellek ayrılmış bellek değil kullanılır.
Fark ne
Sizin için depolama alanı Google Mail
tahsis etmiş olabilirsiniz, 25MB
ancak bu şu anda kullandığınız şeyin bu olduğu anlamına gelmez.
PHP belgesinin söylediği tam olarak buydu
Sistemden ayrılan gerçek bellek boyutunu almak için bunu TRUE olarak ayarlayın. Ayarlanmazsa veya YANLIŞ ise yalnızca emalloc () tarafından kullanılan bellek rapor edilir.
Her iki bağımsız değişken de bellek sınırına göre ayrılmış belleği döndürür, ancak temel fark şudur:
memory_get_usage(false)
Burada gösterilebilecek olan emalloc()
while memory_get_usage(true)
return kilometre taşının kullandığı belleği verin Memory Mile Store
Komut dosyasının bu limite ne kadar yaklaştığını bilmek istiyorum.
Bu biraz matematik gerektirir ve yalnızca döngülerde veya belirli kullanım durumlarında işe yarayabilir. Neden böyle söyledim
Hayal etmek
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'nin bir değişken veya belirli bir bölümü için kullanılan belleği kontrol etmenin tek yolunu bildiğim kadarıyla:
$start_memory = memory_get_usage();
$foo = "Some variable";
echo memory_get_usage() - $start_memory;
Açıklamaya bakın , ancak bir döngü veya özyinelemeli işlev içindeyseniz, bellek zirvesine ne zaman ulaşılacağını güvenli bir şekilde tahmin etmek için maksimum bellek kullanımını kullanabilirsiniz.
Misal
ini_set('memory_limit', '1M');
$memoryAvailable = filter_var(ini_get("memory_limit"), FILTER_SANITIZE_NUMBER_INT);
$memoryAvailable = $memoryAvailable * 1024 * 1024;
$peekPoint = 90;
$memoryStart = memory_get_peak_usage(false);
$memoryDiff = 0;
$stat = array(
"HIGHEST_MEMORY" => 0,
"HIGHEST_DIFF" => 0,
"PERCENTAGE_BREAK" => 0,
"AVERAGE" => array(),
"LOOPS" => 0
);
$data = "";
$i = 0;
while ( true ) {
$i ++;
$memoryUsed = memory_get_peak_usage(false);
$memoryDiff = $memoryUsed - $memoryStart;
$memoryStart = memory_get_peak_usage(false);
$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;
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);
}
Çıktı
Stoped at: 95.86%
{
"HIGHEST_MEMORY": "0.71",
"HIGHEST_DIFF": "0.24",
"PERCENTAGE_BREAK": "95.86%",
"AVERAGE": "0.04",
"LOOPS": 11
}
Canlı Demo
Bu hala başarısız olabilir
Başarısız olabilir çünkü bundan sonra if ($percentage > $peekPoint) {
hala ek görevler yapmak için ek olarak bellek de tüketir
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.
Sonuç
Mükemmel bir çözüm değil, ancak aralıklı olarak belleği kontrol edin ve hızlı bir şekilde göz atıp aşmadığını (ör.% 90) exit
ve süslü şeyleri bırakın