Ошибка Magento "Фронт-контроллер достиг 100 итераций сопоставления маршрутизатора"
Мой сайт отключается один или два раза в день, когда он начинает выдавать исключение "Фронт-контроллер достиг 100 итераций сопоставления маршрутизатора". Как только это произойдет, доступ к админке и интерфейсу исчезнет. Я только что оставил страницу с ошибкой.
Это началось после обновления с Magento 1.5.0.1 до 1.5.1.0. Если я вручную очищаю каталог var / cache /, я снова работаю.
Я чертовски погуглил из этого. В ограниченных результатах поиска я не нашел ничего, что помогло бы мне решить эту проблему.
Любое понимание того, почему это может происходить и как это можно решить, будет оценено.
--Обновить-----------------------
Используя отладочный код, предоставленный в полезном ответе от Андрея Церкуса, я смог определить, что ошибка вызвана исчезновением некоторых моих маршрутизаторов.
Обычные маршрутизаторы, выводимые с помощью кода отладки: Всего 7: администратор, стандарт, cms, amshopby, fishpig_wordpress, seosuite, по умолчанию
При возникновении ошибки они меняются на: Всего 3: администратор, стандарт, по умолчанию
Когда это происходит, кажется, что пропущенные маршруты заставляют код повторяться до 100 для каждого запроса страницы. Я буду исследовать это условие дальше.
11 ответов
ОБНОВЛЕНИЕ 2: у меня есть некоторые дальнейшие изменения, которые должны помочь предотвратить другую причину итераций совпадения 100 маршрутизаторов
https://github.com/convenient/magento-ce-ee-config-corruption-bug
================================================== ==================
ОБНОВЛЕНИЕ: МАГЕНТО ИСПОЛЬЗУЛ МОЙ ОТВЕТ В КАЧЕСТВЕ
https://github.com/convenient/magento-ce-ee-config-corruption-bug
================================================== ==================
Недавно я провел довольно много времени, изучая эту ошибку. Я написал свои полные выводы, объяснения и репликации здесь.
https://github.com/convenient/magento-ce-ee-config-corruption-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
кеш отключен.
Это не произвело 100 router
ошибка, как и в 1.13, но она сломала сайт, и вся отображаемая домашняя страница была белого экрана.
Причиной было то, что когда мы искали контроллер и действие, мы были сопоставлены с Mage_Core_IndexController::indexAction
вместо Mage_Cms_IndexController::indexAction
,
class Mage_Core_IndexController extends Mage_Core_Controller_Front_Action {
function indexAction()
{
}
}
Mage_Core_IndexController::indexAction
является пустой функцией, и прекрасно объясняет белую страницу.
Я больше не могу повторить эту ошибку при размещении _useCache = false
в Mage_Core_Model_Config
,
Я полагаю, что, возможно, уникальная конфигурация ваших сайтов Magento может привести к тому, что он полностью не будет соответствовать контроллеру, в отличие от возврата к этому Mage_Core_IndexController
действие?
Сообщение об ошибке слишком общее, чтобы попытаться решить эту проблему. Я предлагаю вам нанять какого-нибудь фрилансера для веб-разработчика Magento, чтобы выяснить источник проблемы на вашем реальном сайте. Это не может быть решено теоретически.
Как видно из сообщения, проблема возникает из-за того, что ваши маршрутизаторы делают циклические ссылки для отправки запросов. Один из них соответствует запросу, но не отправляет его и не отправляет повторно. Или ни один маршрутизатор не соответствует запросу вообще.
Вы можете получить больше информации, зайдя в файл приложения / код / core / Mage / Core / Controller / Varien / Front.php Magento Core, там есть строки
while (!$request->isDispatched() && $i++<100) {
foreach ($this->_routers as $router) {
if ($router->match($this->getRequest())) {
break;
}
}
}
и заменить их
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;
}
}
}
После этого подождите, пока сайт выдаст ошибку, откройте var / log / system.log и посмотрите там отладочную информацию о том, что происходит внутри вашей системы. Это поможет намного лучше увидеть, какой маршрутизатор ломает систему.
Это сообщение вызвано плохими данными конфигурации. Я не уверен, что на самом деле приводит к повреждению кэшированной конфигурации - я думаю, что это может быть несколько вещей, которые будут зависеть от того, как работает Magento.
Я думаю, если вы все еще можете добраться до бэкэнда Magento, вы можете попробовать очистить кеш в разделе System > Cache Management. Если это не помогает (или если вы не можете добраться до бэкэнда Magento, что, вероятно, связано с этой ошибкой), то определите, как настроено ваше кэширование, найдя значение
rm -rf /path/to/magento/var/cache/*
Если вы используете memcached, найдите порт в
telnet memcache_server portnumber
flush_all
Или, если вы используете Redis, вы можете сделать
telnet redis_server portnumber
FLUSHALL
У нас возникла та же проблема, и мы покопались немного глубже, чтобы обнаружить, что проблема напрямую не связана с тем, какие маршрутизаторы загружены, а какие модули загружены.
Чтобы решить эту проблему, мы добавили следующий код отладки:
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_Core (проверьте узел 'config/modules'. Мы думаем, что существует какое-то состояние гонки, которое означает, что система остается с частично сформированной Конфиг, который затем кэшируется.
Было бы интересно услышать, если у вас такая же ситуация.
Я перепробовал все вышеперечисленные предложения, и не получил нигде. Затем я попытался выполнить резервное копирование, так как собирался попробовать обновление, и я получил ошибку разрешения чтения файла. Это было довольно странно, поэтому я поменял разрешения, и он сразу начал работать.
Приложение chmod 770 /code/core/Mage/Cms/controllers/IndexController.php
Надеюсь, это кому-нибудь поможет.
Эта ошибка мучила одного из наших клиентов также при очень высоких нагрузках. Изменение значения URL администратора в local.xml решило обе проблемы
Это может не помочь вам, но может помочь другим. У меня была такая же проблема на ровном месте.
Удаление кеша и блокировок вручную решило проблему для меня (на данный момент).
Возможно, ваше имя администратора не совпадает с roouter->adminhtml->frontname в app/etc/local.xml
Перейдите в этот каталог app/etc/local.xml из вашего проекта magento и убедитесь, что он совпадает с вашим адресом панели администратора url-frontname;
<admin>
<routers>
<adminhtml>
<args>
<frontName><![CDATA[myadminfrontname]]></frontName>
</args>
</adminhtml>
</routers>
</admin>
Ваш URL должен быть таким
http://www.myproject.com/myadminfrontname/
также вы можете удалить каталог кеша с этим кодом.
перейдите в корневой каталог вашего проекта и напишите
rm -rfv var/*
Если в Magento отсутствует страница CMS без маршрута (ключ URL) no-route
) или если по умолчанию CMS No Route Page
настройка не установлена должным образом в System=>Configuration=>Web=>Default Pages
Magento может войти в бесконечный цикл, пока не достигнет предела в 100 итераций.
Наконец, я решил проблему, это было связано с сортировкой в etc frontend di.xml <item name="sortOrder" xsi:type="string">20</item>
Я изменил 20 на 60, и ошибка исчезла.
См.: Magento 2.1.2 Фабрика действий Роутера попадает в бесконечный цикл
Это лучшие шаги для решения этого типа проблем:
- Исправление сервера Apache.
- Раскомментирование строки из
.htaccess
если magento в подкаталоге. - Удаление
/var/cache
каталог и включениеmod_rewrite
, - Включите использование HTACCESS.
- Создать страницу без CMS CMS.
- Укажите правильную страницу 404.
- Не удается найти куки пользователя (возможная причина тоже).
Для получения более подробной информации о реализации вышеуказанных шагов перейдите по этой ссылке ниже: https://merchantprotocol.com/506/solved-front-controller-reached-100-router-match-iterations/
Я также очень рекомендую прочитать инструкцию Алана Строма. Ссылка руководства Алана Шторма: http://alanstorm.com/magentos_many_404_pages