Предел верхней памяти для 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');