Cursos Magento

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

,

Atualizado em 04 de julho de 2023

Depois de alguns anos trabalhando com Magento 2 diariamente, resolvi fazer um apanhado de erros e problemas comuns no dia-a-dia.

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 organizei internamente, e qual a solução adotada para cada problema. 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:

Exception #0 (UnexpectedValueException): Setup version for module 'Algum_Modulo' is not specified
#0 /meumagento/vendor/magento/framework/Module/DbVersionInfo.php(56): Magento\Framework\Module\DbVersionInfo->isModuleVersionEqual('Algum_Modulo...', false)
#1 /meumagento/vendor/magento/framework/Module/DbVersionInfo.php(79): Magento\Framework\Module\DbVersionInfo->isSchemaUpToDate('Algum_Modulo...')
#2 /meumagento/vendor/magento/framework/Module/Plugin/DbStatusValidator.php(55): Magento\Framework\Module\DbVersionInfo->getDbVersionErrors()
#3 /meumagento/vendor/magento/framework/Interception/Interceptor.php(142): Magento\Framework\Module\Plugin\DbStatusValidator->aroundDispatch(Object(Magento\Framework\App\FrontController\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
#4 /meumagento/var/generation/Magento/Framework/App/FrontController/Interceptor.php(26): Magento\Framework\App\FrontController\Interceptor->___callPlugins('dispatch', Array, Array)
#5 /meumagento/vendor/magento/framework/App/Http.php(135): Magento\Framework\App\FrontController\Interceptor->dispatch(Object(Magento\Framework\App\Request\Http))
#6 /meumagento/vendor/magento/framework/App/Bootstrap.php(258): Magento\Framework\App\Http->launch()
#7 /meumagento/index.php(39): Magento\Framework\App\Bootstrap->run(Object(Magento\Framework\App\Http))
#8 {main}

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…

'countrycreditcard' =>
array (
),

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

$ open pub/static/frontend/…/arquivo.html 
The file pub/static/frontend/…/arquivo.html does not exist.

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.

Composer memory_limit errors quando tentando compilar ou mudar para modo production

Solução 1: aumente a memória do seu PHP
Solução 2: defina uma variável de ambiente COMPOSER_MEMORY_LIMIT com mais memoria (export COMPOSER_MEMORY_LIMIT=8G)
Solução 3: execute os passos manualmente. Faça um bin/magento setup:di:compile, depois um bin/magento deploy:mode:set –skip-compilation production e por fim um bin/magento setup:static-content:deploy

Uncaught exception ‘InvalidArgumentException’ with message ‘Constant name is expected.

O erro acima é exibido em todas as páginas, ou a mensagem “Constant name is expected.” é exibida em quase todos os comandos do bin/magento.
Solução: Edite adicione um print_r($data); antes da linha que joga a exception na tela (throw new \InvalidArgumentException) em vendor/magento/framework/Data/Argument/Interpreter/Constant.php.
Execute de novo qualquer comando para ver qual módulo causou o problema, e desabilite-o ou corrija.
Fonte: https://magento.stackexchange.com/a/267503/555

Base table or view not found: 1146 Table ‘xxx.release_notification_viewer_log’ doesn’t exist

O erro ocorre geralmente após alguma atualização de versão do Magento.
A causa do problema geralmente está ligada ao fato do módulo Magento_ReleaseNotification estar desabilitado.
Solução: habilite o módulo (bin/magento module:enable Magento_ReleaseNotification) e faça um setup:upgrade.

Exception #0 (Exception): Notice: Undefined offset: 2 in ../vendor/magento/framework/Encryption/Encryptor.php on line 590

O erro acima é exibido após tentar fazer login na área administrativa.
O problema geralmente ocorre em ambientes de desenvolvimento após alterar as configurações do PHP, eventualmente desabilitando/habilitando a extensão libsodium.
Solução 1: Mude a versão do PHP para 7.2, 7.3 ou outra suportada pela versão do seu Magento
Solução 2: Habilite ou desabilite a extensão “sodium.so” no seu php.ini
Solução 3: Instale o libsodium (pecl install libsodium) caso ela não esteja no seu php.ini

Fatal error: Uncaught Error: Undefined class constant ‘PRE_COMMAND_RUN’

O erro acima é exibido ao tentar atualizar o Magento 2 com composer.
O problema está ligado à versão do composer utilizada (que provavelmente é antigo).
Solução 1: Atualize seu composer com o comando composer self-update.
Solução 2: Se o comando acima não funcionar, remova o composer (apt-get remove composer) e instale-o novamente.

PHP Fatal error: Uncaught Error: Class ‘DOMDocument’ not found

Solução: Você precisa da extensão ext-dom habilitada em seu ambiente. Veja a lista de requisitos e extensões necessárias para rodar o Magento 2.


An exception was raised while creating “Request”; no instance returned

O problema acima ocorre ao digitar qualquer comando envolvendo bin/magento e está relacionado a um bug do Magento somado à uma incompatibilidade com a versão do PHP que está sendo usado no terminal.

Solução 1: Use uma versão do PHP inferior à que você está usando. Ex: se estiver usando 7.3, mude para 7.2.

Solução 2: Corrija o problema no Magento temporariamente alterando os arquivos como mostrado aqui.

Class Magento\Framework\App\ResourceConnection\Proxy does not exist

O problema ocorre geralmente após copiar o Magento para outro ambiente ou alterar algo nos caminhos dos arquivos. O erro acima é exibido em qualquer comando bin/magento ou ao tentar executar o Magento.

Solução 1: cheque suas permissões de arquivos, apague o conteúdo de classes compiladas (generated/code/*) e caches (inclusive no Redis se usar)

Solução 2: apague ou renomeie o arquivo vendor/autoload.php e na raíz do magento digite composer install para recriá-lo.

Unable to create or change a table without a primary key

O erro acima acontece durante a instalação do Magento, quando o banco de dados possuí a configuração sql_require_primary_key configurada para true. Este não é o valor padrão do Mysql.

Solução 1: Altere o valor padrão desta configuração no seu banco.

Solução 2: Adicione um initStatement no seu /app/etc/env.php com SET NAMES utf8; SET @@local.sql_require_primary_key = OFF; como mostrado aqui. (Contribuição de Sérgio Morais – aluno do curso Instalando e Configurando uma loja Magento 2 para o Brasil)

cluster_block_exception no ElasticSearch com FORBIDDEN read-only

O erro abaixo aparece quando um setup:upgrade é feito:
Running data recurring…{“error”:{“root_cause”:[{“type”:”cluster_block_exception”,”reason”:”index [magento2_product_1_v22] blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];”}],”type”:”cluster_block_exception”,”reason”:”index [magento2_product_1_v22] blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];”},”status”:403}

Ele geralmente está ligado à falta de espaço em disco na máquina/instância onde o ElasticSearch está sendo executado.

Solução 1: Libere espaço. Ao menos 5% é necessário. Feito isso, você precisará liberar os índices do ElasticSearch. Pode fazer isso com uma chamada como esta: curl -XPUT -H "Content-Type: application/json" http://[SEU_ELASTICSEARCH_HOST]:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'

Solução 2: Mude o parâmetro cluster.routing.allocation.disk.watermark.flood_stage com novos valores. Por exemplo:

curl -XPUT -H "Content-Type: application/json" http://SEU_ELASTIC_SEARCH_HOST:9200/_cluster/settings -d '{
  "transient": {
    "cluster.routing.allocation.disk.watermark.low": "100gb",
    "cluster.routing.allocation.disk.watermark.high": "50gb",
    "cluster.routing.allocation.disk.watermark.flood_stage": "10gb",
    "cluster.info.update.interval": "1m"
  }
}'

Lembre-se de liberar os índices com o comando da Solução 1 após isso.
Confira se os valores acima foram aplicados corretamente acessando as URL’s acima no seu navegador (ou fazendo um GET).
Fonte | Doc Oficial

Home e outras páginas apresentam 404 após limpeza de cache

O problema e a solução foi apresentado pelo Ewerton, no nosso grupo de alunos do Magento 2: O Curso.

Trata-se de um bug do Magento que já foi corrigido na versão 2.3.2 do Magento.

Solução 1: Atualize seu magento (recomendável)

Solução 2: Você pode instalar um módulo que faz uma correção pontual nisso, como mostrado aqui.

composer require elpas0/magento2-fix-homepage-404
php bin/magento setup:upgrade
php bin/magento setup:static-content:deploy
php bin/magento cache:clean

Could not validate a connection to the OpenSearch. No alive nodes found in your cluster

A mensagem acima pode ser exibida ao atualizar o Magento e usar o OpenSearch. Se este for seu caso, certifique-se de ter uma entrada com o path para catalog/search/opensearch_server_hostname e catalog/search/opensearch_server_port na sua tabela core_config_data.

Solução 1: Se não tiver estes registros, crie-os com o hostname e a porta do seu opensearch. Exemplo:

bin/magento config:set catalog/search/opensearch_server_hostname 'opensearch' e bin/magento config:set catalog/search/opensearch_server_port '9200'

Solução 2: Se tiver o registro e ainda tiver este erro, veja se consegue se conectar ao seu opensearch (curl <host>:<porta>). Provavelmente há algo errado com seu OpenSearch ou com sua configuração.

Solução 3: Caso prefira usar Elasticsearch, certifique-se de ter seus valores configurados corretamente e altere o motor de busca pra ele, com o comando bin/magento config:set catalog/search/engine 'elasticsearch7'.

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 (e membros do Clube Magenteiro), 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.

Últimos posts por Ricardo Martins (exibir todos)
Comentários

Deixe seu comentário

[fbcomments url="https://www.magenteiro.com/blog/magento-2/erros-e-problemas-comuns-no-magento-2-e-como-resolver/"]