Я пытаюсь запустить установку 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
Это не имело никакого эффекта.
Сообщение об ошибке, которое вы получаете:
Допустимый размер памяти 33554432 байт исчерпан (пытался выделить 19456 байт)
Указывает, что вы пытаетесь выделить больше, чем 33554432 байт, которые вам разрешено использовать; т.е. 32 МБ:
; 33554432/1024/1024 32
Это указывает на то, что неудавшееся распределение произошло, когда PHP попытался выделить 19 Кбайт; но уже было выделено почти 32 МБ – эти распределения не потерпели неудачу, так как их общая сумма составляла менее 32 МБ.
Часть сообщения об ошибке «19456 байт» не соответствует действительности: важно, чтобы ваш memory_limit
был установлен на уровне 32 МБ.
Учитывая, что memory_limit
– это своего рода безопасность, было бы странно, что ваш хостинг-провайдер позволяет вам изменить его значение …
Если вы находитесь на общедоступном хостинге, это будет означать, что любой, кто на сервере может получить любую требуемую память … Что бы это было не так приятно для других пользователей на одном сервере!
BTW: 32 МБ на самом деле довольно разумное значение – я никогда не видел сервер, настроенный на разрешение более 32 МБ для веб-приложения … И значение по умолчанию для PHP 5.2, по-видимому, составляет 16 МБ, согласно руководству .
(И я работаю с Drupal в течение нескольких месяцев)
Об ошибке 500, у меня нет много идей … Одна из возможностей может заключаться в том, что safe_mode
активирован и что он не позволяет устанавливать memory_limit во время выполнения.
В руководстве не говорится об этом, но в директиве max_execution_time
имеется немного информации:
Вы не можете изменить этот параметр с помощью
ini_set()
при работе в безопасном режиме. Единственным обходным решением является отключить безопасный режим или изменить временные ограничения в php.ini.
Я полагаю, что это верно и в отношении memory_limit
; все равно логично.
Поместите его в файл php.ini. Попросите вашего хоста перезапустить Apache. Этот узел на drupal.org исследует, как это сделать. Если у вас есть общий хостинг, есть пошаговые руководства о том, как изменить php.ini для большинства наиболее популярных поставщиков на drupal.org. Просто найдите «PROVIDER_NAME», увеличив ограничение памяти.
Вам нужно подтвердить своей хостинговой компанией, сколько памяти они вам позволили, поскольку только они смогут ее изменить, если они не увеличат ее, тогда я предлагаю искать новую принимающую компанию.
Однако, когда дело доходит до drupal, вы были прав, чтобы добавить
ini_set('memory_limit', 'xxxM');
в файл settings.php. (xxx = требуемая память)
У Drupal есть много отказоустойчивых сейфов, это один из них, и drupal останавливает вас от изнурительной памяти.
Поэтому проверьте у вас хостинговую компанию, увеличьте ее и установите memory_limit в файле settings.php.
Обычно я просто добавляю эту строку в самом конце скрипта, но вы действительно можете добавить ее в любом месте.
Прочтите это для других людей, у которых была аналогичная проблема, и у них было множество методов для решения этой проблемы в drupal.
Удачи
Попросите вашего провайдера, почему он не работает. Я бы предположил, что они ограничили объем памяти, который вы можете использовать, и не позволяйте ему устанавливать более высокий уровень, или вы работаете на виртуальном хосте, который просто не имеет объем запрашиваемой памяти (это может быть причиной ошибка 500).
Многие общедоступные хостинг-провайдеры не позволят вам увеличить ограничение памяти PHP, так как они не хотят, чтобы один сайт на общей коробке забивал память из других сайтов на одном компьютере. Я бы рекомендовал прочесть часто задаваемые вопросы о вашем хостинг-провайдере и о том, что касается PHP, он может указать любое такое ограничение.
Боковой вопрос: 19456 меньше, чем 33554432. Почему он говорит, что разрешенный размер исчерпан?
Меньшее число – это просто размер запроса, который заставлял общую выделенную сумму превышать лимит, а не фактическую сумму во всех запросах на распределение. Итак, если уже было выделено 33540000 байт, и был запрошен другой объект размером 19456, вы получите это сообщение.
Если вы устанавливаете memory_limit
и выходите из ошибок памяти меньше максимального, один из виновников заключается в том, что восходящая система запускает ваш процесс: Apache.
В конфигурации Apache ( /usr/local/apache/conf/httpd.conf
) вы найдете директиву, которая устанавливает верхний предел для всех дочерних процессов, обрабатывающих запросы (и Drupal работает в таких процессах). Данный сервер Apache может обрабатывать несколько клиентов (вы и некоторые другие). Если бы они позволили одному клиенту размахивать всю память, у всех остальных был бы BadTime ™. Чтобы избежать этой ситуации, они могут ограничить объем памяти, который может иметь каждый такой процесс.
Например:
# rlimits, do not modify # Setting single-process size #RLimitMEM 85643200 104857600 RLimitMEM 134217728 537395200
Здесь я прокомментировал исходные значения, установленные моим сервисом хостинга, и увеличил их.
Конечно, если вы используете общий сервер, то вряд ли вы сможете изменить эту конфигурацию. Фактически, это, скорее всего, будет изменяться ваш хост-провайдер.
FWIW, Host Gator, кажется, дает вам ~ 80Mb за процесс. Время выполнения PHP составляет ~ 16 Мб.