Magento Cron执行期间崩溃故障排除

时间:2011-10-26 21:59:05

标签: php memory magento cron

在我的工作场所,我们正在运行Magento 1.3店面,我们遇到的问题是由Magento的内部cron服务运行的工作。故障排除几乎停止,因为我们无法识别导致问题的作业。我们得到的唯一反馈是,每天晚上00:05,cron在执行/usr/bin/php-cgi -f /path/to/app/magento/html/cron.php时咳嗽了下面这个臭名昭着的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的内存限制显然不是答案 - 在512mb,问题几乎可以肯定,算法正在做一些严重的错误,而不是我们低估了问题的要求。我们的数据库大小相当适中 - 整个事物的明文转储小于512mb,因此查询必须非常病态才能吃到更多。我们最好的猜测是,某些东西可能错误地使用了Zend的fetchAll(),但是我们无法在任何可以找到的东西中直接调用该方法。

我们怎样才能让Magento在问题出现时给我们一个堆栈跟踪或其内部状态的其他指示?有没有办法更准确地了解PHP在内存墙上遇到什么时尝试执行的内容?

理想情况下,我们希望在不修改第三方代码的情况下执行此操作 - 有时插件开发人员会使用像Zend Guard这样的公牛队员措施,或者拥有不允许我们修改其损坏代码的许可证,或其他基本上让我使用的措施我想去找Stallman先生,给他一个温暖,感恩的拥抱。


请注意,问题不在于“我们如何解决内存不足错误?”之前曾多次被问过,并以不同的优点回答。问题是“我们怎么能告诉哪个PHP文件导致内存不足错误?”这是关于Magento内部的问题,而不是PHP qua PHP。

2 个答案:

答案 0 :(得分:1)

我建议使用Mage::log()记录多个作业的开头和结尾,以便将其缩小到任务范围。之后,只需创建一个手动执行它的控制器,这样您就可以开始调试它来解决问题。

答案 1 :(得分:1)

如果可能,我会使用Xdebug模块,Xdebug function traceXdebug stack trace运行cronjob(如果启用了Xdebug,则应自动显示/记录堆栈跟踪)。

首先,您应该配置(在 php.ini 中或使用

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

)以下内容:

另请查看其他有趣的设置,例如xdebug.collect_params

祝你好运!

注意:在输出跟踪的地方要小心,因为它们可能包含敏感数据。