Magento completamente quebrado:Chame uma função de membro getCode() em booleano e não houve nenhuma página 404 CMS configurada ou encontrada

magento.stackexchange https://magento.stackexchange.com//questions/87164

Pergunta

De repente (sem quaisquer alterações ou atualizações) nossa instalação do magento parece estar completamente quebrada.

Todos os dias recebemos alguns destes erros:

  1. Não houve nenhuma página 404 CMS configurada ou encontrada ao acessar /index.
  2. O instalador do magento aparece repentinamente ao acessar/index
  3. Nenhum modelo está aparecendo (como mostrado na imagem)

enter image description here

  1. Redirecionamentos estranhos.Quando tudo parece funcionar (sem erro de 404 cms, sem problemas de modelo) e tento visitar um produto, às vezes sou redirecionado para a página inicial.

Bem, o que fiz até agora foi:

  1. pasta de cache liberada, pasta de sessão liberada
  2. tabela truncada core_url_rewrite

Pareceu funcionar.Após a reindexação (core_url_rewrite) tudo parecia quebrado novamente, então trunquei novamente.Com core_url_rewrite vazio, parecia tudo bem.Mas no dia seguinte estava quebrado novamente.

Bem, hoje é a mesma coisa de novo, mas hoje também é a primeira vez que a limpeza de cache, sessões e core_url_rewrite não funciona mais.

Ah, e isso está aparecendo em nosso log de erros do nginx:

[erro] 11773#11773:*242799 FastCGI enviado em stderr:"Mensagem PHP:Erro fatal do PHP:Chame uma função de membro getCode() em booleano em /htdocs/seg_posorder/stage/app/code/core/Mage/Customer/Model/Session.php na linha 71" enquanto lê o cabeçalho de resposta do upstream, cliente:217.24.X.X, servidor:www.example.com, solicite:"GET /index.php/customer/account/login/ HTTP/1.1", upstream:"fastcgi://unix:/var/run/php5-fpm.sock:", anfitrião:"www.example.com", referenciador:"exemplo.com"

Mas nossas lojas também parecem boas:

enter image description here

Foi útil?

Solução

Depois Conversando com @moose, decidi postar isso como resposta.Graças a Próximo por apontar @moose para meu artigo e, assim, alimentar meu desejo insaciável por estrelas em meu repositório github.

Há um bug de cache de configuração principal do magento que causa um erro "Nenhuma página 404 CMS configurada" ou - em outros casos - um erro "100 iteração de correspondência de roteador".O erro desaparece quando você libera o cache, mas geralmente reaparece depois de algum tempo.

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

(Editar:Outras alterações podem ser adicionadas para evitar corrupção de configuração: https://github.com/convenient/magento-ce-ee-config-corruption-bug#update-2-further-improvements)

Replicação

Confira meu repositório acima.

Tem um arquivo 100-roteador-script.php o que deve ajudar a replicar o erro para você, executando-o na raiz do seu site.

O remendo

Magento lançou um patch (SUPEE-4755) baseado no meu artigo.

PATCH_SUPEE-4755_EE_1.13.1.0_v1.sh

Este patch é exatamente igual à minha correção, o que lhe dá alguma validade.

Este patch não está listado publicamente em nenhum lugar porque o Magento não faz isso por nada além de patches de segurança por algum motivo.Sei que o arquivo do patch diz EE_1.13.1.0, mas eu o testei no Community Edition 1.9 e se aplicava bem.

Você pode obter uma cópia do patch aqui:https://github.com/convenient/magento-ce-ee-config-corruption-bug/blob/master/PATCH_SUPEE-4755_EE_1.13.1.0_v1.sh

E por razões históricas ou caso minha conta do github seja excluída

/**
* 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;
}

Se isso não resolver sua instância do Magento

Este arquivo de patch resolverá todas as instâncias razoavelmente vanilla do magento (qualquer coisa que reinicialize o cache de configuração usando o definido init ou reinit métodos).

Se você tiver algum código que chame o loadDb função - como n98-magerun - então é provável que você passe por momentos difíceis e considere refatorar seu código para chamar reinit ou init sobre Mage_Core_Model_Config.

Se você ainda tiver problemas, recomendo que leia meu artigo e

  1. Implemente a lógica mencionada no Depurando o problema seção.
  2. Aguarde até que alguns dados de registro apareçam.
  3. Contate-me!

Uma teoria sobre por que o supee 6788 piora o erro

Acabei de postar isso na sala de bate-papo e pensei em colocá-lo aqui para a posteridade.

Algo a lembrar é que o Magento sempre teve esse bug em seu fundo.E que supee 6788 acabou de fazer algo que é mais provável que aconteça

Acabei de dar uma olhada no patch supee 6788 para EE1.14. Esta é minha teoria de trabalho.

Mage_Core_Controller_Varien_Router_Admin foi corrigido para substituir o addModule função

Agora, não consigo lembrar a ordem em que as coisas ocorrem durante a inicialização da solicitação mage. Mas esta modificação agora adiciona duas chamadas para Mage::getConfig()->getNode() em cada solicitação, bem no início do fluxo.Se houver uma falha no parâmetro do cache de objeto com useCache durante qualquer uma dessas duas chamadas, isso poderá acionar uma configuração incompleta sendo gravada no cache (getNode pode acionar uma reinicialização, pois tenta carregar valores do cache e em um falha no carregamento, ele irá reiniciar todo o cache de configuração e salvá-lo novamente através da função reinit())

Portanto, talvez apenas adicionar esses dois modelos extras a uma parte muito cedo da solicitação, quando a configuração completa pode não ser carregada, poderia ter causado esse erro de qualquer maneira que eu não suasse um entendimento completo do problema.Seria muito trabalho para não muito ganho e procurar no MAGE_CORE_MODEL_CONFIG :: LoadDB (com foco no efeito que o sinalizador de USECACHACH pode ter) poderia deixar um homem louco.

Outras dicas

Dos problemas que você descreve, apenas o ponto 2 é particularmente familiar, mas vale a pena ver como o resolvemos em nosso caso:

Há um bug na biblioteca libxml do PHP - acho que é Este - o que significa que às vezes o Magento falha ao carregar alguns de seus próprios arquivos de configuração.Você pode descobrir que foi alguma atualização de baixo nível (PHP ou uma das bibliotecas das quais ela depende) que revelou o problema.

Tente adicionar esta linha ao index.php, logo no início (coloquei logo após a verificação da versão do PHP):

libxml_disable_entity_loader(false);

Próximo (Magento Platinum Hosting Partner) me indicou a solução no GitHub (muitos parabéns para Lucas Rodgers, o autor do patch)

Bug do Magento - Cache de configuração corrompido

PATCH_SUPEE-4755_EE_1.13.1.0_v1.sh

Este patch é exatamente igual à minha correção, o que lhe dá alguma validade.

Este patch não está listado publicamente em nenhum lugar porque o Magento não faz isso por nada além de patches de segurança por algum motivo.Sei que o arquivo do patch diz EE_1.13.1.0, mas eu o testei no Community Edition 1.9 e se aplicava bem.

Esta página oferece uma explicação completa E a capacidade de reproduzir o erro executando o 100-roteador-script.php do seu diretório raiz (isso replicou o problema para mim, primeira tentativa).

O conserto:

/**
* 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;
}

Continua dizendo:

Seria ingênuo da minha parte acreditar que isso resolverá completamente o problema para a configuração de todos os magento.Se não funcionar para você, eu recomendo você

  • Implemente a lógica mencionada na seção Depurando o problema.
  • Aguarde até que alguns dados de registro apareçam.
  • Contate-me!

Como faz muito tempo que não recebo resposta (e nossa loja está em produção para um cliente), precisei encontrar minha própria solução.Vou compartilhar, talvez possa ajudar a encontrar o problema:

No meu index.php eu mudei:

/* 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);

Para:

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

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

Isso está codificado e só funciona porque temos apenas uma loja.Mas ainda assim, parece funcionar agora.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top