Fundamentos para depurar uma loja Magento

81

Como depurar minha loja Magento

Essa é uma pergunta que não é muito relevante para nós agora, mas se um site Magento SE existisse há 5 anos, provavelmente teria sido nossa primeira pergunta. Para aqueles que estão começando o Magento, ou não estão familiarizados com isso - conhecer os fundamentos da depuração pode ser a chave para descartar a causa dos problemas. E, apesar de sua irrelevância para nós, agora estamos antecipando esta pergunta que aparece com uma abordagem auto-respondida.

Ajude o meu site está inoperante!

  1. Meu design está com defeito?
  2. Um módulo de terceiros está com defeito?
  3. Por que não consigo ver o erro?

Cada uma dessas perguntas pode ser respondida prontamente, seguindo uma abordagem padronizada para depuração que até os usuários mais básicos podem concluir. Por meio de um processo de eliminação dos fundamentos da depuração de uma loja Magento.

Ben Lessani - Sonassi
fonte
5
Use um bom depurador e sua inteligência ...
Sylvain Rayé
4
Esta é uma pergunta séria?
Davidalger #
5
Não, é uma pergunta auto-respondida deliberada para ajudar a fazer a bola rolar neste BETA. A troca de pilhas não apenas permite perguntas auto-respondidas, mas também a incentiva ativamente blog.stackoverflow.com/2012/05/encyclopedia-stack-exchange . @sylvain Esta questão é voltada para usuários novos / inexperientes para ajudar a lançar um processo de depuração
Ben Lessani - Sonassi
@sonassi Eu não diminuí a votação e você refatorou sua pergunta de uma maneira mais clara. Provavelmente eu poderia ter ajudado nisso :) Eu não sabia que SE não é apenas uma questão de perguntas e respostas, é bom saber. Sobre o tópico principal, a resposta aqui é apenas a superfície da maioria dos possíveis problemas mais profundos, é por isso que digo que use um depurador e entenda primeiro como funciona o processo de despacho interno do Magento. Você pode resolver muitos problemas depois de entender. Esses são meus 5 centavos. Como resolver um problema com cálculo de impostos, métodos de envio, geração de blocos ou outra coisa: depuração! Também ajuda a aprender o processo interno.
Sylvain Rayé
2
Entendido. O que eu estava tentando ajudar é com os erros fatais mais fundamentais. Obviamente, a margem para problemas é muito ampla para uma solução única responder. Peculiaridades / pequenos bugs são diagnosticados por meio de depuração - mas para erros fatais - é necessária uma abordagem menos delicada, conforme abaixo. E sim, eu beliscou a questão :)
Ben Lessani - Sonassi

Respostas:

98

A depuração é um pouco de arte, mas algo que pode ser facilmente dominado seguindo um regime simples.

Siga cada ponto até chegar finalmente a uma solução.


Habilitar erros de PHP

Essa é a chave para a maioria dos problemas. Por segurança ou outros motivos, a exibição de erros do PHP provavelmente pode ser desativada por padrão na sua configuração do PHP.

Você pode ativar erros com uma solução mais permanente ou apenas algo mais temporário.

Solução permanente

Para usuários do Apache / mod_php

No .htaccessarquivo raiz do documento - basta soltá-lo no topo.

php_flag display_startup_errors on
php_flag display_errors on
php_flag html_errors on
php_flag  log_errors on
php_value error_log  /home/path/public_html/var/log/system.log

Para usuários do Nginx / FastCGI

Na configuração do seu host virtual Nginx, na location .php {diretiva final ou no fastcgi_paramsarquivo (se você tiver um especificado)

fastcgi_param PHP_VALUE  display_startup_errors=on;
fastcgi_param PHP_VALUE  display_errors=on;
fastcgi_param PHP_VALUE  html_errors=on;
fastcgi_param PHP_VALUE  log_errors=on;
fastcgi_param PHP_VALUE  error_log=/home/path/public_html/var/log/system.log;

Solução temporária / universal

Para qualquer plataforma

Edite a inicialização do Magento index.phpna raiz do documento e remova o comentário da seguinte linha:

#ini_set('display_errors', 1);

Ativar modo de desenvolvedor

Quando você teve um erro e, de repente, acessou a página "Relatório de erros" e recebeu uma sequência de erros aparentemente inútil como 1184257287824- você tem algumas opções.

Solução permanente

Para usuários do Apache / mod_php

No .htaccessarquivo raiz do documento - basta soltá-lo no topo.

SetEnv MAGE_IS_DEVELOPER_MODE true

Para usuários do Nginx / fastcgi

Na configuração do seu host virtual Nginx, na location .php {diretiva final ou no fastcgi_paramsarquivo (se você tiver um especificado)

fastcgi_param MAGE_IS_DEVELOPER_MODE true;

Solução temporária / universal

Edite a inicialização do Magento index.phpna raiz do documento e torne a ifdeclaração sempre verdadeira ou ativada para o seu IP específico.

if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE']) || true) {
  Mage::setIsDeveloperMode(true);
}

ou

if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE']) || $_SERVER['REMOTE_ADDR'] == 'my.ip.add.ress') {
  Mage::setIsDeveloperMode(true);
}

Verifique suas permissões

Permissões incorretas causarão muitos problemas, muitos dos quais não são fáceis de encontrar à primeira vista.

Por exemplo.
Se o PHP não puder gravar no ./mediadiretório e você tiver a combinação de JS ativada - o Magento não poderá gerar o arquivo combinado e o URI exclusivo associado para a mídia. Então, o que você encontrará no código-fonte do navegador é um caminho completo do servidor para o arquivo de mídia /home/path/public_html/media/xxx

Caso contrário, o site pode parecer estar funcionando normalmente - sem erros críticos realmente visíveis.

Lembre-se de que esta prática é segura para hospedagem dedicada, mas pode apresentar problemas de segurança com hospedagem compartilhada se o processo do Apache não for chrootado por usuário.

Em nosso exemplo, o usuário SSH / FTP é sonassi, o usuário Apache é apachee o grupo éapache

Adicione o usuário FTP / SSH ao grupo Apache

Mais importante, precisamos garantir que o usuário FTP / SSH faça parte do grupo Apache, em nosso exemplo, seu apache(mas também é comum www-data)

usermod -a -G apache sonassi

Continue adicionando ao grupo quantos usuários você tiver para FTP / SSH.

Redefinir permissões originais

Portanto, antes de começarmos, vamos garantir que todas as permissões estejam corretas.

chown -R sonassi:apache /home/path/public_html/
find /home/path/public_html/ -type d -exec chmod 775 {} \;
find /home/path/public_html/ -type f -exec chmod 664 {} \;

Tornando as alterações permanentes

ACLs e bits fixos

As ACLs no Linux nos permitem definir regras específicas, no nosso caso, quais arquivos de permissões devem herdar na criação. Um pedaço fixo (mencionado posteriormente) cuida da herança do grupo, mas não ajuda nas permissões, e é por isso que usamos ACLs.

Comece ativando o suporte a ACL na partição ativa; verifique se o seu Kernel foi compilado com o suporte a ACL .

Sua partição pode ser /, /home, /varou qualquer outra coisa, substitua conforme apropriado.

mount -o remount,acl /home

Agora as ACLs estão ativadas, podemos definir as regras da ACL e agrupar os bits permanentes:

setfacl -d -m u::rwx,g::rwx,o::rx /home/path/public_html/
chmod g+s /home/path/public_html/

Mas eu não tenho suporte a ACL

Se o seu Kernel não suporta ACLs, você também pode usar umask(que é uma configuração de tempo de execução para BASH, FTP e PHP) para definir as permissões de arquivo padrão. Magento geralmente define umask(0)em index.php, no entanto, seria do seu interesse para mudar isso.

Na sua index.phpmudança, a umasklinha a ser

umask(022);

E no seu ambiente BASH para SSH, defina isso em seu .bashrcou.bash_profile

umask 022

Para o seu servidor FTP, você precisará ler a documentação, mas o princípio é o mesmo.


Reverter tema para o padrão

É possível que seu tema ou pacote seja responsável por esse problema. Voltar ao tema Magento é uma maneira rápida de descobrir.

** Isso vem com a ressalva de que alguns módulos podem depender de certos recursos do tema *

Em vez de alterar qualquer coisa pelo painel de administração, é muito mais simples simplesmente renomear os diretórios incorretos.

Via SSH

mv ./app/design/frontend/myBrokenTheme{,.tmp}
mv ./skin/frontend/myBrokenTheme{,.tmp}

Ou através do seu cliente FTP, percorra e renomeie seu pacote para outra coisa. por exemplo.myBrokenTheme.tmp

Se isso resolver seu problema

Então você precisa se aprofundar um pouco sobre qual parte do modelo é problemática. Portanto, restaure seu pacote e tente o seguinte, testando entre cada um.

Essencialmente, o processo é habilitar gradualmente os diretórios à medida que você percorre a árvore de arquivos - até encontrar o arquivo incorreto.

  1. Renomeie o diretório de layout para .tmp
  2. Renomeie o diretório do modelo para .tmp

Em seguida, se uma correção resultar, renomeie todos os arquivos no diretório de layout para .tmp- (para os usuários SSH ls | xargs -I {} mv {} {}.tmpou rename 's/^/.tmp/' *)

Em seguida, ative gradualmente cada arquivo 1 por 1 até resolver.

Se isso não resolver seu problema

É possível que seus diretórios base/defaultou enterprise/defaulttenham sido contaminados - e melhor substituídos por uma versão limpa conhecida.

Você pode fazer isso baixando uma versão limpa do Magento e substituindo seus diretórios conforme necessário. Via SSH, você pode fazer isso:

cd /home/path/public_html/
mkdir clean_mage
cd clean_mage
MAGENTO_VERSION=1.7.0.0
wget -O magento.tgz  http://www.magentocommerce.com/downloads/assets/$MAGENTO_VERSION/magento-$MAGENTO_VERSION.tar.gz
tar xvfz magento.tgz
cd /home/path/public_html/app/design/frontend
mv base{,.tmp}
cp -par /home/path/public_html/clean_mage/magento/app/design/frontend/base .
cd /home/path/public_html/skin/frontend
mv base{,.tmp}
cp -par /home/path/public_html/clean_mage/magento/skin/frontend/base .

Você também pode aproveitar diffos dois diretórios se quiser verificar as alterações.

diff -r base base.tmp

NB Este método causará mais erros durante o processo, pois a dependência do módulo determina a existência de arquivos específicos. Infelizmente, é o par para o curso.


Desativar módulos locais

Por padrão, o Magento define o caminho de inclusão do PHP para carregar classes na seguinte ordem

Local > Community > Core

Se um arquivo estiver em Local - carregue-o e não faça mais.
Se um arquivo estiver em comunidade - carregue-o e não faça mais.
Se um arquivo não puder ser encontrado em nenhum outro lugar - carregue-o do núcleo.

Novamente, em vez de desativar os módulos pelo painel de administração do Magento, é mais prático fazer isso no nível do arquivo.

Normalmente, para desativar um módulo da maneira "adequada", você deve editar o respectivo ./app/etc/modules/MyModule.xmlarquivo e definir <active>false</active>- no entanto, isso não impede que uma classe seja carregada.

Se outra classe estender uma determinada classe em um módulo (ignorando quaisquer declarações de dependência do Magento), ela ainda será carregada - independentemente de a extensão estar desabilitada ou não.

Então, novamente, o melhor meio de desativar uma extensão é renomear o diretório.

Comece desativando o local

Apenas renomeie o diretório via FTP ou use o seguinte comando SSH

mv ./app/code/local{,.tmp}

Desative a comunidade

mv ./app/code/community{,.tmp}

Se o problema for resolvido a partir de

Então, é um caso de entender de qual módulo em particular o erro ocorreu. Como no exemplo dado acima para o diagnóstico da embalagem, o mesmo processo se aplica.

Portanto, restaure o diretório X e tente o seguinte, testando entre cada um.

Essencialmente, o processo é ativar gradualmente os diretórios (módulos) um por um até que o erro ocorra novamente

  1. Renomeie todos os módulos no diretório para .tmp(para os usuários SSH ls | xargs -I {} mv {} {}.tmpou rename 's/^/.tmp/' *)
  2. Habilite gradualmente cada módulo, um por um, removendo .tmpdo nome do arquivo

Se o problema não for resolvido

Então é possível que o próprio núcleo esteja contaminado. O principal núcleo PHP do Magento consiste em

./app/code/core
./lib

Então, novamente, renomeie esses diretórios e copie em uma variante limpa. Supondo que você já baixou uma versão limpa do Magento como acima, via SSH, você pode fazer isso:

cd /home/path/public_html/app/code
mv core{,.tmp}
cp -par /home/path/public_html/clean_mage/magento/app/code/core .

Se o problema ainda não tiver sido resolvido, substitua o libdiretório também

cd /home/path/public_html
mv lib{,.tmp}
cp -par /home/path/public_html/clean_mage/magento/lib .

Neste ponto, sua loja Magento não passará de uma instalação de baunilha com um banco de dados modificado.

Na verdade, alguns modelos ainda estão armazenados no banco de dados (por exemplo, incremento do pedido) - portanto, neste ponto, torna-se um caso de fazer essas edições manualmente. Até agora, todas as etapas acima foram reversíveis, sem danos duradouros. Mas se estivéssemos importando também um banco de dados Magento limpo - isso pode ser irreversível (exceto para restaurar um backup).


O guia acima serve para ajudá-lo a identificar um erro; não para corrigir o erro resultante.

Conteúdo fornecido voluntariamente em www.sonassi.com/knowledge-base/magento-debug-process e www.sonassi.com/knowledge-base/stop-magento-permissions-errors-permanently

Ben Lessani - Sonassi
fonte
7
Eu acho que a resposta pode ser útil para alguns usuários do Magento, mas deve ser marcada como uma pergunta de perguntas e respostas semelhante ao wiki da comunidade, pois o pôster respondeu à pergunta imediatamente.
Matthias Zeis
8
Perguntas auto-respondidas não são apenas permitidas, mas incentivadas pela SE. blog.stackoverflow.com/2012/05/encyclopedia-stack-exchange . Mais usuários devem fazer isso para ajudar a versão beta a evoluir, e não para outros membros por se esforçarem para ajudar outras pessoas e progredir no site?
Ben Lessani - Sonassi
Isso não deveria ser 755e 644permissões? Ou você tem algum motivo especial para recomendar 775e 664?
Jürgen Thelen
@ Jurgen - Para todos os nossos servidores - o Nginx / Apache / PHP sempre executa o mesmo usuário que o SSH / FTP - seja em hospedagem compartilhada / dedicada. Portanto, as permissões podem ser rwxapenas do proprietário - pois o grupo e todos os outros não são relevantes. Mas, como mencionei - nem todo mundo configura seu servidor adequadamente (de fato, muito, muito poucos o fazem) - e existe o potencial do usuário do Apache / Nginx / PHP diferir do do usuário do SSH / FTP - adicionando um ao outro ao cada grupo respectivo permite que cada um dos rwxarquivos seja possível.
Ben Lessani - Sonassi
Se você não quiser diff os dois diretórios usando o terminal, você pode instalar uma destas opções GUI: askubuntu.com/questions/12473/...
pablofiumara
18

Conforme solicitado no Twitter e discutido no Meta , começarei aqui um tutorial de depuração para não-desenvolvedores.

Primeiro eu acho (até tu magento tenta se engajar nisso) Magento é muito complexo para um comerciante sem desenvolvedor / equipe de desenvolvimento. Mas se você é corajoso e deseja experimentá-lo, estamos dando o nosso melhor aqui para ajudá-lo. Eu acho que para algumas perguntas é a fronteira entre "como posso fazer isso?" e "por favor, faça o meu trabalho, sou burro demais para pesquisar no google" é uma linha bastante tênue. Entendo que muitas vezes é difícil, o Google pensa porque você não sabe para o que está pesquisando, porque ainda não sabe o nome. Dito isto, vamos coletar coisas que todos com uma loja magento podem fazer, mesmo que você não seja desenvolvedor.

Uma resposta muito boa sobre como depurar o magento, quando você quer se sujar, já foi dada por Sonassi , mas tento adicionar coisas e copiar o que eu acho que é aplicável aos comerciantes.

Isenção de responsabilidade: Todos os diretórios e arquivos mencionados neste post são relativos à pasta raiz do magento, que pode estar dentro, /var/wwwmas dependendo do provedor de hospedagem, a chamada raiz do documento pode estar em qualquer lugar, pergunte ao seu provedor se você não encontrar o seu magento !

Modo de desenvolvimento

Você quer ter erros reais, e não a página de "erro de erro" que o magento entrega normalmente. http://www.fontis.com.au/blog/magento/custom-magento-error-page

Obrigado a fontis.com por esta imagem.

Os relatórios mencionados na página podem ser encontrados em var/reports/<the_number>

Quando você ativa o modo de desenvolvimento, o magento gera um erro real; esses erros podem especialmente vazar credenciais, como as do banco de dados! Portanto, pense antes de ativá-lo nos servidores de produção!

Abra seu index.phparquivo na pasta raiz do magento, dependendo da versão, você encontrará estas linhas em torno da linha 73:

if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE'])) {
    Mage::setIsDeveloperMode(true);
}

#ini_set('display_errors', 1);

Para ativar agora o modo, você precisa alterar essas linhas.

Se você conhece seu endereço IP (a maioria das pessoas obtém um novo a cada 24 horas, pelo menos na Alemanha), o Google ajuda você aqui:

Seu endereço IP público é 87.138.100.68

if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE']) 
    || $_SERVER['REMOTE_ADDR'] == 'my.ip.add.ress'
) {
    Mage::setIsDeveloperMode(true);
    ini_set('display_errors', 1);
}

Se você não conhece seu IP por qualquer motivo, pode mostrar erros para todos.

#if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE']) || true) {
  Mage::setIsDeveloperMode(true);
#}
ini_set('display_errors', 1);

Exploração madeireira

O Magento registra muitas coisas em dois arquivos:

  • var/log/exception.log
  • var/log/system.log

Exceções são sempre registradas. O log do sistema precisa ser ativado no back-end:

System > Configuration > Developer > Log

insira a descrição da imagem aqui

Defina Enabledcomo Sim e você vê mais erros e mensagens de depuração dentro system.loge dentroexception.log

É um problema de tema?

Você tem seu próprio tema, isso é configurado no back-end aqui:

Sistema> Configuração> Design

insira a descrição da imagem aqui

Obrigado a kb.magenting.com pela imagem

Aqui você pode configurar o pacote e o tema. Se você deseja tentar reproduzir o erro no tema padrão, remova tudo dos campos de entrada. Em seguida, clique em Salvar e você verá o tema padrão do Magento, como na loja de demonstração . Se você tiver uma loja antes da 1.8, poderá encontrar uma captura de tela no Guia do Usuário do Magento Community Edition.

Se você não conseguir reproduzir o problema no tema padrão, seu tema está quebrado, entre em contato com o fornecedor do tema. Não oferecemos suporte para temas de terceiros, especialmente os comerciais.

E agora?

Você encontrou um erro real, pode-se reproduzir, é reproduzível no tema padrão? Ótimo, abra uma pergunta e estamos dando o nosso melhor para ajudar.

Na pergunta:

  • descreva o que você está fazendo
  • que erro é gerado
  • tem alguma coisa nos arquivos de log?
  • talvez uma captura de tela do erro
Fabian Blechschmidt
fonte
5
  1. Antes de tudo, você deve ativar o modo Desenvolvedor
  2. Você também pode ativar a exibição de erros em index.php: ini_set ('display_errors', 1);
  3. Compile a extensão xDebug com qualquer IDE inteligente (PhpStrom / eclipse)
  4. Desativar o módulo personalizado e de terceiros
  5. Revise seu log de exceção e erro, resolva os erros listados no log de exceção
  6. Verifique se a extensão curl e mcrypt deve estar carregada no seu servidor
  7. Verifique as permissões de pasta e arquivos chown -R sonassi: apache / home / path / public_html / find / home / path / public_html / -type d -exec chmod 775 {} \; encontre / home / caminho / public_html / -type f -exec chmod 664 {} \;
  8. Atualize a permissão 0777 do diretório media e var, se não estiver definido
  9. Inicie o IDE (phpstrom), defina os pontos de início do depurador em index.php 10.Pressione F8 e continue em seguida até obter um erro

Para usar as etapas acima, você deve obter erros definitivamente.

Abhishek Gupta
fonte
1
Agradeço suas respostas, mas em vez de responder à pergunta que já aceitou respostas, por que você não pode responder a essas perguntas?
dh47
3
@ dh47 Para mim, o que Abhishek fez é certo. Eu só quero mencionar que, responder a perguntas já aceitas ainda é relevante e importante. Na verdade, nosso site (Magento SE) não possui esse aspecto importante. É importante ter uma proporção de 2,5 respostas para sair da versão beta. Atualmente, temos apenas 1,6 proporção de respostas. Portanto, várias respostas na mesma pergunta devem ser apreciadas. Não deixe uma pergunta sem responder, pois ela tem uma resposta aceita. Se você tiver mais um ponto a acrescentar, responda.
Rajeev K Tomy
-1

Depurar Backtrace

Esta é a boa função para depurar a chamada de função no magento.

Adicione esta função em includes / config.php ou crie um novo arquivo e coloque todas as funções php usadas comuns.

função back_trace ($ exit = true) {
  $ call_back_methods = '';
  $ call_back_methods. = '';
  $ call_back_methods. = 'SNFunction NameLine NumberFile Name';

  $ contador = 1;
  foreach (debug_backtrace () como $ index => $ data) {
    // se (0 == $ index) continuar;

    $ call_back_methods. = ''. $ counter ++. '';
    $ call_back_methods. = ''. $ data ['função']. '';
    $ call_back_methods. = ''. $ data ['linha']. '';
    $ call_back_methods. = ''. $ data ['arquivo']. '';
  }

  $ call_back_methods. = '';

  imprime $ call_back_methods;

  if (true == $ exit) exit;
}

OutPut será

insira a descrição da imagem aqui

Somnath
fonte