突然(没有任何更改或更新)我们的 magento 安装似乎完全损坏了。

现在我们每天都会遇到一些这样的错误:

  1. 访问 /index 时未配置或发现 404 CMS 页面。
  2. 访问 /index 时突然出现 magento 安装程序
  3. 没有显示模板(如图所示)

enter image description here

  1. 奇怪的重定向。当一切似乎都正常时(没有 404 cms 错误,没有模板问题)并且我尝试访问产品,有时会被重定向到主页。

嗯,到目前为止我所做的是:

  1. 刷新缓存文件夹、刷新会话文件夹
  2. 截断表 core_url_rewrite

这似乎有效。重新索引(core_url_rewrite)后,一切似乎又被破坏了,所以我再次截断了。使用空 core_url_rewrite 看起来一切都很好。但第二天又坏了。

好吧,今天又是同样的情况,但这也是第一次刷新缓存、会话和 core_url_rewrite 不再起作用。

哦,这显示在我们的 nginx 错误日志中:

[错误]11773#11773:*242799 FastCGI 在 stderr 中发送:“PHP 消息:PHP 致命错误:在第 71 行上调用 /htdocs/seg_posorder/stage/app/code/core/Mage/Customer/Model/Session.php 中布尔值的成员函数 getCode(),同时从上游客户端读取响应头:217.24.X.X,服务器:www.example.com,请求:“GET /index.php/customer/account/login/ HTTP/1.1”,上游:“fastcgi://unix:/var/run/php5-fpm.sock:”,主机:“www.example.com”,引荐来源:“example.com”

但我们的商店似乎也还不错:

enter image description here

有帮助吗?

解决方案

与 聊天 @moose我决定自己将其作为答案发布。谢谢 剩余 感谢 @moose 指出我的文章,从而满足了我对 github 存储库上星星的无尽渴望。

有一个核心的 magento 配置缓存错误,会导致“未配置 404 CMS 页面”错误,或者在其他情况下导致“100 路由器匹配迭代”错误。当您刷新缓存时,该错误就会消失,但通常会在一段时间后重新出现。

https://github.com/convenient/magento-ce-ee-config-corruption-bug

(编辑:可以添加进一步的更改以防止配置损坏: https://github.com/convenient/magento-ce-ee-config-corruption-bug#update-2-further-improvements)

复制

查看我上面的存储库。

它有一个文件 100-路由器脚本.php 通过在网站的根目录中运行它应该可以帮助您复制错误。

补丁

Magento 已经根据我的文章发布了一个补丁(SUPEE-4755)。

PATCH_SUPEE-4755_EE_1.13.1.0_v1.sh

这个补丁与我的修复完全相同,这使其具有一定的有效性。

此补丁在任何地方都没有公开列出,因为Magento出于某种原因除了安全补丁以外,其他任何事情都不会这样做。我知道补丁文件说EE_1.13.1.0,但我在社区版1.9上对其进行了测试,并且应用了。

您可以在此处获取补丁的副本:https://github.com/convenient/magento-ce-ee-config-corruption-bug/blob/master/PATCH_SUPEE-4755_EE_1.13.1.0_v1.sh

由于历史原因或万一我的 github 帐户被删除

/**
* Initialization of core configuration
*
* @return Mage_Core_Model_Config
*/
public function init($options=array())
{
    $this->setCacheChecksum(null);
    $this->_cacheLoadedSections = array();
    $this->setOptions($options);
    $this->loadBase();

    $cacheLoad = $this->loadModulesCache();
    if ($cacheLoad) {
        return $this;
    }
    //100 Router Fix Start
    $this->_useCache = false;
    //100 Router Fix End
    $this->loadModules();
    $this->loadDb();
    $this->saveCache();
    return $this;
}

如果这不能修复您的 Magento 实例

这个补丁文件将解决所有合理的普通magento实例(任何使用定义的重新初始化配置缓存的东西) init 或者 reinit 方法)。

如果您有任何调用的代码 loadDb 类函数 n98-magerun - 那么你可能会度过一段糟糕的时光,并且可能应该考虑重构你的代码来调用 reinit 或者 initMage_Core_Model_Config.

如果您仍然遇到问题,我建议您阅读我的文章并

  1. 实现中提到的逻辑 调试问题 部分。
  2. 等待一些日志数据出现。
  3. 联络我!

关于为什么 supere 6788 使错误变得更糟的理论

我刚刚将其发布在聊天室中,并想将其发布到此处以供后代使用。

要记住的是,Magento在其背景下始终有此错误。那个Supee 6788刚刚使它更有可能发生

我刚刚看了 EE1.14 的 supere 6788 补丁 这是我的工作理论。

Mage_Core_Controller_Varien_Router_Admin 已修补以覆盖 addModule 功能

现在,我不太记得法师请求初始化期间发生的事情的顺序,但此修改现在在每个请求上添加了对 Mage::getConfig()->getNode() 的两次调用,这在流程的早期阶段。如果在这两个调用期间 useCache 出现对象缓存参数失败,则可能会触发将不完整的配置写入缓存(getNode 可以触发重新初始化,因为它尝试从缓存加载值,并且在加载失败,它将重新初始化整个配置缓存并通过 reinit() 函数重新保存)

因此,也许只需在请求的很早的部分中添加这两个额外的nodes,当可能无法加载完整的配置时,可能会导致此错误发生,无论哪种方式,我都不会全面了解该问题。这不是很多收益将是很多工作,并研究mage_core_model_config :: loaddb(重点关注usecache标志可能对它的影响)可能会使男人疯狂。

其他提示

您描述的问题,只有2点特别熟悉,但对于它的价值而言,我们如何在我们的案例中解决它:

php的libxml库中有一个错误 - 我认为它是这个 - 这意味着有时Magento无法加载其一些自己的配置文件。您可能会发现它是一些低级更新(PHP或其依赖的库中的一个,它在开放中带出问题。

尝试将此行添加到index.php,靠近开始(我将它放在PHP版本检查后):

libxml_disable_entity_loader(false);
.

nexcess (magento platinum hosting partner)将我指向github上的解决方案(大熊到 luke rodgers ,修补程序的作者)

magento错误 - 损坏配置缓存

patch_supee-4755_ee_1.13.1.0_v1.sh

此修补程序与我的修复完全相同,这会给它提供一些有效性。

这个补丁在任何地方都没有公开列出,因为magento不做 出于某种原因的安全补丁,任何事情都是如此。我知道这一点 补丁文件说EE_1.13.1.0,但我在Community Edition 1.9上测试了它 它申请精细。

此页面给您一个完整的解释通过运行 100-router-script.php 来自您的根目录(这为我复制了问题,先尝试)。

修复:

/**
* Initialization of core configuration
*
* @return Mage_Core_Model_Config
*/
public function init($options=array())
{
    $this->setCacheChecksum(null);
    $this->_cacheLoadedSections = array();
    $this->setOptions($options);
    $this->loadBase();

    $cacheLoad = $this->loadModulesCache();
    if ($cacheLoad) {
        return $this;
    }
    //100 Router Fix Start
    $this->_useCache = false;
    //100 Router Fix End
    $this->loadModules();
    $this->loadDb();
    $this->saveCache();
    return $this;
}
.

它继续说:

我认为这将是彻底解决的 对于每个人magento设置的问题。如果它对你不起作用 推荐你

  • 在调试问题部分中实现逻辑。
  • 等待出现一些日志数据。
  • 联系我!

因为我很长一段时间没有任何答案(我们的商店正在制作客户,我需要提出自己的解决方案。我会分享它,也许它可以帮助找到问题:

在我的index.php中我改变了:

/* Store or website code */
$mageRunCode = isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] : '';

/* Run store or run website */
$mageRunType = isset($_SERVER['MAGE_RUN_TYPE']) ? $_SERVER['MAGE_RUN_TYPE'] : 'store';

Mage::run($mageRunCode, $mageRunType);
.

至:

$mageRunCode = 'default';
$mageRunType = 'store';

Mage::app()->setCurrentStore(1);
Mage::run($mageRunCode, $mageRunType, array('is_installed' => true));
.

这是硬编码的,只有工作,因为我们只有一家商店。但仍然,它似乎现在工作。

许可以下: CC-BY-SA归因
scroll top