Добавление продукта в Magento "Фатальная ошибка: Разрешенный объем памяти 41943040 байт исчерпан (пытался выделить 139564 байта)"
Я новичок в Magento и вижу, что это сложная система с большой глубиной, но я столкнулся со многими головными болями с тех пор, как перешел на нее с OpenCart. В первую очередь это ошибка, которую я получаю при попытке добавить продукт:
"Фатальная ошибка: Разрешенный объем памяти 41943040 байт исчерпан (пытался выделить 139564 байта) в /home/vainlane/public_html/mag/app/code/core/Mage/Core/Block/Abstract.php на линии 944"
В в htaccess есть следующие строки:
php_value memory_limit 512M
php_value max_execution_time 38000
Я изменил исходные 256 на 512, но никакой разницы. Кто-нибудь может указать мне здесь правильное направление? Довольно озадаченный. Я использую эту установку в конфигурации cPanel на хостинге реселлера.
6 answers
Жестко закодированный 32-метровый memory_limit.
Если вы запускаете это с общего сервера, ваш memory_limit
может быть заблокирован до 32 МБ, поэтому вы вынуждены справедливо делиться ресурсами с другими пользователями на сервере. Magento плохо работает на общих серверах, которые, кстати, не были оптимизированы для Magento.
Возможно, ваш веб-сервер не настроен на использование memory_limit
из .htaccess
и, следовательно, вам потребуется использовать файл php.ini для настройки памяти. Смотрите файл php.ini.sample
, который Magento устанавливает в свою корневую папку, для того, что php.ini
содержимое файла должно быть.
В противном случае обратитесь к своему поставщику услуг хостинга и попросите его увеличить лимит до 512 млн.
Вы можете временно исправить это, добавив эту строку в свой index.php
ini_set('memory_limit','512M');
Allowed memory size of 41943040 bytes ...
... указывает на абсурдно низкий лимит памяти в 40 МБ или около того (Magento должен иметь не менее 256 МБ, рекомендуемое значение 512 МБ или более).
Ограничение памяти может быть настроено в следующих местах:
- php.ini
- .файл htaccess
- php-скрипты
Установлено значение 2048M - все еще получаю ошибку :
Неустранимая ошибка PHP: Разрешенный объем памяти 2147483648 байт исчерпан (пытался выделить 262144 байта) в неизвестном в строке 0
Какого черта эта штука съедает так много чертовой памяти?
Это может быть связано с нехваткой ресурсов сервера для запуска Magento. Здесь вы можете увидеть список из них, но, на мой взгляд, они довольно низкие.
Я столкнулся с этой проблемой после обновления с magento 1.7.0.2 до 1.9.3.7.
После отслеживания журналов в поведении клиента не было ничего плохого. Он просто прошелся по нескольким категориям, и вдруг все пошло наперекосяк.
Несмотря на то, что все страницы работали правильно с ограничением памяти в 256 МБ, для этого конкретного клиента это не удавалось. поэтому, следуя всем советам, я продолжал увеличивать память до 4 Гб, и это не сработало... значит, что-то еще не так.
Казалось, что могут возникнуть 2 потенциальные проблемы:
- бесконечный цикл - чрезвычайно медленная задача обработки
Я много чего перепробовал, так как журналы magento, php и nginx не давали много информации.
Я обнаружил, что если вы удалите сеанс клиента из базы данных или папки var/sessions (в зависимости от вашей реализации), ошибка 500 исчезнет. (хотя это не объясняло, было ли это связано с бесконечным циклом или просто медленно обработка).
Для этого вы можете найти ip-адрес пользователя в журналах сервера, и запуск grep в папку сеансов или запрос в таблице core_session приведет вас к сеансу клиента.
В качестве потенциального некрасивого решения вы могли бы создать скрипт bash, который работает с журналами сервера в поисках этой ошибки, найти сеанс и удалить его. То же самое вы можете сделать с помощью loggly alerts, amazon CloudWatch и т.д.
Я продолжал расследование, чтобы ответить на мой вопрос, и подождал, пока следующий клиент не столкнется с той же проблемой, затем я увеличил максимальное время выполнения до 6 минут и память до 6 гб в надежде, что, наконец, magento завершит загрузку этих запросов (без нехватки памяти или времени выполнения), и это сработало. После завершения запроса (заняло несколько минут) ошибка 500 исчезла для этого клиента.
Так что это был не бесконечный цикл, это была проблема с производительностью... хотя это и не казалось так.
Я реализовано логично, и я жду, когда это произойдет снова, чтобы я мог немедленно активировать профилировщик, чтобы определить, откуда происходит утечка памяти. Я обновлю этот ответ, если добьюсь успеха.