память получает пиковое использование () с "реальным использованием"
если real_usage аргумент имеет значение true PHP DOCS говорят, что он получит реальный размер памяти, выделенной из системы. Если это false он получит память, сообщенную emalloc()
какой из этих 2 вариантов возвращает максимум. память, выделенная относительно предельного значения памяти в PHP.Ини ?
Я хочу знать, насколько близко был сценарий, чтобы достичь этого предела.
4 ответов:
Ок, давайте проверим это с помощью простого скрипта:
ini_set('memory_limit', '1M'); $x = ''; while(true) { echo "not real: ".(memory_get_peak_usage(false)/1024/1024)." MiB\n"; echo "real: ".(memory_get_peak_usage(true)/1024/1024)." MiB\n\n"; $x .= str_repeat(' ', 1024*25); //store 25kb more to string }выход:
not real: 0.73469543457031 MiB real: 0.75 MiB not real: 0.75910949707031 MiB real: 1 MiB ... not real: 0.95442199707031 MiB real: 1 MiB not real: 0.97883605957031 MiB real: 1 MiB PHP Fatal error: Allowed memory size of 1048576 bytes exhausted (tried to allocate 793601 bytes) in /home/niko/test.php on line 7похоже, что реальное использование-это память, выделенная из системы, которая, похоже, выделяется в больших ведрах, чем в настоящее время требуется сценарию. (Я думаю, по соображениям производительности). Это также память, которую использует процесс php.
The
$real_usage = falseиспользование-это использование памяти, которое вы фактически использовали в своем скрипте, а не фактический объем памяти, выделенный памятью Zend менеджер.читать этот вопрос для получения дополнительной информации.
короче говоря: чтобы получить, как близко вы к пределу памяти, используйте
$real_usage = true
введение
вы должны использовать
memory_get_usage(false)потому что вы хотите, чтобы память использовалась, а не выделялась.какая разница
код
Google Mailможет быть выделено25MBхранения для вас, но это не означает, что это то, что вы использовали в данный момент.это именно то, что говорил PHP doc
установите значение TRUE, чтобы получить реальный размер памяти выделено из системы. Если не установлено или FALSE, то сообщается только память, используемая emalloc ().
оба аргумента будут возвращать память, выделенную относительно предела памяти, но основное различие:
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мгновенно и оставить модные вещи
real_usageложные сообщения об использовании вашего скрипта используется. Это будет более точным из двух.
real_usagetrue сообщает память выделено в свой сценарий. Это будет более высокий из двух.Я бы, наверное, использовал
trueесли бы я пытался сравнить, так как ваш скрипт никогда не будет выделен больше, чем ограничение памяти, и будет продолжать работать до тех пор, пока он (плюс все другие скрипты) не превысит это использование.
согласно PHP помощью функции memory_get_usage
real_usage
установите значение TRUE, чтобы получить общую память, выделенную из системы, включая неиспользуемые страницы. Если не установлено или FALSE, сообщается только об используемой памяти.
поэтому, чтобы получить память, используемую вашим скриптом, вы должны использовать memory_get_usage (), поскольку значение по умолчанию real_usage равно false.
Если вы хотите получить память, выделенную системой, но не волнует, сколько было фактически использовано, используйте memory_get_usage (true);
Comments