编译问题很可能是由某些事件侦听器引起的,这些事件侦听器调用已包含在特定区域的编译文件中的类(例如_default.php
,_checkout.php
等)。
由于Varien_Autoload
该类使用闭嘴@
运算符 for include
,它会静默失败(不记录错误消息),因为已经定义的类 viaVarien_Autoload
正在任何此类特定于区域的编译文件中重新定义(反之亦然)。
这个问题的正确解决方案是通过修改(或重载)最初位于app/code/core/Mage/Compiler/etc/compilation.xml
.
要识别这样的组,您可以暂时删除 中的@
before include
,Varien_Autoload
并在开发人员模式下运行 Magento(请参阅 中的注释index.php
):这样,在每次页面加载时,冲突的类将被失败报告为错误include
。将报告的类及其分层父级移动到文件的<default>
部分complilation.xml
,确保任何部分中没有重复,重新编译和测试直到没有报告错误,然后放回@
原位,以恢复原始 Magento 核心类文件。
另一种方法是列出安装的第 3 方模块实现的事件处理程序(特别是“早期”_predispatch
事件系列),并将这些事件处理程序(及其分层父级)中使用的类移动到文件中的<default>
部分compilation.xml
。
@Socrates提出的解决方案可能有效,但它有几个缺点:
- 必须修改核心类文件(这可能会影响补丁、升级等);
include_once
与 simple 相比,效率更低,内存消耗更大include
;
- Magento 编译机制提供的优化可能会降级。