память получает пиковое использование () с "реальным использованием"



если real_usage аргумент имеет значение true PHP DOCS говорят, что он получит реальный размер памяти, выделенной из системы. Если это false он получит память, сообщенную emalloc()



какой из этих 2 вариантов возвращает максимум. память, выделенная относительно предельного значения памяти в PHP.Ини ?



Я хочу знать, насколько близко был сценарий, чтобы достичь этого предела.

560   4  

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
}

Live Demo

это все еще может не сработать

он может потерпеть неудачу, потому что после 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_usage true сообщает память выделено в свой сценарий. Это будет более высокий из двух.

Я бы, наверное, использовал true если бы я пытался сравнить, так как ваш скрипт никогда не будет выделен больше, чем ограничение памяти, и будет продолжать работать до тех пор, пока он (плюс все другие скрипты) не превысит это использование.

согласно PHP помощью функции memory_get_usage

real_usage

установите значение TRUE, чтобы получить общую память, выделенную из системы, включая неиспользуемые страницы. Если не установлено или FALSE, сообщается только об используемой памяти.

поэтому, чтобы получить память, используемую вашим скриптом, вы должны использовать memory_get_usage (), поскольку значение по умолчанию real_usage равно false.

Если вы хотите получить память, выделенную системой, но не волнует, сколько было фактически использовано, используйте memory_get_usage (true);

Comments

    Ничего не найдено.