【发布时间】: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。
【问题讨论】: