Fondamenti per il debug di un negozio Magento


81

Come posso eseguire il debug del mio negozio Magento

Questa è una domanda che non è troppo rilevante per noi ora, ma se un sito di Magento SE esistesse 5 anni fa, probabilmente sarebbe stata la nostra prima domanda. Per coloro che stanno semplicemente entrando in Magento, o non hanno familiarità con esso - conoscere i fondamenti del debugging può essere la chiave per escludere la causa dei problemi. E nonostante la sua irrilevanza per noi ora stiamo anticipando questa domanda che appare con un approccio autosufficiente.

Aiuta il mio sito non funziona!

  1. Il mio design è in errore?
  2. È difettoso un modulo di terze parti?
  3. Perché non riesco a vedere l'errore?

A ciascuna di queste domande è possibile rispondere prontamente seguendo un approccio standardizzato al debug che anche gli utenti più elementari possono completare. Mediante un processo di eliminazione dei fondamenti del debug di un negozio Magento.


5
Usa un buon debugger e la tua intelligenza ...
Sylvain Rayé,

4
È una domanda seria?
davidalger,

5
No, è una domanda deliberatamente autorisposta per aiutare a far rotolare la palla su questo BETA. Lo scambio di stack non solo consente domande con risposta autonoma, ma lo incoraggia attivamente blog.stackoverflow.com/2012/05/encyclopedia-stack-exchange . @sylvain Questa domanda è rivolta agli utenti nuovi / inesperti per aiutare a dare il via a un processo di debug
Ben Lessani - Sonassi,

@sonassi Non ho effettuato il downvoting e hai riformulato la tua domanda in modo più chiaro. Probabilmente avrei potuto aiutarlo :) Non sapevo che SE non fosse solo una domanda e risposta, buono a sapersi. Per quanto riguarda l'argomento principale, la risposta qui è solo la superficie della maggior parte dei possibili problemi più profondi, è per questo che dico di usare un debugger e capire prima come funziona il processo di invio interno di Magento, puoi risolvere molti problemi dopo averlo capito. Questi sono i miei 5 centesimi. Come risolvere un problema con il calcolo delle imposte, i metodi di spedizione, la generazione di blocchi o altro: debug! Aiuta anche a imparare il processo di tirocinio.
Sylvain Rayé,

2
Inteso. Quello che stavo cercando di aiutare sono gli errori fatali più fondamentali. Ovviamente l'ambito dei problemi è troppo ampio per rispondere a un'unica soluzione. Stranezze / piccoli bug vengono diagnosticati tramite debug - ma per errori fatali - è richiesto un approccio meno delicato, come di seguito. E sì, ho modificato la domanda :)
Ben Lessani - Sonassi,

Risposte:


98

Il debug è un po 'un'arte, ma qualcosa che può essere facilmente padroneggiato seguendo un semplice regime.

Segui ogni punto fino a raggiungere finalmente una soluzione.


Abilita errori PHP

Questa è la chiave per la maggior parte dei problemi. Per motivi di sicurezza o altri motivi, la visualizzazione dell'errore PHP potrebbe essere disabilitata per impostazione predefinita dalla configurazione di PHP.

È possibile abilitare gli errori con una soluzione più permanente o semplicemente qualcosa di più temporaneo.

Soluzione permanente

Per utenti Apache / mod_php

Nel .htaccessfile radice del documento: rilascialo in alto.

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

Per utenti Nginx / FastCGI

Nella configurazione del tuo host virtuale Nginx, nella location .php {direttiva finale o nel fastcgi_paramsfile (se ne hai specificato uno)

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;

Soluzione temporanea / universale

Per qualsiasi piattaforma

Modifica il bootstrap Magento index.phpnella radice del documento e decommenta la seguente riga:

#ini_set('display_errors', 1);

Abilita modalità sviluppatore

Quando hai avuto un errore e hai colpito improvvisamente la pagina "Rapporto errori" e ti è stata data una stringa di errore apparentemente inutile come 1184257287824- hai alcune opzioni.

Soluzione permanente

Per utenti Apache / mod_php

Nel .htaccessfile radice del documento: rilascialo in alto.

SetEnv MAGE_IS_DEVELOPER_MODE true

Per utenti Nginx / fastcgi

Nella configurazione del tuo host virtuale Nginx, nella location .php {direttiva finale o nel fastcgi_paramsfile (se ne hai specificato uno)

fastcgi_param MAGE_IS_DEVELOPER_MODE true;

Soluzione temporanea / universale

Modifica il bootstrap Magento index.phpnella radice del documento e rendi l' ifistruzione sempre vera o abilitata per il tuo IP specifico.

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

o

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

Controlla le tue autorizzazioni

Autorizzazioni errate causeranno numerosi problemi, molti dei quali non sono così facili da trovare a prima vista.

Per esempio.
Se PHP non è in grado di scrivere nella ./mediadirectory e hai attivato la combinazione JS, Magento non è in grado di generare il file combinato e l'URI univoco associato per il supporto. Quindi, invece, quello che troverai nel codice sorgente del tuo browser è un percorso completo del server per il file multimediale /home/path/public_html/media/xxx

Altrimenti, il sito può sembrare funzionare normalmente, senza errori critici effettivamente visibili.

Tieni presente che questa pratica è sicura per l'hosting dedicato, ma può presentare problemi di sicurezza con l'hosting condiviso se il processo Apache non è sottoposto a chroot per utente.

Nel nostro esempio, l'utente SSH / FTP è sonassi, l'utente Apache è apachee il gruppo lo èapache

Aggiungi l'utente FTP / SSH al gruppo Apache

Ancora più importante, dobbiamo assicurarci che l'utente FTP / SSH faccia parte del gruppo Apache, nel nostro esempio, è apache(ma è anche comunemente www-data)

usermod -a -G apache sonassi

Continua ad aggiungere al gruppo tutti gli utenti che hai per FTP / SSH.

Ripristina permessi originali

Quindi, prima di iniziare, assicuriamoci che tutte le autorizzazioni siano corrette.

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 {} \;

Rendere permanenti le modifiche

ACL e bit appiccicosi

Gli ACL in Linux ci consentono di definire regole specifiche, nel nostro caso, quali file di autorizzazioni dovrebbero ereditare al momento della creazione. Un po 'appiccicoso (menzionato più avanti) si occupa dell'ereditarietà di gruppo, ma non aiuta con le autorizzazioni, motivo per cui utilizziamo gli ACL.

Inizia abilitando il supporto ACL sulla partizione attiva, assicurati che il tuo kernel sia stato compilato con il supporto ACL .

La partizione può essere /, /home, /varo qualcosa d'altro, sostituire a seconda dei casi.

mount -o remount,acl /home

Ora gli ACL sono abilitati, possiamo impostare le regole ACL e raggruppare i bit sticky:

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

Ma non ho il supporto ACL

Se il tuo kernel non supporta gli ACL puoi anche usare umask(che è un'impostazione di runtime per BASH, FTP e PHP) per impostare le autorizzazioni di file predefinite. Magento di solito mette umask(0)in index.php, tuttavia, sarebbe nel vostro interesse a cambiare questo.

Nel tuo index.phpcambio la umasklinea sarà

umask(022);

E nel tuo ambiente BASH per SSH, imposta questo in tuo .bashrco.bash_profile

umask 022

Per il tuo server FTP, dovrai leggere la documentazione, ma il principio è lo stesso.


Ripristina tema predefinito

È possibile che il tema o il pacchetto siano responsabili di questo problema. Tornare a un tema Magento alla vaniglia è un modo rapido per scoprirlo.

** Questo viene fornito con l'avvertenza che alcuni moduli potrebbero dipendere da alcune funzionalità del tema *

Invece di modificare qualsiasi cosa tramite il pannello di amministrazione, è molto più semplice rinominare semplicemente le directory offensive.

Tramite SSH

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

O tramite il tuo client FTP, attraversa e rinomina il tuo pacchetto con qualcos'altro. per esempio.myBrokenTheme.tmp

Se questo risolve il problema

Quindi è necessario scavare un po 'più a fondo su quale parte del modello è problematica. Quindi ripristinare il pacchetto e provare quanto segue, testando tra ciascuno.

In sostanza, il processo consiste nell'abilitare gradualmente le directory mentre attraversi l'albero dei file, fino a quando non trovi il file offensivo.

  1. Rinominare la directory di layout in .tmp
  2. Rinominare la directory del modello in .tmp

Quindi, se si ottiene una correzione, rinominare tutti i file nella directory di layout in .tmp- (per gli utenti SSH ls | xargs -I {} mv {} {}.tmpo rename 's/^/.tmp/' *)

Quindi abilitare gradualmente ogni file 1 per 1 fino alla risoluzione.

Se ciò non risolve il problema

Esiste la possibilità che i vostri base/defaulto enterprise/defaultle directory sono diventati contaminati - e sono meglio sostituito con una versione pulita noto.

Puoi farlo scaricando una build pulita di Magento e sostituendo le tue directory se necessario. Tramite SSH puoi fare questo:

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 .

È inoltre possibile cogliere l'opportunità per diffle due directory se si desidera verificare eventuali modifiche.

diff -r base base.tmp

NB. Questo metodo causerà più errori durante il processo, poiché la dipendenza del modulo determina l'esistenza di file specifici. Sfortunatamente, è la norma per il corso.


Disabilita i moduli locali

Per impostazione predefinita, Magento definisce il percorso di inclusione PHP per caricare le classi nel seguente ordine

Local > Community > Core

Se un file è in Local, caricalo e non fare altro.
Se un file è nella comunità, caricalo e non fare altro.
Se un file non può essere trovato da nessun'altra parte, caricalo dal core.

Ancora una volta, piuttosto che disabilitare i moduli tramite il pannello di amministrazione di Magento, è più pratico farlo a livello di file.

In genere, per disabilitare un modulo nel modo "corretto", è necessario modificare il rispettivo ./app/etc/modules/MyModule.xmlfile e impostarlo <active>false</active>, tuttavia ciò non impedisce il caricamento di una classe.

Se un'altra classe estende una determinata classe in un modulo (ignorando qualsiasi dichiarazione di dipendenza Magento), verrà comunque caricata, indipendentemente dal fatto che l'estensione sia disabilitata o meno.

Quindi, il modo migliore per disabilitare un'estensione è rinominare la directory.

Inizia disabilitando locale

Rinomina la directory tramite FTP o usa il seguente comando SSH

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

Quindi disabilitare la community

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

Se il problema è risolto da entrambi

Quindi si tratta di capire da quale modulo, in particolare, deriva l'errore. Come nell'esempio sopra riportato per la diagnosi del pacchetto, si applica lo stesso processo.

Quindi ripristina la directory X e prova quanto segue, testando tra di loro.

In sostanza, il processo consiste nell'abilitare gradualmente le directory (moduli) una alla volta fino a quando non si ripresenta l'errore

  1. Rinominare tutti i moduli nella directory in .tmp(per gli utenti SSH ls | xargs -I {} mv {} {}.tmpo rename 's/^/.tmp/' *)
  2. Abilitare gradualmente ogni modulo uno per uno, rimuovendolo .tmpdal nome del file

Se il problema non viene risolto

Quindi è possibile che il nucleo stesso sia contaminato. Il nucleo principale di Magento PHP è costituito da

./app/code/core
./lib

Quindi, rinominare queste directory e copiarle in una variante pulita. Supponendo che tu abbia già scaricato una versione pulita di Magento come sopra, tramite SSH, puoi farlo:

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

Quindi se il problema persiste, sostituire anche la libdirectory

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

A questo punto, il tuo negozio Magento non sarà altro che un'installazione vanilla con un database modificato.

Alcuni modelli sono effettivamente ancora archiviati nel database (ad es. Incremento dell'ordine), quindi a questo punto diventa un caso di apportare manualmente tali modifiche. Finora, tutti i passaggi precedenti sono stati reversibili senza danni permanenti. Ma se importassimo anche un database Magento pulito, potrebbe rivelarsi irreversibile (a meno di ripristinare un backup).


La guida sopra ti aiuta a identificare un errore; non correggere l'errore risultante.

Contenuti generosamente forniti da www.sonassi.com/knowledge-base/magento-debug-process e www.sonassi.com/knowledge-base/stop-magento-permissions-errors-permanently


7
Penso che la risposta possa essere utile per alcuni utenti di Magento, ma dovrebbe essere contrassegnata come una domanda di domande e risposte simile a una wiki di comunità poiché il poster risponde immediatamente alla domanda.
Matthias Zeis,

8
Le domande a risposta autonoma non sono solo consentite, ma incoraggiate da SE. blog.stackoverflow.com/2012/05/encyclopedia-stack-exchange . Più utenti dovrebbero farlo per aiutare questa beta ad evolversi, senza prevedere altri membri per fare uno sforzo per aiutare gli altri e far progredire il sito?
Ben Lessani - Sonassi,

Non dovrebbe essere questo 755e le 644autorizzazioni? O hai qualche motivo speciale per raccomandare 775e 664?
Jürgen Thelen,

@Jurgen - Per tutti i nostri server - Nginx / Apache / PHP funziona sempre come lo stesso utente di SSH / FTP, sia su hosting condiviso / dedicato. Quindi le autorizzazioni possono essere rwxsolo per il proprietario, poiché il gruppo e tutti gli altri non sono rilevanti. Ma come ho già detto - non tutti configurano correttamente il proprio server (in effetti, molto, molto pochi) - e c'è il potenziale per l'utente Apache / Nginx / PHP di differire da quello dell'utente SSH / FTP - quindi aggiungersi a ogni rispettivo gruppo consente quindi a ciascuno di rwxfile come dovrebbero essere in grado di.
Ben Lessani - Sonassi,

Se non si desidera diffondere le due directory usando il terminale, è possibile installare una di queste opzioni della GUI: askubuntu.com/questions/12473/…
pablofiumara,

18

Come richiesto su Twitter e discusso su Meta , inizierò qui un tutorial di debug per i non sviluppatori.

Per prima cosa penso (anche tu Magento cerca di impegnarsi in questo) Magento è troppo complesso per un commerciante senza team di sviluppo / sviluppo. Ma se sei coraggioso e vuoi provarlo, stiamo facendo del nostro meglio per aiutarti. Penso che per alcune domande sia il confine tra "come posso fare questo?" e "per favore fai il mio lavoro, sono troppo stupido per google questo" è una linea abbastanza sottile. Capisco che spesso è difficile, pensa Google perché non sai per cosa stai cercando su Google, perché non conosci ancora il nome. Detto questo, raccogliamo le cose che tutti possono fare con un negozio di Magento, anche se non sei uno sviluppatore.

Un'ottima risposta su come eseguire il debug di Magento, quando vuoi sporcarti, è stata già fornita da Sonassi , ma provo ad aggiungere cose e copiare ciò che ritengo applicabile ai commercianti.

Dichiarazione di non responsabilità: tutte le directory e i file menzionati in questo post sono relativi alla cartella principale di magento, che potrebbe trovarsi /var/wwwma a seconda del provider di hosting, il cosiddetto Document Root può essere ovunque, chiedi al tuo provider, se non trovi il tuo magento !

Modalità di sviluppo

Volete avere errori reali, non quella pagina "si è verificato un errore" che Magento offre normalmente. http://www.fontis.com.au/blog/magento/custom-magento-error-page

Grazie a fontis.com per questa immagine.

I rapporti, menzionati nella pagina sono disponibili in var/reports/<the_number>

Quando attivi la modalità di sviluppo, magento genera un errore reale, questi errori possono in particolare perdere credenziali, come quelle per il database! Quindi, pensa prima di accenderlo sui server di produzione!

Apri il tuo index.phpfile nella cartella principale di magento, a seconda della versione, trovi queste righe intorno alla linea 73:

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

#ini_set('display_errors', 1);

Per attivare ora la modalità, è necessario modificare queste righe.

Se conosci il tuo indirizzo IP (la maggior parte delle persone ne riceve uno nuovo ogni 24 ore, almeno in Germania), google ti aiuta qui:

Il tuo indirizzo IP pubblico è 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 non conosci il tuo IP per nessun motivo, puoi mostrare errori per tutti.

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

Registrazione

Magento registra molte cose in due file:

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

Le eccezioni vengono sempre registrate. Il registro di sistema deve essere abilitato nel back-end:

System > Configuration > Developer > Log

inserisci qui la descrizione dell'immagine

Impostato Enabledsu Sì e vedrai più errori e messaggi di debug in system.loge inexception.log

È un problema a tema?

Hai il tuo tema, questo è configurato nel backend qui:

Sistema> Configurazione> Progettazione

inserisci qui la descrizione dell'immagine

Grazie a kb.magenting.com per l'immagine

Qui è possibile configurare il pacchetto e il tema. Se si desidera provare a riprodurre l'errore nel tema predefinito, rimuovere tutto dai campi di input. Quindi fai clic su Salva e vedrai il tema standard di Magento come nel negozio demo , se hai un negozio prima della 1.8 puoi trovare una schermata nella Guida dell'utente di Magento Community Edition

Se non riesci a riprodurre il problema con il tema predefinito, il tema è rotto, contatta il fornitore del tema. Non forniamo supporto per temi di terze parti, in particolare quelli commerciali.

E adesso?

Hai trovato un vero errore, uno può riprodurre, è riproducibile nel tema predefinito? Bene, per favore apri una domanda e stiamo facendo del nostro meglio per aiutarti.

Nella domanda:

  • descrivi cosa stai facendo
  • quale errore viene generato
  • c'è qualcosa nei file di registro?
  • forse una schermata dell'errore

5
  1. Prima di tutto dovresti abilitare la modalità sviluppatore
  2. Puoi anche abilitare la visualizzazione degli errori in index.php: ini_set ('display_errors', 1);
  3. Compila l'estensione xDebug con qualsiasi IDE intelligente (PhpStrom / eclipse)
  4. Disabilita il modulo personalizzato e di terze parti
  5. Rivedi la tua eccezione e il log degli errori, risolvi gli errori elencati nel log delle eccezioni
  6. Verifica che l'estensione curl e mcrypt sia caricata sul tuo server
  7. Controlla la cartella e i permessi dei file 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 {} \;
  8. Aggiorna l'autorizzazione directory media e var 0777 se non impostata
  9. Avviare IDE (phpstrom), quindi impostare i punti di inizio del debugger su index.php 10.Premere F8 e andare avanti fino a quando non viene visualizzato l'errore

Per utilizzare i passaggi precedenti, dovresti ottenere sicuramente degli errori.


1
Apprezzo le tue risposte ma invece di rispondere alla domanda che ha già accettato le risposte, perché non puoi rispondere a queste domande.
dh47,

3
@ dh47 Per me, quello che ha fatto Abhishek è giusto. Voglio solo ricordare che rispondere a domande già accettate è ancora pertinente e importante. In realtà il nostro sito (Magento SE) manca di questo importante aspetto. È importante avere una razione di 2,5 risposte per uscire dalla beta. Al momento abbiamo solo un rapporto di risposta di 1,6. Quindi dovrebbero essere apprezzate più risposte sulla stessa domanda. Non lasciare una domanda senza rispondere a causa di quella domanda avere una risposta accettata. Se hai ancora un punto da aggiungere, dovresti rispondere.
Rajeev K Tomy,

-1

Backtrace di debug

Questa è la buona funzione per eseguire il debug della chiamata di funzione in magento.

Aggiungi questa funzione in include / config.php o crea un nuovo file e metti le tue funzioni php usate più comunemente.

funzione back_trace ($ exit = true) {
  $ call_back_methods = '';
  $ call_back_methods. = '';
  $ call_back_methods. = 'SNFunction NameLine NumberFile Name';

  $ counter = 1;
  foreach (debug_backtrace () come $ index => $ data) {
    // if (0 == $ index) continua;

    $ call_back_methods. = ''. $ counter ++. '';
    $ call_back_methods. = ''. $ data ['funzione']. '';
    $ call_back_methods. = ''. $ data ['line']. '';
    $ call_back_methods. = ''. $ data ['file']. '';
  }

  $ call_back_methods. = '';

  stampa $ call_back_methods;

  if (true == $ exit) esce;
}

OutPut sarà

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.