Fatal error: Out of memory in xxx/xxx/xxx/includes/menu.inc

Главные вкладки

Аватар пользователя roderixiv roderixiv 11 мая 2010 в 15:37

Здравствуйте. Я новичок, поэтому прошу прошения за возможное непонимание информации.
После нормальной установки некоторого количества дополнительных модулей при установке последующих модулей стала проявляться ошибка:
Fatal error: Out of memory (allocated 39583744) (tried to allocate 524265 bytes) in xxx/xxx/xxx/includes/menu.inc on line 966
Устанавливаемые модули при этом работают нормально (во всяком случае других ошибок пока не наблюдалось), но Fatal error как-то напрягает.
Попытался решить проблему методами типа:
memory_limit = 32M - редактирование конфигурационного файла php.ini;
ini_set('memory_limit', '32M'); - устанавливает значение опции конфигурации непосредственно в начале "проблемного" скрипта или в файле настроек, в случае с ЦМС;
php_value memory_limit 32M - добавление команды в .htaccess файле всего сайта или в конкретной директории;
ВСЕ БЕСПОЛЕЗНО !
Стал копать глубже, нашел строку 966 в menu.inc, там функция _menu_tree_cid(). Узнал, что эта функция выделяет кэш под дерево данных меню http://api.drupal.org/api/function/_menu_tree_cid/6. Видимо этого выделяемого кэша для чего-то и не хватает.
Что с этим делать, понятия не имею. Пожалуйста, помогите!

Комментарии

Аватар пользователя roderixiv roderixiv 11 мая 2010 в 15:48

Я перепробовал разные значения, ставил ini_set('memory_limit', '64M');, а в php.ini даже ставил memory_limit = 1024M!!! ради интереса - результат тот же! Судя по (allocated 39583744)(tried to allocate 524265 bytes) ему больше 41М и не нужно.

Аватар пользователя direqtor direqtor 11 мая 2010 в 15:54

После изменений в php.ini memory_limit = 128M посмотрите реально сколько вам выделено в phpinfo()

Если изменения не действуют, значит этот параметр запрещен вам для изменения.

Аватар пользователя bratello bratello 12 мая 2010 в 12:08

попробуйте в функции _menu_tree_cid разбить сериализацию и вычисление md5 hash:

<?php
function _menu_tree_cid($menu_name$data) {
  
$serializeData serialize($data);
  
$md5hash md5($serializeData);
  return 
'links:'$menu_name .':tree-data:'$md5hash;
}
?>

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

Аватар пользователя roderixiv roderixiv 12 мая 2010 в 14:08

Извиняюсь, я не силен в Drupal. Я так понимаю, что функцию _menu_tree_cid() в файле menu.inc надо заменить на ту, что вы написали:

"bratello" wrote:
<?php
function _menu_tree_cid($menu_name, $data) {
$serializeData = serialize($data);
$md5hash = md5($serializeData);
return 'links:'. $menu_name .':tree-data:'. $md5hash;
}?>

Но фраза
"bratello" wrote:
выясните на каком этапе происходит переполнение хипа
для совершенно непонятна, если не сложно, разъясните как это сделать. Что касается поиска модуля, который приводит к проблеме, то я сейчас этим буду заниматься, последовательно отключая модули.

Аватар пользователя bratello bratello 12 мая 2010 в 17:58

Обе функции - serialize & md5 - для выполнения алоцируют динамическую память, не мешало бы понять которая из них падает. скорее всего это md5, если не ошибаюсь у нее есть ограничения на длину входного параметра.