Устранение сбоев во время выполнения Magento Cron - PullRequest
0 голосов
/ 27 октября 2011

На моем рабочем месте у нас работает магазин Magento 1.3, и у нас возникла проблема с заданием, выполняемым внутренней службой cron Magento. Устранение неполадок практически остановлено, потому что мы не можем определить, какая работа вызывает проблему. Единственный ответ, который мы получаем, это то, что каждую ночь в 00:05 cron выдает следующую, печально известную бесполезную ошибку PHP при выполнении /usr/bin/php-cgi -f /path/to/app/magento/html/cron.php.

PHP Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 50 bytes) in /chroot/magento/html/lib/Zend/Db/Statement/Pdo.php on line 294

Увеличение лимита памяти PHP явно не ответ - на 512 Мб, проблема почти наверняка в том, что алгоритм делает что-то ужасно неправильное, а не в том, что мы недооценили требования проблемы. Наша база данных довольно скромна по размеру - дамп открытого текста всего этого составляет менее 512 Мб, поэтому запрос должен быть довольно патологичным, чтобы съесть больше. Наше предположение состоит в том, что, вероятно, что-то неправильно использует Zend fetchAll (), но этот метод не вызывается напрямую во всем, что мы можем найти.

Как мы можем заставить Magento дать нам трассировку стека или какое-либо другое указание на его внутреннее состояние во время проблемы? Есть ли способ добиться большей прозрачности в том, что именно PHP пытается выполнить, когда попадает в стену памяти?

В идеале, мы хотели бы сделать это без изменения стороннего кода - иногда разработчики плагинов используют меры bullfeathers, такие как Zend Guard, или имеют лицензию, которая не позволяет нам изменять их неработающий код, или другие меры, которые в основном делают меня хочу найти мистера Столлмана и тепло обнять его.


Обратите внимание, что проблема не в том, "как мы решаем ошибку нехватки памяти?" Об этом уже много раз спрашивали, и отвечали с переменным превосходством. Проблема в том, «как мы можем определить , какой файл PHP вызывает ошибку нехватки памяти?» Это вопрос о внутренностях Magento, а не о PHP qua PHP.

Ответы [ 2 ]

1 голос
/ 28 октября 2011

Если возможно, я бы запустил cronjob с модулем Xdebug , с трассировкой функции Xdebug или с трассировкой стека Xdebug (который, если Xdebug включен, должен отображаться/ регистрировать трассировку стека автоматически).

Для первого вы, вероятно, должны настроить (либо в php.ini , либо с помощью

php -d xdebug.auto_trace=1 ... cron.php

) следующее:

Также проверьте другие интересные настройки, такие как xdebug.collect_params

Удачи!

Примечание: будьте осторожны при выводе трасс, так какони, вероятно, содержат конфиденциальные данные.

1 голос
/ 27 октября 2011

Я бы предложил использовать Mage::log() для регистрации начала и конца нескольких заданий, чтобы вы могли сузить их до задачи. После этого просто создайте контроллер, который будет запускать его вручную, чтобы вы могли начать отладку, чтобы устранить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...