Я борюсь с 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 МБ.