Предел верхней памяти для PHP/Apache

Я получаю сообщение об ошибке при запуске моего PHP script....

Fatal error: Out of memory (allocated 1827405824) (tried to allocate 88800 bytes)

Я добавил эту строку в свой PHP script..

ini_set("memory_limit","3000M");

Этот оператор действительно правильно контролирует использование памяти, но я, похоже, не могу получить его выше примерно 1,8 ГБ. Как будто верхний предел памяти ограничивается где-то еще. Я также добавил в php.ini...

memory_limit = 3000M

Кто-нибудь знает, ограничена ли память в другом месте?

Я запускаю локальный сервер с Xampp. У меня Windows 7, 64-бит с 4 ГБ оперативной памяти. Мой script использует библиотеку изображений PHP GD, и я получаю ошибку при попытке выделить ссылку на изображение с помощью ImageCreateTrueColor().

(Я знаю, что это огромный объем памяти, но это всего лишь один из script, и его гораздо проще сделать так).

Спасибо.

Update....

@elusive @Orbling Я ожидаю, что все будут скучать по этому вопросу, но вот упрощенный код, который иллюстрирует проблему.

<?php
    ini_set("memory_limit","4000000000");
    echo "ini_get = " . ini_get('memory_limit') . "<br>\n";
    echo "memory_get_usage = " . memory_get_usage(true) . "<br>\n";
    $bigImageHandle = imagecreatetruecolor(22200, 24800);  //this is line 5
?>

Выход браузера...

ini_get = 4000000000
memory_get_usage = 524288

Fatal error: Out of memory (allocated 1843396608) (tried to allocate 88800 bytes) in
E:\User\My_Webs\experiments\houseshunting\temp\osMaps\t1.php on line 5

Я тестировал это с меньшим набором плиток и памятью, используемой imagecreatetruecolor(), и я считаю, что мне нужно 2.7 ГБ

Ответ 1

Вы работаете в 64-разрядной операционной системе, но Apache и PHP, вероятно, все еще 32-разрядные. Если вы используете mod_php, apache будет здесь ограничивающим фактором.

32-разрядные процессы ограничены примерно 2 Гбайт ОЗУ, если вы не использовали переключатель /3GB, и программное обеспечение знает о поддержке 3 ГБ.

Это все еще оставляет около 200 MiB, что кажется неиспользованным, но его достаточно мало, чтобы его можно было использовать различными библиотеками, которые все должны быть загружены в память

Насколько я знаю, использование библиотеки не будет отображаться в фиксированной памяти, но все же рассчитывает на ограничение 2GiB (так же, как память устройства рассчитывается в соответствии с лимитом 4GiB для 32-битных окон. Где устанавливается 2 графика GiB карта подводит вас под 2GiB полезной ОЗУ).

Скорее всего, решение? Установите 64-битный PHP, а затем отправьте его на это (возможно, используя вызов system())

Ответ 2

Используя Acquia Dev Desktop, у меня было много сбоев в памяти.

После увеличения предела памяти в PHP.ini.

php_value memory_limit                  1024M
php_value max_execution_time            3000

Эта проблема была менее частым, но все еще возникающим (особенно с функцией Recreate)

В мой httpd.conf я увеличил StackThread до 16M

ThreadStackSize 16*1024*1024

И он решил проблему сбоя памяти. Надеюсь, что это поможет

Ответ 3

Попробуйте это

set_time_limit(300);
ini_set('memory_limit', '20000M');

Ответ 4

Проверьте конфигурацию Apache (например, httpd.conf). Вероятно, RLimitMEM директива, ограничивающая память, позволяет дочерним процессам обрабатывать запросы.

Итак, вы можете установить предел PHP, который вы хотите, если Apache порождает процесс с ограничением памяти, вы не можете превышать его.

Если вы используете размещенную службу и имеете общий сервер, вероятно, у вас нет доступа к этой конфигурации и вам необходимо работать с вашим провайдером. Как вы можете видеть, это настройка, которая применяется в масштабах всего сервера... вы вряд ли захотите заставить их изменить это. Опять же, если вы хотите создать не более 1.5Gig процессов, вы должны либо решить проблему по-другому (другие предложили это), либо получить выделенный сервер какого-либо типа (например, EC2).

Например:

/usr/local/apache/conf
#RLimitMEM 85643200 104857600   # Limit to: 80Mb / process, 100Mb total
RLimitMEM 134217728 537395200   # Limit to: 128Mb / Process, 512Mb total

Ответ 5

Какую версию PHP вы используете?

Переменная memory_limit содержится или содержится в 32-битном целочисленном значении, поэтому не может превышать 2 ГБ.

Смотрите: http://bugs.php.net/bug.php?id=39132&edit=1

Из нижнего комментария к этому отчету об ошибке, это может быть подпрограмма, которая переводит читаемую форму человеку в число, попробуйте поместить ее в цифры.

Ответ 6

Попробуйте следующее:

#php_value memory_limit 300M 
#php_value upload_max_filesize 200M 
#php_value post_max_size 200M 
#php_value max_execution_time 80000 
#php_value max_input_time 80000   

Ответ 7

Проблема, скорее всего, будет вызвана запуском 32-разрядных apache и php. Попробуйте обновить их до 64-битных двоичных файлов и посмотрите, не устраняет проблему.

Ответ 8

попробуйте ini_set('memory_limit', '-1');