Giới thiệu
Bạn nên sử dụng memory_get_usage(false)
vì những gì bạn muốn là bộ nhớ được sử dụng chứ không phải bộ nhớ được cấp phát.
Có gì khác biệt
Bạn Google Mail
có thể đã phân bổ 25MB
dung lượng lưu trữ cho bạn nhưng không có nghĩa đó là những gì bạn đã sử dụng vào lúc này.
Đây chính xác là những gì tài liệu PHP đã nói
Đặt giá trị này thành TRUE để nhận kích thước thực của bộ nhớ được cấp phát từ hệ thống. Nếu không được đặt hoặc FALSE, chỉ bộ nhớ được sử dụng bởi emalloc () được báo cáo.
Cả hai đối số sẽ trả về bộ nhớ được cấp phát liên quan đến giới hạn bộ nhớ nhưng sự khác biệt chính là:
memory_get_usage(false)
cung cấp cho bộ nhớ được sử dụng bởi emalloc()
trong khi memory_get_usage(true)
trả về cột mốc có thể được minh họa ở đây Memory Mile Store
Tôi muốn biết kịch bản đã đạt đến giới hạn đó gần đến mức nào.
Điều đó sẽ mất một số phép toán và có thể chỉ hoạt động trong các vòng lặp hoặc các trường hợp sử dụng cụ thể. Tại sao tôi lại nói như vậy?
Tưởng tượng
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
.
Theo như tôi biết, cách duy nhất tôi có thể kiểm tra bộ nhớ được sử dụng cho một biến hoặc phần cụ thể của PHP là:
$start_memory = memory_get_usage();
$foo = "Some variable";
echo memory_get_usage() - $start_memory;
Xem phần Giải thích , nhưng nếu bạn đang ở trong một hàm lặp hoặc hàm đệ quy, bạn có thể sử dụng mức sử dụng bộ nhớ tối đa để ước tính một cách an toàn khi nào đạt đến tốc độ bộ nhớ.
Thí dụ
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
}
Đầu ra
Stoped at: 95.86%
{
"HIGHEST_MEMORY": "0.71",
"HIGHEST_DIFF": "0.24",
"PERCENTAGE_BREAK": "95.86%",
"AVERAGE": "0.04",
"LOOPS": 11
}
Bản thử trực tiếp
Điều này vẫn có thể thất bại
Nó có thể không thành công vì sau if ($percentage > $peekPoint) {
đó vẫn còn thêm để thực hiện tác vụ bổ sung và cũng tiêu tốn bộ nhớ
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.
Phần kết luận
Nó không phải là một giải pháp hoàn hảo nhưng hãy kiểm tra bộ nhớ trong khoảng thời gian và nếu nó vượt quá mức nhìn thấy (ví dụ: 90%) exit
ngay lập tức và để lại những thứ ưa thích