память исчерпана из-за использования около 2 МБ памяти - PullRequest
1 голос
/ 07 августа 2020

Я борюсь с php, у которого проблема с памятью.

Скрипт умирает с сообщением: PHP Fatal error: Allowed memory size of 2097152 bytes exhausted (tried to allocate 3027408 bytes) in test.php on line 9

Я создал небольшой тестовый скрипт:

<?php
function memstat($file, $line) 
{
    $memlog = fopen('mem.log', "a+");
    fwrite($memlog, sprintf('mem @ %s %d: %d (%d; peek: %d)'.PHP_EOL, $file, $line, memory_get_usage(), memory_get_usage(true), memory_get_peak_usage()));
    fclose($memlog);
}
memstat(__FILE__, __LINE__);
$str = str_pad('', 1523687, ' ');
memstat(__FILE__, __LINE__);
print 'end '.strlen($str);
?>

Этот скрипт работает на php 7.4 без cra sh, но когда я увеличиваю параметр длины str_pad до 1523688, он умирает с сообщением выше. И этот скрипт работает на php7 .2, когда параметр длины равен 1515495, но cra sh, когда он равен 1515496. И я тестировал его с php5 .6 на том же сервере, и он работает без каких-либо проблем.

Скрипт cra sh не важно, как я его запускаю, apache или cli. apache был перезапущен после изменений ini, это не проблема.

Я тестировал его с 2 ГБ memory_limit и получил то же сообщение об ошибке. Это работает, только если я изменю memory_limit на -1, но я не думаю, что это правильное решение, я имею в виду, что что-то не так, если 512 МБ недостаточно для этого маленького скрипта. Мне кажется, что php выделяет 2097152 памяти при запуске и при первой попытке выделить больше системной памяти происходит сбой.

На моем собственном компьютере с теми же apache и php 7 версий, проблем нет.

Среда:

Pro c: Intel Xeon E5-2620

Mem: 8GB

Op: Win10 Pro 64-битный

Веб-сервер: Apache / 2.4.29 (Win64) Apache Lounge VC11 Server построен: 6 ноября 2017 г. 11: 17: 28

Php: 7.4.8 и 7.2. 32

Есть ли у кого-нибудь идеи, что может вызвать такую ​​ошибку?

редактировать

Пилан написал немного другой сценарий. Я выполнил сценарий на проблемном c компьютере, и результат был следующим:

string(3) "2GB"
mem @ C:\web\test.php 15: 0.37 MB (2.00 MB; peak: 0.41 MB)

Fatal error: Allowed memory size of 2097152 bytes exhausted (tried to allocate 10000024 bytes) in C:\web\test.php on line 16

Как вы можете видеть, memory_limit составляет 2 ГБ, и он все равно умирает, когда пытается выделить более 2 МБ.

1 Ответ

1 голос
/ 08 августа 2020

Посмотрите на свой memory_limit. В ошибке написано Allowed memory size of 2097152 bytes exhausted. Что не 2GB

console.log(2097152 / 2**20 + "MB");
var_dump(ini_get('memory_limit'));

function memstat($file, $line) {
    echo sprintf(
        'mem @ %s %d: %.2f MB (%.2f MB; peak: %.2f MB)' . PHP_EOL,
        $file,
        $line,
        memory_get_usage() /2**20,
        memory_get_usage(true) /2**20,
        memory_get_peak_usage() /2**20
    );
}

memstat(__FILE__, __LINE__);
$str = str_pad('', 9999999, ' ');
memstat(__FILE__, __LINE__);
print 'end '.strlen($str);

Рабочий пример .

вывод

string(3) "64M"
mem @ /in/BHqWd 16: 0.37 MB (2.00 MB; peak: 0.41 MB)
mem @ /in/BHqWd 18: 9.91 MB (11.54 MB; peak: 9.91 MB)
end 9999999
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...