Верхний предел памяти для PHP / Apache - PullRequest
19 голосов
/ 09 декабря 2010

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

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

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

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

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

memory_limit = 3000M

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

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

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

Спасибо.

Обновление ....

@ неуловимый @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 ГБ

Ответы [ 8 ]

9 голосов
/ 20 апреля 2013

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

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

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

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

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

7 голосов
/ 24 июля 2014

При использовании 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

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

1 голос
/ 20 апреля 2013

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

1 голос
/ 29 января 2013

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

Таким образом, вы можете установить ограничение PHP сколько угодно, если Apache запускает процесс с ограничением памяти, вы не можете его превысить.

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

Например:

/usr/local/apache/conf
#RLimitMEM 85643200 104857600   # Limit to: 80Mb / process, 100Mb total
RLimitMEM 134217728 537395200   # Limit to: 128Mb / Process, 512Mb total
1 голос
/ 09 декабря 2010

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

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

См .: http://bugs.php.net/bug.php?id=39132&edit=1

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

0 голосов
/ 22 августа 2014

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

0 голосов
/ 09 декабря 2010

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

#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   
0 голосов
/ 09 декабря 2010

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

set_time_limit(300);
ini_set('memory_limit', '20000M');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...