【问题标题】:Troubleshooting Crashes During Magento Cron ExecutionMagento Cron 执行期间的故障排除
【发布时间】:2023-04-11 07:16:01
【问题描述】:

在我的工作场所,我们正在运行一个 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 之类的牛羽措施,或者拥有不允许我们修改其损坏代码的许可证,或者其他基本上让我想去找斯托曼先生,给他一个温暖而感激的拥抱。


请注意,问题不是“我们如何解决内存不足错误?”这已经被问过很多次了,并以不同的卓越回答。问题是“我们如何判断 哪个 PHP 文件导致内存不足错误?”这是一个关于 Magento 内部的问题,而不是关于 PHP qua PHP。

【问题讨论】:

    标签: php memory magento cron


    【解决方案1】:

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

    【讨论】:

    • 这是可能的。大部分作业是由各种插件的config.xml文件添加的,所以我们尽量不修改第三方代码。当然,如果有必要,我们会的,但这不是第一选择。
    • 我希望有一些更简单的东西,但是是的,这是我们在这种情况下必须采取的方向。
    【解决方案2】:

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

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

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

    ) 以下内容:

    同时检查其他有趣的设置,例如xdebug.collect_params

    祝你好运!

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

    【讨论】:

    • 很遗憾,我们无法修改 php.ini 来完成这项工作,因此向 PHP 本身添加模块是行不通的。 (是的,我们的托管很烂)
    猜你喜欢
    • 1970-01-01
    • 2021-06-23
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 2010-11-30
    • 2021-09-11
    • 2012-02-18
    相关资源
    最近更新 更多