Увеличение лимита памяти PHP (Apache, Drupal6)

Я пытаюсь запустить установку Drupal на сервере общего хостинга. (Я просто подписываюсь на провайдера - у меня нет коробки.)

Мне нужно увеличить лимит памяти PHP для моего сервера Apache. я пытался

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

в settings.php (файл, который включается в каждый запрос), но это вызывает внутреннюю ошибку сервера 500. Если я его уберу, я получаю эту ошибку:

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 19456 bytes)...

Дополнительный вопрос: 19456 меньше, чем 33554432. Почему говорится, что разрешенный размер исчерпан?

Я также попытался поместить это в .htaccess:

 php_value memory_limit                 128M 

Это не имело никакого эффекта.


person Nick Heiner    schedule 06.09.2009    source источник


Ответы (6)


Сообщение об ошибке, которое вы получаете:

Разрешенный размер памяти 33554432 байта исчерпан (пытался выделить 19456 байт)

Указывает, что вы пытаетесь выделить больше 33554432 байт, которые вам разрешено использовать; т.е. 32 МБ:

; 33554432/1024/1024
        32

Это указывает на то, что неудачное выделение произошло, когда PHP попытался выделить 19 Кбайт; но уже было выделено почти 32 МБ -- эти выделения не были неудачными, так как их общий объем был меньше 32 МБ.

Часть «19456 байт» сообщения об ошибке не имеет значения: важно то, что ваш memory_limit установлен на 32 МБ.


Учитывая, что memory_limit является своего рода защитой, было бы странно, если бы ваш хостинг-провайдер позволил вам изменить его значение...

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

Кстати: 32 МБ на самом деле вполне разумное значение - я никогда не видел сервер, настроенный на разрешение более 32 МБ для веб-приложения... И значение по умолчанию для PHP 5.2, похоже, составляет 16 МБ, согласно руководство.
(Я работаю с Drupal уже пару месяцев)


По поводу ошибки 500 у меня мало идей... Возможно, что safe_mode активирован и не позволяет устанавливать memory_limit во время выполнения.

В руководстве об этом особо не говорится, но есть немного информации в разделе max_execution_time:

Вы не можете изменить этот параметр с помощью ini_set() при работе в безопасном режиме. Единственный обходной путь — отключить безопасный режим или изменить ограничение по времени в php.ini.

Я полагаю, то же самое относится и к memory_limit ; во всяком случае, это выглядело бы логично.

person Pascal MARTIN    schedule 06.09.2009
comment
Интересно, что в этой статье на drupal.org упоминается, что 96 МБ рекомендуется для сайтов, использующих такие вещи, как ImageAPI GD: drupal.org/ узел/29268 - person Amber; 07.09.2009
comment
96 МБ? Ой! Это уже слишком... Я должен попытаться сказать это парню, ответственному за настройку наших серверов, просто чтобы увидеть его лицо ^^ - person Pascal MARTIN; 07.09.2009
comment
У меня был установлен memory_limit на 32M, многие клиенты жаловались на то, что загружаемые ими изображения «закрываются пустым экраном». Когда я проверил это в процессе разработки, ошибка была точно такой же, как и у OP, поэтому я действительно увеличил ее (не помню - до 64M или 96M), и это решило проблему. - person karim79; 07.09.2009
comment
@karim79: Спасибо за информацию; Мне придется провести несколько тестов с большими изображениями, в данном случае, для проекта, над которым я сейчас работаю: лучше знать это сейчас, чем слышать, как наши клиенты говорят нам, что это не работает — особенно мне придется сравните бэкэнды GD и imagemagick... - person Pascal MARTIN; 07.09.2009
comment
Аспект ограничения памяти, связанный с безопасностью, заключается в том, чтобы ваш сайт не вышел из-под контроля и не вызвал слишком много хаоса; точный уровень гораздо менее важен, чем тот факт, что предел вообще существует. У меня никогда не было проблем с увеличением лимита памяти до 64M или 96M на любом из моих хостов drupal. - person Bevan; 11.09.2009

Поместите его в свой файл php.ini. Попросите хост перезапустить Apache. Этот узел на drupal.org расскажет вам, как это сделать. Если у вас виртуальный хостинг, на drupal.org есть пошаговые инструкции по изменению вашего php.ini для большинства наиболее популярных провайдеров. Просто найдите «PROVIDER_NAME увеличить лимит памяти».

person jergason    schedule 11.09.2009
comment
Именно ту ссылку, которую я собирался опубликовать сам. - person Bevan; 11.09.2009

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

Однако, когда дело доходит до друпала, вы были правы, добавив

ini_set('memory_limit', 'xxxM');

в файл settings.php. (xxx = требуемая память)

В Drupal есть много отказоустойчивых систем, это одна из них, и Drupal не дает вам исчерпать память.

Так что уточните у хостинговой компании, увеличьте его и установите свой memory_limit в файле settings.php.

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

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

http://drupal.org/node/29268

Удачи

person Beyerz    schedule 21.12.2011

Если вы устанавливаете memory_limit и получаете меньше ошибок памяти, чем максимум, один из виновников лежит на вышестоящей системе, порождающей ваш процесс: Apache.

В конфигурации Apache (/usr/local/apache/conf/httpd.conf) вы найдете директиву, устанавливающую верхний предел для всех дочерних процессов, обрабатывающих запросы (и Drupal работает в таких процессах). Данный сервер Apache может обслуживать несколько клиентов (вы и некоторое количество других). Если бы они позволили одному клиенту занять всю память, у всех остальных был бы BadTime(tm). Чтобы избежать такой ситуации, они ограничивают объем памяти, который может иметь каждый такой процесс.

Например:

# rlimits, do not modify
#  Setting single-process size 
#RLimitMEM 85643200 104857600
RLimitMEM 134217728 537395200

Здесь я закомментировал исходные значения, установленные моей службой хостинга, и увеличил их.

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

FWIW, Host Gator, похоже, дает вам ~ 80 МБ на процесс. Среда выполнения PHP занимает ~ 16 МБ.

person JTigger    schedule 29.01.2013

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

person Simon Groenewolt    schedule 06.09.2009

Многие провайдеры виртуального хостинга не позволят вам увеличить лимит памяти PHP, так как они не хотят, чтобы один сайт в общем ящике занимал память других сайтов на той же машине. Я бы порекомендовал прочитать часто задаваемые вопросы вашего хостинг-провайдера и многое другое, касающееся PHP, там могут быть перечислены любые такие ограничения.

Дополнительный вопрос: 19456 меньше, чем 33554432. Почему говорится, что разрешенный размер исчерпан?

Меньшее число — это просто размер запроса, из-за которого общая выделенная сумма превысила лимит, а не фактическая сумма по всем запросам на выделение. Таким образом, если уже было выделено 33540000 байт и был запрошен другой объект размером 19456, вы получите это сообщение.

person Amber    schedule 06.09.2009