Когда вашему скрипту не хватает оперативной памяти для его выполнения (точнее он не укладывается в объём, который ему разрешён), возникает ошибка «Allowed memory size of XXX bytes exhausted (tried to allocate YYY bytes)».
Для решения данной задачи предлагаю три варианта на выбор в зависимости от прав доступа на сервере и его конфигурации.
Варианты
Один из этих вариантов вам точно поможет.
Способ первый
В файле настроек РНР (php.ini) пишем:
Обычно для простых смертных этот файл править не дают. Всё зависит от вашего хостинг-провайдера. Да и делать вам там нечего.
Способ второй
В файле настроек сайта (.htaccess) пишем:
php_value memory_limit 100M
При определённой конфигурации сервера вы можете получить ошибку 500 — Internal Server Error.
Способ третий
В теле вашего скрипта (например, config.php) пишем:
<?php ini_set('memory_limit', '100M'); ?>
Самый простой и безопасный ход решения проблемы. Меня выручает постоянно.
Для сайта на WordPress
В начале вашего файла конфигурации wp-config.php
в корне сайта добавьте строку:
<?php define( 'WP_MEMORY_LIMIT', '100M' ); ?>
Errors htaccess PHP WordPress
Время на прочтение
1 мин
Количество просмотров 5.2K
Когда вашему скрипту не хватает оперативной памяти для его выполнения (точнее он не укладывается в объём, который ему разрешён), возникает ошибка «Allowed memory size of XXX bytes exhausted (tried to allocate YYY bytes)».
Для решения данной задачи предлагаю три варианта на выбор в зависимости от прав доступа на сервере и его конфигурации.
Один из этих вариантов вам точно поможет.
Способ первый:
В файле настроек РНР (php.ini) пишем:
memory_limit = 100M
Обычно для простых смертных этот файл править не дают. Всё зависит от вашего хостинг-провайдера. Да и делать вам там нечего.
Способ второй:
В файле настроек сайта (.htaccess) пишем:
php_value memory_limit 100M
При определённой конфигурации сервера вы можете получить ошибку 500 – Internal Server Error.
Способ третий:
В теле вашего скрипта (например, config.php) пишем:
<?php
ini_set('memory_limit', '100M');
?>
Самый простой и безопасный ход решения проблемы. Меня выручает постоянно.
Ошибка Fatal error: Allowed memory size гласит о том, что вы достигли ограничения по памяти, которые у вас установлены в настройках web-сервера.
Например, текст ошибки:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 71 bytes) in … говорит, что 128 Мб не достаточно (число выше указано в байтах) и его нужно увеличить, либо в указанном месте решить проблему с утечкой памяти.
Решение проблемы с ограничением памяти
Есть два варианта как завершить операцию:
-
Оптимизировать скрипт.
-
Увеличить лимит по памяти.
Первый вариант сложен и не всегда возможен. Поэтому рассматривать его не будем.
Хотя, зачастую бывает так, что сайт, например, пытается сжать очень большую картинку в другой размер (например, фото в оригинале весит 20 Мб). В этом случае просто используйте оригинальные картинки меньшего размера.
Второй вариант проще и подойдет как временное решение, до тех пор пока не найдется основной корень зла. Существует несколько способов увеличить лимит.
Файл php.ini
Это рекомендуемый способ, если вы имеете доступ к файлу php.ini. Данный способ не сработает на многих платных хостингах провайдер, т.к. там закрывают доступ к этому файлу, в целях безопасности. Внимание! Данный способ затронет все ваши сайты и скрипты, находящиеся на сервере.
Откройте файл php.ini и найдите там строку memory_limit:
memory_limit = 256M
Через .htaccess в корне сайта
Добавьте в самом начале строку php_value memory_limit 256M. Во время выполнения PHP, запишите перед тяжелыми операциями в php-файл следующую строчку
<?php ini_set('memory_limit', '256M');?>
Как посмотреть, сработало ли?
Откройте в панели управления Joomla информацию о системе
И найдите строку memory_limit
Тоже самое можно сделать через команду <?php phpinfo();?>.
Если не получилось…
В случае, если рекомендации из статьи не помогли вам (возможно хостинг не дает таких прав), то обратитесь с этим вопросом к техподдержке вашего хостинга. Если хостер отказал, то рассмотрите вариант с выполнением тяжелых операций на локальной машине. Затем результат работы перенесите на ваш продуктивный сайт в интернете.
Альтернатива
Также оптимизации по памяти можно добиться установкой APC. Он уменьшает потребление памяти в ~1,5-2 раза и ускоряет работу всего сайта в целом. Для нормальной работы Joomla + JBZoo обычно хватает 64 Мб (с серьезным запасом на будущее).
Взял хостинг самый дешевый на unihost.com, залил онлайн игру — все работало с 128МБ ОЗУ. Затем при обращении к php файлу, который отвечает за связь с БД MySQL получил ошибку:
Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 43 bytes) in /var/www/user/data/www/site.ru/GameEngine/Database/db_MYSQL.php on line 2986 (Сегодня перешел на хостинг с 256МБ, не помогло ;-( )
Как решить проблему? Стоит ли переходить на хостинг с 384МБ ОЗУ?
Вот функция в которой происходит ошибка:
function mysql_fetch_all($result) {
$all = array();
if($result) {
while($row = mysql_fetch_assoc($result)) { // 2986 строка
$all[] = $row;
}
return $all;
}
}
ЮрийСПб♦
69.8k9 золотых знаков65 серебряных знаков122 бронзовых знака
задан 28 ноя 2013 в 11:46
7
Как несложно догадаться, веб приложение расходует всю память, доступную на виртуальном сервере. Посмотрев на приведенный вами код, становится ясно, что ошибка происходит при попытке перенести результат запроса к таблице БД в оперативную память на сервере. Очевидно, выборка задевает огромное количество записей( суммарный объем информации в которых = 268435456/1024/1024 = 256МБ !! ). Есть несколько выходов: ограничивать количество затрагиваемых запросом записей из таблицы( LIMIT, WHERE и т.д )
или же завести сервер с большим запасом ОЗУ. Предпочтительнее первый вариант, т.к в будущем вы обезопасите себя от возникновения подобной проблемы. Да и вообще, нужно следить за подобными вещами..
Здесь вот, к примеру, один только номер строки пугает:
<b>Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 43 bytes) in /var/www/user/data/www/site.ru/GameEngine/Database/db_MYSQL.php on line 2986</b>
Такие гигантские скрипты следует разбивать на несколько файлов, чтобы хотя бы самому в нем потом не запутаться..
ответ дан 28 ноя 2013 в 12:01
AseNAseN
13.6k13 золотых знаков60 серебряных знаков122 бронзовых знака
2
Попробуйте добавить в самое начала index.php (расположенного в корне сайта) вот такую строчку. Память соответственно указать для своих целей.
<?php ini_set("memory_limit", "512M"); ?>
Или положить в корень сайта файл .htaccess следующего содержания:
php_value memory_limit 512M
Если это не помогло — обратитесь к администратору хостинга и попросите увеличить количество доступной памяти для PHP
Попробуйте использовать функцию mysql_fetch_row()
вместо mysql_fetch_assoc()
ответ дан 28 ноя 2013 в 11:57
АртёмычАртёмыч
1,7024 золотых знака24 серебряных знака51 бронзовый знак
4
Эта ошибка означает, что ваш скрипт для выполнения требует памяти больше, чем разрешено в настройках PHP. Т.е. запрашиваемое значение превышает максимальное количество оперативной памяти предоставляемого пользовательскому аккаунту виртуальным хостингом. На разных хостингах это значение может отличаться.
Если у вас возникает такая проблема, то можно сделать следующее:
-
Попробовать самостоятельно изменить это значение, добавив в самое начало
index.php
(расположенного в корне сайта) следующие строчки:<?php ini_set("memory_limit", "512M"); ?>
или же положив в корень сайта файл `.htaccess следующего содержания:
php_value memory_limit 512M
Если же такой файл уже есть в корне сайта — просто добавьте в него вышеприведенную строку.
-
Если это не помогло — обратитесь к администратору хостинга и попросите увеличить количество доступной памяти для PHP.
ответ дан 28 ноя 2013 в 12:03
terantulterantul
3,24712 серебряных знаков18 бронзовых знаков
3
Очередная проблема в работе сайта принесла тему для нового поста — ошибка «Fatal error: Allowed memory size of«. Пришлось оказать помощь товарищу с устранением этой неприятности.
В свое время я долго искал решение этой проблемы и, обнаружив, что это довольно распространенное явление, решил помочь всем, кто столкнулся или столкнется с ней.
Суть такова: в консоли административной панели появляется ошибка:
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 1966080 bytes) in /home/username/public_html/wp-includes/class-simplepie.php on line 5410.
Цифры и путь ошибки могут и будут различаться. Более того, Ваш сайт может не загружаться, а браузер будет писать текст всё той же ошибки и при попытке входа в админку будет все тот же Fatal error.
Причина ошибки одна — CMS употребляет больше оперативной памяти, чем предоставляет хостинг. Чем это вызвано, тоже понятно: однозначно, плагины (изредка проблема возникает после обновления версии движка, но как правило в процессе активации, деактивированных перед обновлением WordPress плагинов).
Как исправить ошибку
А вот путей решения несколько. И один из них точно принесет результат. Также я расскажу как не допустить этой ошибки в будущем. Приступим.
Первый способ
Самый простой, но длительный по времени: написать в техподдержку компании, предоставляющей хостинг. Специалисты все исправят и вы вновь у руля. Однако, может случиться, что это поможет на 3-5 дней (как было у меня) и снова та же ошибка памяти. После 3-х писем в техподдержку мне посоветовали сменить CMS. Но я гордый и начал копать дальше.
Второй способ
Внести в файл .htaccess вашего сайта строку:
php_value memory_limit '64M'
Если файла .htaccess у вашего сайта нет, то сделайте его: берем пустой txt файл (файл блокнота) и вносим туда вышеуказанную строку. Затем переносим это дело с помощью FTP клиента на сервер и там переименовываем в .htaccess. Устанавливаем атрибуты 777, проверяем сработало или нет. Опять же зависит всё от хостинга. Если и это не помогло, то…
Третий способ
Похож на второй, только работаем в другими файлами. Открываете index.php в корне вашего сайта и добавляете в него следующий код:
define(‘WP_MEMORY_LIMIT’, ’64M’);
Разрешенный объем оперативки для сайта вырастет до 64 мегабайт. Для WordPress сайта этот же код вставьте в файл конфигурации wp-config.php. Если хостинг провайдер не выключил в настройках сервера поддержку ini_set, то проблема должна решиться.
Четвертый способ — лучший
Гарантировано избавит вас от ошибки, так как решает саму причину ошибки. Но, возможно, придется пожертвовать плагином. Заходим в админку вкладка «плагины» и начинаем по очереди их деактивировать, проверяя при этом, после каждой деактивации наличие ошибки. Плагин-проказник обязательно найдется, после этого активируйте все плагины, которые не вызывают ошибку.
Если сайт полностью лежит и нет возможности делать манипуляции с админкой, то зайдите на хостинг. Откройте папку wp-content/plugins, скопируйте все плагины к себе на компьютер и поочередно удаляйте один за другим, проверяя — заработал ли сайт.
Кстати, такое решение лечит и другие ошибки.
Если плагин очень нужный и полезный, то следует поиграть версиями: попробовать более свежий или наоборот, более старый. Или найдите аналог. В любом случае нужно придти к консенсусу.
Профилактика ошибок памяти
Что для этого нужно? Ответ прост: постоянно видеть сколько памяти потребляет WordPress. Для этого придется покопаться в коде шаблона. Можно это сделать прямо из админки, раздел «Внешний вид» — «Редактор» — выбрать файл functions.php или через файловый менеджер по адресу …/wp-content/themes/ваша тема/functions.php (открыть с помощью Notepad++ или подобной программой). Перед закрывающим тегом ?> вставляем в файл код:
function usage () {printf (('%d / %s'), get_num_queries (), timer_stop (0, 3)); if ( function_exists ('memory_get_usage') ) echo ' / ' . round (memory_get_usage ()/1024/1024, 2) . 'mb '; } add_action ('admin_footer_text', 'usage');
Данная функция будет выводить в футере администраторской панели WordPress информацию об объеме потребляемой сайтом памяти. В качестве бонуса вы увидите скорость загрузки страниц и количество запросов к базе данных.
Теперь Вы наглядно контролируйте изменение потребляемой памяти при активации того или иного плагина и сразу увидите, если что-то пойдет не так.
Удачи на вашей охоте за прибылью!