Cursos Magento

Erros e Problemas comuns no Magento 2 (e como resolver)

, ,

13 de outubro de 2017

Depois de quase 6 meses trabalhando com Magento 2 diariamente, resolvi fazer um apanhado de erros e problemas comuns no dia-a-dia de um usuário do Magento 2.

Longe da perfeição, o Magento 2 ainda apresenta uma dezena de erros nada amigáveis para o usuário final, e muitas vezes com poucas pistas de uma solução coerente.

Por isso trago aqui uma série de erros comuns que juntei ao longo das últimas semanas e qual a solução adotada. Esta lista deve crescer, e conto com você para contribuir com outros erros e acertos.

Exception #0 (Elasticsearch\Common\Exceptions\NoNodesAvailableException): No alive nodes found in your cluster

O ElasticSearch não está presente como deveria. Experimente atualizar para MySql no painel administrativo ou executando a query: update core_config_data set value='mysql' where path='catalog/search/engine;

 

Exception #0 (UnexpectedValueException): Setup version for module ’Algum_Modulo’ is not specified

A exception inteira seria algo como:

Solução: Você removeu um módulo que ainda está listado no app/etc/config.php e/ou na tabela setup_module. Remova o registro da tabela e a linha correspondente no app/etc/config.xml. Se ele não estiver lá, rode um setup:upgrade.
Depois limpe o cache com bin/magento cache:clean.

 

Invalid Form Key. Please refresh the page.

Ocorre no admin ao tentar salvar um produto, mesmo após reiniciar a página e a sessão.
Nada a ver com a form key inválida, este é um problema na configuração do php, geralmente ao salvar um produto grande como um bundle ou configurable product, ou ainda uma categoria com muitos produtos, onde muitos dados são enviados via POST.
Solução: Mude o parâmetro max_input_vars no php.ini para um número bem estúpido, como 10000, ou acrescente
ini_set(‘max_input_vars’, 10000) no seu index.php.

 

[Zend_Json_Exception] Decoding failed: Syntax error

Ocorre ao tentar usar o comando module:enable no terminal em um módulo recém instalado ou criado.
Solução: O módulo ainda é novo e o Magento não tem ele no cache. Após limpar o cache, use o setup:upgrade no terminal.

Fatal error: Maximum function nesting level of ‘256’ reached, aborting! in ../vendor/composer/ClassLoader.php on line 373

Ocorre ao tentar habilitar um módulo que sobrescreve alguma coisa, geralmente depois de um setup:upgrade.
Solução: Experimente remover a pasta var/di e tentar novamente. Remova a pasta, não apenas seu conteúdo.

DI configuration must be cleared before running compiler. Please delete ‘/Users/martins/Docker/_images/magento2/var/di’.

Continua tendo esta mensagem ao tentar executar o setup:di:compile, mesmo após deletar o conteúdo da pasta var/di?
Solução: O problema é que tem que se deletar a pasta var/di, não apenas seu conteúdo.

There are no commands defined in the “cache” namespace. (ou outro namespace qualquer)

Solução 1: Remova as pastas (e não somente seu conteúdo): var/di, var/generation e var/page_cache.

Solução 2: Se ajudar, use “remove tudo”:  rm -rf var/cache/* var/generation var/page_cache var/tmp/* var/view_preprocessed/* var/generation var/di pub/static/frontend/* pub/static/adminhtml/*

Solução 3: Em alguns casos, algum XML de um novo modulo pode estar quebrando tudo. Digite bin/magento sem nenhum parâmetro, para obter a exception inteira.

Solução 4: E em outros casos ainda, isso pode ocorrer quando tenta executar bin/magento com uma versão do PHP incompatível com seu Magento. E lembre-se: muitas vezes a versão que você tem disponível no terminal não é a mesma do php sendo executado no servidor web. Aponte para a versão correta do php antes do bin/magento.

Solução 5: Se você versionou a pasta vendor e acabou de atualizar o Magento isso pode acontecer. Remova todo conteúdo da pasta vendor e digite composer install. Esta solução só é válida pra instalações feitas via composer.

 

Exception #0 (Magento\Framework\Exception\LocalizedException): Please upgrade your database: Run “bin/magento setup:upgrade” from the Magento root directory.

The following modules are outdated:
Algum_Modulo schema: current version – 1.1.0, required version – 1.0.0
Algum_Modulo data: current version – 1.1.0, required version – 1.0.0

Isso ocorre geralmente depois de atualizar o código da loja, ou a fazer downgrade em algum módulo instalado.

Solução: Vá na tabela setup_module e altere as duas colunas de versão para 1.0.0 (ou a versão que está pedindo) para o módulo correspondente.

 

Já alterei o memory_limit e continua mostrando 768M, e tudo lento

O Magento faz uso do arquivo .user.ini para sobrescrever o memory_limit configurado, localizado em várias pastas.
Solução: Altere seu php.ini e adicione: “user_ini.filename=“ para ignorar o .user.ini, ou altere todos os .user.ini que encontrar. Já a parte do tudo lento, é assunto pra outro post.

Template hints não aparecem no Magento 2

Solução 1: Limpe o cache, veja se está usando algum modulo de cache php, e se as templates hints estão desabilitadas em outro lugar, ou se a restrição de IPs está ativa.
Solução 2: Em algumas lojas (não multi-store), o seletor de escopo de configuração não é exibido, e as template_hints são definidas somente no scope_id = 0. Duplique o registro para scope_id = 1 na tabela core_config_data.
Solução 3: Veja se o seu arquivo app/etc/config.php contém os valores “template_hints_*” setados como 0, pois eles prevalecerão ante suas configurações de banco de dados. Após alterar, execute bin/magento app:config:import. Lembre-se de salvar o conteúdo do seu config antes.

 

Import failed: Unable to unserialize value, string is corrupted.

Este erro ocorre quando tentamos fazer setup:upgrade ou app:config:import.
É mais um bug conhecido do Magento 2.2. O problema ocorre pois a tabela flag tem uma coluna text(flag_data), que não cabe tudo o que precisa.
Antes de seguir com a correção, veja se há registros json corrompidos na tabela flag, na coluna flag_data.
Solução 1: Altere o tipo da coluna para longtext, atualize o conteúdo do registro config_hash para {"system":"","scopes":"","themes":""}, e do system_config_snapshot para '{}'.
Limpe o cache e tente novamente. Mais info aqui.

Solução 2: Este erro também pode ocorrer após atualizar o Magento. Neste caso, basta limpar os caches e tentar novamente. Lembre-se: em alguns cenários o cache não está na pasta var/cache, mas sim no Redis ou em outro lugar. Limpe no lugar certo, de acordo com as configurações de cache do seu app/etc/env.php.

 

Array to string conversion ao tentar salvar configurações da loja

Veja em seu app/etc/config.php se há algum valor como => array() e troque por => [].
Geralmente o módulo braintree/countrycreditcard está declarado desta forma…

Após alterar, execute bin/magento cache:clear e tente salvar novamente.
Ridículo? Pois é. 😃
Outro jeito mais rápido é desabilitando o Braintree com bin/magento module:disable Magento_Braintree e bin/magento setup:upgrade

 

The configuration file has changed. Run app:config:import or setup:upgrade command to synchronize configuration. – Mesmo depois de seguir as instruções o problema persiste.

Além de limpar caches e rodar o setup:upgrade, é possível que algum módulo tenha mudado a assinatura de um método ou ponto na API.
Para resolver, refaça a compilação com bin/magento setup:di:compile.
Se não resolver, verifique se está usando Opcache ou algum outro módulo de cache do PHP e limpe estes caches antes de re-executar os passos acima. Se o seu ambiente for local, e estiver usando MAMP, acesse http://localhost/MAMP/opcache.php?reset=1 para limpar o Opcache.

 

Notice: Undefined index: websites in …/vendor/magento/module-config/App/Config/Type/System.php on line 248

Solução 1: Veja se você eventualmente não apagou o arquivo app/etc/env.php com as informações de ambiente da sua loja.
Se este for o caso, terá que reinstalar seu magento. Calma, você pode aproveitar sua base antiga sem problemas, porém qualquer dado criptografado terá que ser reinserido (a menos que você tenha a chave salva em algum lugar).

Use bin/magento setup:install interactive para iniciar a instalação via linha de comando. Aponte para sua base atual. Se preferir, veja como instalar o Magento 2.

 

Forbidden em arquivo(s) html na pasta pub/static/frontend/

Às vezes renomeamos um arquivo html em uma atualização da nossa loja e até conseguimos ver o arquivo na pasta pub/…html quando acessamos o ssh. No entanto, o link simbólico para o arquivo real está corrompido. Tente abrir o arquivo na pasta pub no seu terminal, e provavelmente irá se deparar com a mensagem

Solução: remova todos os arquivos da pasta pub/static/frontend, limpe o cache do Magento e tente de novo.

 

Missing required argument $routerList of Magento\Framework\App\RouterList.

Provavelmente seu arquivo app/etc/config.php não está presente.
Solução: veja onde você perdeu seu config.php e recupere-o. Do contrário, você pode gerar um novo config.php com o comando bin/magento module:enable all, seguido de setup:upgrade. Eventualmente você habilitará módulos que antes estavam desabilitados.
Solução 2: caso ele esteja presente, mude todos os valores de cache de 1 pra 0 no próprio arquivo config.php. Isto desabilitará os caches do Magento. Lembre-se de alterar novamente se o problema for resolvido.

 

Fatal error: Class ‘IntlDateFormatter’ not found in… no terminal ao executar qualquer comando bin/magento

Você está usando uma versão do php incompatível com o Magento em questão ou a extensão intl não está habilitada nesta versão. Geralmente este erro ocorre quando você está executando php 7.1 no terminal em um Magento 2.1 ou inferior.
Solução: mapeie versões diferentes do php para ser executada no seu terminal ou atualize para um Magento compatível com seu php.

 

Upgrading data.. Error converting field info in table magento_logging_event where log_id = …

Fix data or replace with a valid value.
Failure reason: ‘unserialize(): Error at offset 170 of 255 bytes’

Este erro pode ocorrer ao executar o setup:upgrade durante uma atualização do Magento, e ele mostra uma lista de log_id que não puderam ser convertidos.
Esta tabela contém logs de ações administrativas.
Solução: A forma mais rápida e simples de resolver o problema, é excluindo estes registros. Certifique-se de substituir os log_id abaixo pelos seus, e executar a seguinte query:
DELETE FROM magento_logging_event WHERE log_id in (2989, 2990, 3406, 3408);
Execute novamente o upgrade com bin/magento setup:upgrade e repita a operação com novos log_id se necessário.

 

Import failed: Warning: Invalid argument supplied for foreach() … CountryCreditCard.php

O erro ocorre ao usarmos app:config:import ou setup:upgrade.
Isto ocorre por uma falha não tratada que adiciona um array [] como string no seu config.php ou env.php.
Solução: procure por 'countrycreditcard' => '[]', nos seus arquivos de configuração e remova as aspas do []. Veja se há outros valores com o mesmo problema e tente novamente.

 

Class ‘Locale’ not found quando tenta instalar o Magento usando bin/magento setup:install

Este erro geralmente está ligado à incompatibilidade de versão do php que está usando e do php instalado.
Vi este erro ao tentar instalar Magento Enterprise 2.2.4 usando php 7.0 na linha de comando.
Solução: aponte para o executável de um php compatível com a versão que está instalando antes de bin/magento. Ex: /usr/local/php7.1/bin/php bin/magento

 

Admin sumiu. URL de admin dando 404.

Solução 1: veja se o seu servidor mapeou a pasta /pub como a pasta principal do seu domínio (ao invéz da pasta raíz). Após corrigir, limpe o cache.
Solução 2: limpe o cache com bin/magento cache:flush e apague o conteúdo das pastas generated/code e generated/metadata
Solução 3 (apache): veja se você não apagou o arquivo .htaccess da raíz (ou /pub), e se as regras de redirecionamento de url estão ativas. Alternativamente, acesse o admin precedido de /index.php/ (ex: /index.php/admin).

 

Cache frontend ‘default’ is not recognized

Problema e solução reportada pelo Diego no grupo secreto de alunos do curso de Magento 2. O problema ocorre ao digitar qualquer comando do bin/magento.
O problema ocorre após atualizar o Magento via composer, pois um dos módulos instalados não foi instalado da mesma forma (via composer), e não era compatível com a nova versão, além de não ter sido atualizado automaticamente.

Solução: Remova ou desabilite módulos suspeitos (não os módulos do core) um a um até encontrar o problema.

Mais soluções e conteúdo

Você encontra no nosso grupo secreto de desenvolvedores Magento 2 no Facebook. É um grupo exclusivo para alunos do curso de Magento 2, onde você passará a entender como o Magento 2 funciona na prática e como desenvolver módulos e customizações. Além disso, é um ótimo lugar para buscar soluções para problemas no Magento com quem mexe diariamente com desenvolvimento.

Gostou? Compartilha vai. Comenta! Acrescente mais coisas! Seja um leitor ativo e participe! 😉

Grande abraço e até a próxima.

 

Última atualização em: 14 de Novembro de 2018

Ricardo Martins

É desenvolvedor web há 16 anos e um dos primeiros certificados pela Magento no Brasil. Instrutor de mais de 8 cursos Magento (os principais no magenteiro.com/cursos) com mais de 9 mil alunos de 100 países, é também criador do módulo PagSeguro Transparente, usado em mais de 12 mil lojas.

Últimos posts por Ricardo Martins (exibir todos)

Comentários