Exception Magento“;前端控制器达到100次路由器匹配迭代”;错误

Exception Magento“;前端控制器达到100次路由器匹配迭代”;错误,exception,magento,Exception,Magento,我的网站每天都会有一到两次宕机,当它开始抛出异常“前端控制器达到100次路由器匹配迭代”。一旦发生这种情况,对管理员和前端的访问就消失了。我只剩下一个错误页面 这是从Magento 1.5.0.1升级到1.5.1.0后开始的。如果我手动清除var/cache/目录,我将重新启动并运行 我已经用谷歌搜索出了这个。在有限的搜索结果中,我发现没有任何东西能帮助我解决这个问题 如果您能深入了解为什么会发生这种情况以及如何解决,我们将不胜感激 --更新----------------------- 使用A

我的网站每天都会有一到两次宕机,当它开始抛出异常“前端控制器达到100次路由器匹配迭代”。一旦发生这种情况,对管理员和前端的访问就消失了。我只剩下一个错误页面

这是从Magento 1.5.0.1升级到1.5.1.0后开始的。如果我手动清除var/cache/目录,我将重新启动并运行

我已经用谷歌搜索出了这个。在有限的搜索结果中,我发现没有任何东西能帮助我解决这个问题

如果您能深入了解为什么会发生这种情况以及如何解决,我们将不胜感激

--更新-----------------------

使用Andrey Tserkus提供的有用答案中提供的调试代码,我能够确定错误是由我的一些路由器消失引起的

调试代码输出的正常路由器为: 总计7:管理员、标准、cms、amshopby、fishpig_wordpress、seosuite、默认

发生错误时,它们已更改为: 总计3:管理、标准、默认


当这种情况发生时,丢失的路由似乎会导致每个页面请求的代码迭代到100。我将进一步调查此情况。

错误消息过于笼统,无法尝试解决此问题。我建议你雇用一些自由职业者Magento网站开发人员,在你的实际网站上查找问题的根源。这在理论上是无法解决的

从消息中可以看出,出现问题的原因是路由器正在进行循环引用以发送请求。其中一个匹配请求,但不分派并再次将其推送到重新修补程序。或者根本没有路由器匹配请求

您可以通过访问Magento Core文件app/code/Core/Mage/Core/Controller/Varien/Front.php获得更多信息,请在那里找到行

while (!$request->isDispatched() && $i++<100) {
    foreach ($this->_routers as $router) {
        if ($router->match($this->getRequest())) {
            break;
        }
    }
}
while(!$request->isDispatched()&&&i++\U路由器作为$router){
如果($router->match($this->getRequest())){
打破
}
}
}
并用

Mage::log('----Matching routers------------------------------');
Mage::log('Total ' . count($this->_routers) . ': ' . implode(', ', array_keys($this->_routers)));
while (!$request->isDispatched() && $i++<100) {
    Mage::log('- Iteration ' . $i);
    $requestData = array(
        'path_info' => $request->getPathInfo(),
        'module' => $request->getModuleName(),
        'action' => $request->getActionName(),
        'controller' => $request->getControllerName(),
        'controller_module' => $request->getControllerModule(),
        'route' => $request->getRouteName()
    );

    $st = '';
    foreach ($requestData as $key => $val) {
        $st .= "[{$key}={$val}]";
    }
    Mage::log('Request: ' . $st);
    foreach ($this->_routers as $name => $router) {
        if ($router->match($this->getRequest())) {
            Mage::log('Matched by "' . $name . '" router, class ' . get_class($router));
            break;
        }
    }
}
Mage::log('----匹配路由器--------------------);
Mage::log('Total'.count('this->'u routers)。':'。内爆(',','array_keys('this->'u routers));
而(!$request->isDispatched()&&&i++$request->getPathInfo(),
'module'=>$request->getModuleName(),
'action'=>$request->getActionName(),
“控制器”=>$request->getControllerName(),
“控制器模块”=>$request->getControllerModule(),
“路由”=>$request->getRouteName()
);
$st='';
foreach($requestData作为$key=>$val){
$st.=“[{$key}={$val}]”;
}
Mage::log('Request:'.$st);
foreach($this->\u路由器为$name=>$router){
如果($router->match($this->getRequest())){
Mage::log('由'.$name.''匹配'.''路由器,类'.get_类($router));
打破
}
}
}

在等待站点产生错误之后,打开var/log/system.log,查看系统内部正在发生的调试信息。这将有助于更好地了解是什么路由器破坏了系统。

这一错误也让我们的一个客户承受了极高的负载。。更改local.xml中的admin url值修复了这两个问题

我们也遇到了同样的问题,并且深入研究发现,问题与加载的路由器没有直接关系,而是与加载的模块有直接关系

为了解决这个问题,我们添加了以下调试代码:

    app/code/core/Mage/Core/Controller/Varien/Front.php : Line 183

    if ($i>100) {
        file_put_contents('/tmp/debug.txt', Mage::getConfig()->getNode()->asNiceXml());
        Mage::throwException('Front controller reached 100 router match iterations');
    }
当我们检查这个的输出时,我们可以看到只有Mage_核心模块被加载(检查节点'config/modules'。我们认为存在某种竞争条件,这意味着系统剩下一个部分形成的配置,然后被缓存


如果你有同样的情况,我很想听听。

这可能对你没有帮助,但可能对其他人有帮助。我突然遇到了同样的问题


手动删除缓存和锁确实解决了我的问题(目前)。

更新2:我有一些进一步的更改,这将有助于防止100次路由器匹配迭代的不同原因

====================================================================

更新:MAGENTO将我的答案用作补丁

====================================================================

我最近花了相当长的时间研究这个bug。我已经写下了我的全部发现、解释和复制

但是,简而言之,这似乎是一个Magento错误,可以通过使用以下内容覆盖
Mage_Core_Model_Config::init
来更正:

 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;
 }
编辑:更新为在香草1.5上测试

我刚刚在1.5的普通安装上运行了复制脚本。该安装禁用了
CONFIG
缓存之外的所有缓存

它没有像在1.13上那样产生
100路由器
错误,但它确实破坏了网站,显示的所有主页都是白色屏幕

原因是当我们寻找控制器和操作时,我们与
Mage\u Core\u IndexController::indexAction
匹配,而不是
Mage\u Cms\u IndexController::indexAction

class Mage_Core_IndexController extends Mage_Core_Controller_Front_Action {

    function indexAction()
    {

    }
}
Mage\u Core\u IndexController::indexAction
是一个空函数,它完美地解释了白页

当将
\u useCache=false
放入
Mage\u Core\u Model\u Config
中时,我无法再复制此错误


我相信您的Magento站点独特的配置可能会导致它完全无法匹配控制器,而不是退回到这个
Mage\u Core\u IndexController
操作?

我尝试了上述所有建议,但没有取得任何效果。 然后我尝试了一次备份,因为我要尝试升级,我在读取文件时遇到了一个权限错误。这很奇怪,所以我更改了权限,它立即开始工作
rm -rf /path/to/magento/var/cache/*
telnet memcache_server portnumber
flush_all
telnet redis_server portnumber
FLUSHALL
<admin>
    <routers>
        <adminhtml>
            <args>
                <frontName><![CDATA[myadminfrontname]]></frontName>
            </args>
        </adminhtml>
    </routers>
</admin>
http://www.myproject.com/myadminfrontname/
rm -rfv var/*