PHP не может использовать 300 МБ оперативной памяти - PullRequest
6 голосов
/ 31 января 2012

Я пытаюсь увеличить разрешенную память для определенного скрипта PHP.Независимо от того, что я делаю, например, это:

ini_set('memory_limit', '512M');

... скрипту всегда не хватает памяти около 300 МБ:

Fatal error: Out of memory (allocated 25165824) (tried to allocate 343810589 bytes) in \\Foo\phpQuery\phpQuery.php on line 255

Я несколько раз проверял, чтоmemory_limit фактически изменилось.Кажется, проблема в том, что PHP не может физически выделить 300 МБ памяти (25165824 байт + 343810589 байт = 352 МБ).

Я пробовал как PHP / 5.3.0, так и PHP / 5.3.9 на двух разных компьютерах под управлением Windows со следующими характеристиками:

  • Windows XP / Windows Server 2003 (оба компьютера являются 32-разрядными блоками с 1 ГБ или ОЗУ)
  • Официальный PHP32-разрядные двоичные файлы VC9
  • Запуск в качестве модуля Apache 2.2 (сторонние 32-разрядные двоичные файлы VC9)

Я понимаю, что использование половины физической ОЗУ приведет к перестановке и замедлению работычерт возьми, но мне просто нужно убедиться, что скрипт действительно работает, чтобы его можно было развернуть на работающем сервере.Я также пробовал большие значения (которые вызывали ту же ошибку) и меньшие значения (либо заставил мой скрипт достигнуть предела, либо сделал сбой Apache).

Что может быть источником этой явно жестко запрограммированной памятиlimit?

Обновление № 1: Я провел дополнительное тестирование с помощью Windows Server 2003 (которая фактически является виртуальной машиной VMWare).Я увеличил «физическую» оперативную память до 2 ГБ и убедился, что файлу подкачки разрешено увеличиваться до 1152 МБ.Диспетчер задач показывает, что текущая нагрузка транзакции составляет 886 МБ, а свободной физической памяти 1,5 ГБ.Однако я получаю ту же ошибку с точно такими же цифрами .

Обновление № 2: Как я уже сказал, директива memory_limit в порядке.Он отображается в ini_get() и phpinfo().Сообщение об ошибке, которое вы получите, немного отличается от моего;мой указывает на PHP крах .Пожалуйста, сравните:

Out of memory (allocated 25165824) (tried to allocate 343810589 bytes)
Allowed memory size of 25165824 bytes exhausted (tried to allocate 343810589 bytes)

Я попытаюсь составить сценарий для воспроизведения проблемы и сообщить о ней.

Ответы [ 3 ]

4 голосов
/ 31 января 2012

Исключение OOM отличается от предупреждений об ограничении памяти.

Это означает, что PHP фактически не может выделить память, поскольку в вашей операционной системе недостаточно ресурсов.

Вам необходимо убедиться, что в системе достаточно памяти / подкачки для поддержки этого.

0 голосов
/ 13 июня 2019

У меня была похожая проблема с ошибками нехватки памяти, появляющимися при цифрах до 250 МБ.Если вы найдете свой конфигурационный файл apache, который контролирует ThreadsPerChild (для меня это был /conf/extra/httpd-mpm.conf) и уменьшите ThreadsPerChild со 150 до 50 или около того, вы увидите заметное улучшение ... вот скриптпроверить это:

echo "Memory limit: ".ini_get("memory_limit")."<br><br>";
$a=array();
if (ob_get_level() == 0) ob_start();
for($i=0;$i<200;$i++)
{
    $a[]=str_pad('',1024*1024*32);
    echo "Pass ".$i.", memory used: ".number_format((memory_get_usage())/(1024*1024),0)." MB<br>";
    ob_flush();
    flush();
}
0 голосов
/ 09 мая 2013

Попробуйте использовать max_input_time, иногда, когда PHP говорит memory_limit , это на самом деле означает max_input_time (-1 для этого бесконечно).

...