PHP无法为Magento脚本分配超过536870912字节内存的问题
我太懂你这种明明调了各种内存设置,却还是被Magento的内存耗尽错误卡脖子的感觉了——尤其是在批量导出产品这种刚需场景下。结合Magento的特性,给你几个针对性的解决方案:
先确认CLI真正在用哪个php.ini
很多人踩过这个坑:修改了Web端的php.ini,但CLI用的是另一个配置文件。先跑php --ini看看当前CLI加载的配置路径,把这个文件里的memory_limit改成2048M(导出大量产品真的需要这么多),改完记得重启终端生效。在脚本最开头强制锁死内存限制
Magento的初始化流程有时候会偷偷覆盖你设置的内存值,所以把内存设置放在脚本最最开头,甚至在Magento的初始化代码之前:ini_set('memory_limit', '-1'); // 临时取消内存限制,导出完记得改回正常值这里用
-1是临时放开限制,毕竟导出完就不用了,比设一个固定大值更稳妥。给Dataflow做分批处理优化
默认的Dataflow可能会一次性把所有产品加载到内存里,直接爆掉。你可以修改导出脚本,加个分批逻辑:- 找到处理产品的循环,改成每次处理100-200个产品
- 每处理完一批,调用
gc_collect_cycles()手动触发垃圾回收,把没用的内存释放掉
试试Magento官方的导出Shell命令
如果你用的是Magento 1.9及以上版本,别折腾自定义脚本了,官方自带的导出命令已经做了内存优化:php shell/export.php -p 你的导出配置代码直接用这个命令跑,稳定性比自己写的脚本好很多。
排查是否有内存泄漏
要是以上方法都没用,就得看看是不是有第三方模块或者自定义代码在偷偷漏内存。你可以在产品处理循环里加一行echo memory_get_usage() . PHP_EOL;,观察内存是不是一直在涨不回落——如果是,就得排查那些没被释放的对象、全局变量或者资源了。
这些方法应该能帮你搞定这个头疼的内存问题,毕竟Magento处理大量产品时的内存占用确实挺夸张的,得针对性调整才行。
内容的提问来源于stack exchange,提问作者Kris Sinclair

