pengantar
Anda harus menggunakan memory_get_usage(false)
karena yang Anda inginkan adalah memori yang digunakan bukan memori yang dialokasikan.
Apa bedanya
Anda Google Mail
mungkin telah mengalokasikan 25MB
penyimpanan untuk Anda tetapi itu tidak berarti itulah yang telah Anda gunakan saat ini.
Ini persis seperti yang dikatakan oleh dokumen PHP
Setel ini ke TRUE untuk mendapatkan ukuran sebenarnya dari memori yang dialokasikan dari sistem. Jika tidak disetel atau FALSE, hanya memori yang digunakan oleh emalloc () yang dilaporkan.
Kedua argumen tersebut akan mengembalikan memori yang dialokasikan relatif terhadap batas memori tetapi perbedaan utamanya adalah:
memory_get_usage(false)
Berikan memori yang digunakan emalloc()
saat memory_get_usage(true)
mengembalikan tonggak yang bisa didemonstrasikan di sini Memory Mile Store
Saya ingin tahu seberapa dekat skrip mencapai batas itu.
Itu akan membutuhkan beberapa matematika dan mungkin hanya berfungsi dalam loop atau kasus penggunaan tertentu. Mengapa saya mengatakan seperti itu?
Membayangkan
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
.
Sejauh yang saya tahu, satu-satunya cara saya dapat memeriksa memori yang digunakan untuk variabel atau bagian tertentu dari PHP adalah:
$start_memory = memory_get_usage();
$foo = "Some variable";
echo memory_get_usage() - $start_memory;
Lihat Penjelasan , tetapi jika Anda berada dalam fungsi loop atau rekursif, Anda dapat menggunakan penggunaan memori maksimum untuk memperkirakan dengan aman kapan intip memori akan tercapai.
Contoh
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);
}
Keluaran
Stoped at: 95.86%
{
"HIGHEST_MEMORY": "0.71",
"HIGHEST_DIFF": "0.24",
"PERCENTAGE_BREAK": "95.86%",
"AVERAGE": "0.04",
"LOOPS": 11
}
Demo Langsung
Ini mungkin masih gagal
Mungkin gagal karena setelah if ($percentage > $peekPoint) {
ini masih menambah untuk melakukan tugas tambahan dengan juga memakan memori
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.
Kesimpulan
Ini bukan solusi sempurna tetapi periksa memori pada interval dan jika melebihi mengintip (misalnya 90%) secara exit
instan dan tinggalkan barang mewah