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

Я получаю ошибку, когда запускаю свой 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 ГБ оперативной памяти. Мой скрипт использует библиотеку изображений PHP GD, и я получаю ошибку при попытке выделить ссылку на изображение с помощью ImageCreateTrueColor ().

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

Благодарю.

Обновить….

@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 ГБ

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

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

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

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

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

Используя 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 

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

Попробуй это

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

Проверьте конфигурацию 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 

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

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

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

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

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

 #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 

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

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