编译问题很可能是由某些事件侦听器引起的,这些事件侦听器调用已包含在特定区域的编译文件中的类(例如_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 编译机制提供的优化可能会降级。