“Se alguma coisa pode dar errado, com certeza dará” – Lei de Murphy
Já que o erro é inevitável, precisamos aprender a lidar com ele. E o melhor caminho para solucionarmos um problema é identificando sua causa. Pode parecer óbvio dito dessa maneira, mas tem muita gente que se preocupa em tratar apenas os sintomas e seus efeitos colaterais, negligenciando assim suas origens.
Vamos ver nesse post como o Magento cria os arquivos de log, e como podemos interpretar as informações geradas.
Error log record number
Até a versão 1.3.2.4, sempre que o sistema apresentava um problema inesperado, o mesmo era enviado para o navegador, expondo assim toda fragilidade do site a quem estivesse navegando.
Dessa forma então você tinha dois problemas. O erro inesperado, e uma brecha na segurança que poderia ser explorada por algum hacker de plantão.
A partir da versão 1.4.x a Magento apresentou melhorias no tratamento de erros.
There has been an error processing your request Exception printing is disabled by default for security reasons. Error log record number: 1000038750
Bom, resumir a mensagem de erro não é bem a melhoria que todos esperavam, mas diminui os riscos de ataques externos explorando as falhas que causaram o problema.
Interpretando a mensagem
Muita gente acha que o problema é identificado pelo número do log apresentado. E procuram nos fórus e grupos de ajuda uma solução para o erro de número xxx. E não é assim que funciona. Fazendo uma tradução livre e adaptada da página de erro, teremos uma mensagem que diz:
Deu merda ao processar sua solicitação de página O erro não será apresentado nessa página por segurança. VEJA o arquivo de log com número: xxxxxxxxxxx
Esse número é randomico, provavelmente baseado em um contador cronológico como um timestamp. Esse número serve apenas para que possa ser localizado o arquivo.
Sempre que esta tela de erro for apresentada, você pode encontrar um arquivo (sem extensão) no seu diretório de instalação do Magento, na pasta “var/report/“. Basta abrir o arquivo usando um editor de texto.
Identificando o problema
Assim que você abrir o arquivo, uma sequência de informações devem ser apresentadas. A primeira vista pode parece ser algo indecifrável, mas com o tempo e algumas dicas você será capaz de resolver a maioria deles.
a:5:{i:0;s:220:"SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') AND (stock_id=1)' at line 2";i:1;s:5650:"#0 /Sua intalacao do magento/lib/Zend/Db/Statement.php(300): Zend_Db_Statement_Pdo->_execute(Array) #1 /Sua intalacao do magento/lib/Zend/Db/Adapter/Abstract.php(468): Zend_Db_Statement->execute(Array) #2 /Sua intalacao do magento/lib/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('SELECT `catalog...', Array) #3 /Sua intalacao do magento/lib/Varien/Db/Adapter/Pdo/Mysql.php(333): Zend_Db_Adapter_Pdo_Abstract->query('SELECT `catalog...', Array) #4 /Sua intalacao do magento/lib/Zend/Db/Adapter/Abstract.php(725): Varien_Db_Adapter_Pdo_Mysql->query(Object(Varien_Db_Select), Array) #5 /Sua intalacao do magento/app/code/core/Mage/CatalogInventory/Model/Mysql4/Stock/Item.php(53): Zend_Db_Adapter_Abstract->fetchRow(Object(Varien_Db_Select)) #6 /Sua intalacao do magento/app/code/core/Mage/CatalogInventory/Model/Stock/Item.php(134): Mage_CatalogInventory_Model_Mysql4_Stock_Item->loadByProductId(Object(Mage_CatalogInventory_Model_Stock_Item), Object(Mage_Sales_Model_Quote_Item)) #7 /Sua intalacao do magento/app/design/adminhtml/default/default/template/sales/order/create/items/grid.phtml(239): Mage_CatalogInventory_Model_Stock_Item->loadByProduct(Object(Mage_Sales_Model_Quote_Item)) #8 /Sua intalacao do magento/app/code/core/Mage/Core/Block/Template.php(212): include('/Volumes/ Unida...') #9 /Sua intalacao do magento/app/code/core/Mage/Core/Block/Template.php(239): Mage_Core_Block_Template->fetchView('adminhtml/defau...') #10 /Sua intalacao do magento/app/code/core/Mage/Core/Block/Template.php(253): Mage_Core_Block_Template->renderView() #11 /Sua intalacao do magento/app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml() #12 /Sua intalacao do magento/app/code/core/Mage/Core/Block/Abstract.php(753): Mage_Adminhtml_Block_Template->_toHtml() #13 /Sua intalacao do magento/app/code/core/Mage/Core/Block/Abstract.php(520): Mage_Core_Block_Abstract->toHtml() #14 /Sua intalacao do magento/app/code/core/Mage/Core/Block/Abstract.php(467): Mage_Core_Block_Abstract->_getChildHtml('items_grid', true) #15 /Sua intalacao do magento/app/design/adminhtml/default/default/template/sales/order/create/items.phtml(32): Mage_Core_Block_Abstract->getChildHtml() #16 /Sua intalacao do magento/app/code/core/Mage/Core/Block/Template.php(212): include('/Volumes/ Unida...') #17 /Sua intalacao do magento/app/code/core/Mage/Core/Block/Template.php(239): Mage_Core_Block_Template->fetchView('adminhtml/defau...') #18 /Sua intalacao do magento/app/code/core/Mage/Core/Block/Template.php(253): Mage_Core_Block_Template->renderView() #19 /Sua intalacao do magento/app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml() #20 /Sua intalacao do magento/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Items.php(67): Mage_Adminhtml_Block_Template->_toHtml() #21 /Sua intalacao do magento/app/code/core/Mage/Core/Block/Abstract.php(753): Mage_Adminhtml_Block_Sales_Order_Create_Items->_toHtml() #22 /Sua intalacao do magento/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Load.php(44): Mage_Core_Block_Abstract->toHtml() #23 /Sua intalacao do magento/app/code/core/Mage/Core/Block/Abstract.php(753): Mage_Adminhtml_Block_Sales_Order_Create_Load->_toHtml() #24 /Sua intalacao do magento/app/code/core/Mage/Adminhtml/controllers/Sales/Order/CreateController.php(342): Mage_Core_Block_Abstract->toHtml() #25 /Sua intalacao do magento/app/code/core/Mage/Core/Controller/Varien/Action.php(418): Mage_Adminhtml_Sales_Order_CreateController->loadBlockAction() #26 /Sua intalacao do magento/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(254): Mage_Core_Controller_Varien_Action->dispatch('loadBlock') #27 /Sua intalacao do magento/app/code/core/Mage/Core/Controller/Varien/Front.php(177): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http)) #28 /Sua intalacao do magento/app/code/core/Mage/Core/Model/App.php(304): Mage_Core_Controller_Varien_Front->dispatch() #29 /Sua intalacao do magento/app/Mage.php(596): Mage_Core_Model_App->run(Array) #30 /Sua intalacao do magento/index.php(78): Mage::run('', 'store') #31 {main}";s:3:"url";s:186:"/instalacao magento/index.php/admin/sales_order_create/loadBlock/key/97888fef60b8f8c3ed3d7b6617e17259/block/search,items,shipping_method,totals,giftmessage,billing_method?isAjax=true";s:11:"script_name";s:33:"/instalacao do magento/index.php";s:4:"skin";s:5:"admin";}
Vejamos o exemplo acima. O Magento cria uma sequência de eventos usando # para identificar todo caminho percorrido até o erro ser encontrado.
Sendo a origem #31, onde ele mostra o evento (url) que disparou o erro. Apesar de ser uma informação teoricamente óbvia, já que você estava navegando no momento que o erro apareceu.
O que realmente importa para você é o que vem antes do #1. Essa é a mensagem que você deve interpretar. Neste exemplo:
a:5:{i:0;s:220:"SQLSTATE[42000]: Syntax error...
Se você for um desenvolvedor, rapidamente vai entender que se trata de um erro de SQL. E no restante da mensagem ainda é possível identificar com mais detalhes o erro.
Agora, se você leu a primeira linha do arquivo de log e não entendeu nada… bom, não desanime. Agora você sabe o que deve procurar, e pode solicitar ajuda de forma adequada em fóruns e grupos.
Sempre em alerta
Uma boa maneira de tratar problemas, é trabalhando na prevenção deles. E as dicas abaixo podem ajudar.
1. Tenha sempre um backup do que for realmente importante. A frequência da geração de backups vai depender do fluxo (quantidade) e da importância (geralmente financeira) que isso pode representar. Os backups podem ser diários, semanais, mensais, bimestrais.
2. Tenha um ambiente de testes. O Magento possui diversas versões de seu sistema, e existem incontáveis módulos a sua disposição. Não se deixe levar pela emoção de ter um novo módulo rodando na sua loja imediatamente… primeiro faça uma bateria de testes em um ambiente simulado, e só depois de aprovado você deve homologar em sua loja. Leve essa dica a sério, a maioria dos problemas são originados por módulos incompatíveis.
3. Depois de efetuar alterações em arquivos de configuração, módulos e/ou templates, atualize o cache do sistema e do navegador. E não se esqueça de reindexar os dados sempre que o Magento solicitar. Pode acontecer de você aplicar uma alteração inconsistente e o sistema não apresentar problema de imediato porque continua trabalhando com arquivos de cache, e meses depois o problema aparecer do “nada”.
4. Depois de ler o arquivo de log, você não precisa mais dele, pode deletar o arquivo da pasta “var/report/” sem problemas. Mas seja pró-ativo, não fique esperando que o problema venha até você. Crie o hábito de verificar esse diretório de tempos em tempos, pois um problema pode ser “descoberto” por algum visitante do site, e nem todos irão entrar em contato com a loja para avisar que ocorreu um problema na navegação.
5. Aprenda a pedir ajuda. Mensagens em fóruns com título “URGENTE” não vão ajudar. Comece usando o campo de busca do fórum com palavras-chaves que identifiquem seu problema, veja se alguém já passou pelo mesmo problema e conseguiu resolver. Senão, abra um novo tópico e coloque um título que seja auto-explicativo. Suas chances de obter ajuda e de ajudar outras pessoas só vão aumentar.
Sucesso!