Fundamentos para depurar una tienda Magento

81

¿Cómo puedo depurar mi tienda Magento?

Esta es una pregunta que no es demasiado relevante para nosotros ahora, pero si existiera un sitio Magento SE hace 5 años, probablemente habría sido nuestra primera pregunta. Para aquellos que acaban de ingresar a Magento, o que no están familiarizados con él, conocer los fundamentos de la depuración puede ser clave para descartar la causa de los problemas. Y a pesar de su irrelevancia para nosotros ahora, nos estamos adelantando a esta pregunta que aparece con un enfoque de respuesta propia.

¡Ayuda mi sitio está caído!

  1. ¿Mi diseño tiene la culpa?
  2. ¿Es culpable un módulo de terceros?
  3. ¿Por qué no puedo ver el error?

Cada una de estas preguntas se puede responder fácilmente siguiendo un enfoque estandarizado para la depuración que incluso los usuarios más básicos pueden completar. Mediante un proceso de eliminación de los fundamentos de la depuración de una tienda Magento.

Ben Lessani - Sonassi
fuente
55
Utilice un buen depurador y su inteligencia ...
Sylvain Rayé
44
¿Es esta una pregunta seria?
davidalger 01 de
55
No, es una pregunta deliberada con respuesta propia para ayudar a que la pelota ruede en esta BETA. El intercambio de pila no solo permite preguntas con respuesta propia, sino que lo alienta activamente blog.stackoverflow.com/2012/05/encyclopedia-stack-exchange . @sylvain Esta pregunta está dirigida a usuarios nuevos / inexpertos para ayudar a iniciar un proceso de depuración
Ben Lessani - Sonassi
@sonassi No voté en contra y tu refactorizaste tu pregunta de una manera más clara. Probablemente podría ayudar para eso :) No sabía que SE no es solo un Q&A, es bueno saberlo. Sobre el tema principal, la respuesta aquí es solo la superficie de la mayoría de los posibles problemas más profundos, es por eso que digo que use un depurador y entienda primero cómo funciona el proceso de despacho interno de Magento, puede resolver muchos problemas después de haberlo entendido. Esos son mis 5 centavos. Cómo resolver un problema con el cálculo de impuestos, métodos de envío, generación de bloques o de lo contrario: ¡depuración! Ayuda también a aprender el proceso interno.
Sylvain Rayé
2
Entendido. Intenté ayudar con los errores fatales más fundamentales. Obviamente, el alcance de los problemas es demasiado amplio para responder a una única solución. Las anomalías / pequeños errores se diagnostican mediante depuración, pero para errores fatales, se requiere un enfoque menos delicado, como se muestra a continuación. Y sí, modifiqué la pregunta :)
Ben Lessani - Sonassi

Respuestas:

98

La depuración es un poco un arte, pero algo que se puede dominar fácilmente siguiendo un régimen simple.

Sigue cada punto hasta que finalmente llegues a una solución.


Habilitar errores PHP

Esto es clave para la mayoría de los problemas. Por razones de seguridad u otras, la configuración de PHP podría deshabilitar por defecto la visualización de errores de PHP.

Puede habilitar errores con una solución más permanente, o simplemente algo más temporal.

Solución permanente

Para usuarios de Apache / mod_php

En el .htaccessarchivo raíz de su documento , simplemente colóquelo en la parte superior.

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 usuarios de Nginx / FastCGI

En su configuración de virtualhost de Nginx, en la location .php {directiva final o en el fastcgi_paramsarchivo (si tiene uno 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;

Solución temporal / universal

Para cualquier plataforma

Edite el bootstrap de Magento index.phpen la raíz de su documento y descomente la siguiente línea:

#ini_set('display_errors', 1);

Habilitar modo desarrollador

Cuando ha tenido un error y de repente ha llegado a la página "Informe de errores", y se le ha dado una cadena de error aparentemente inútil como 1184257287824: tiene algunas opciones.

Solución permanente

Para usuarios de Apache / mod_php

En el .htaccessarchivo raíz del documento , simplemente colóquelo en la parte superior.

SetEnv MAGE_IS_DEVELOPER_MODE true

Para usuarios de Nginx / fastcgi

En su configuración de virtualhost de Nginx, en la location .php {directiva final o en el fastcgi_paramsarchivo (si tiene uno especificado)

fastcgi_param MAGE_IS_DEVELOPER_MODE true;

Solución temporal / universal

Edite la rutina de arranque de Magento index.phpen la raíz de su documento y haga que la ifdeclaración sea siempre verdadera o habilitada para su IP específica.

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);
}

Comprueba tus permisos

Los permisos incorrectos causarán una gran cantidad de problemas, muchos de los cuales no son tan fáciles de encontrar a primera vista.

Por ejemplo.
Si PHP no puede escribir en el ./mediadirectorio y tiene la combinación JS habilitada, Magento no puede generar el archivo combinado y el URI único asociado para los medios. En cambio, lo que encontrará en el código fuente de su navegador es una ruta completa del servidor al archivo multimedia /home/path/public_html/media/xxx

De lo contrario, puede parecer que el sitio funciona de manera normal, sin errores críticos realmente visibles.

Tenga en cuenta que esta práctica es segura para el alojamiento dedicado, pero puede presentar problemas de seguridad con el alojamiento compartido si el proceso de Apache no se cambia por usuario.

En nuestro ejemplo, el usuario SSH / FTP es sonassi, el usuario Apache es apachey el grupo esapache

Agregue el usuario FTP / SSH al grupo Apache

Lo que es más importante, debemos asegurarnos de que el usuario FTP / SSH sea parte del grupo Apache, en nuestro ejemplo, es apache(pero también es comúnmente www-data)

usermod -a -G apache sonassi

Siga agregando tantos usuarios al grupo como tenga para FTP / SSH.

Restablecer permisos originales

Entonces, antes de comenzar, asegurémonos de que todos los permisos sean correctos.

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

Hacer los cambios permanentes

ACL y bits adhesivos

Las ACL en Linux nos permiten definir reglas específicas, en nuestro caso, qué archivos de permisos deben heredar en la creación. Una parte adhesiva (mencionada más adelante) se encarga de la herencia grupal, pero no ayuda con los permisos, razón por la cual usamos ACL.

Comience por habilitar el soporte de ACL en la partición activa, asegúrese de que su núcleo se compiló con soporte de ACL .

La partición puede ser /, /home, /varo alguna otra cosa, reemplace según sea apropiado.

mount -o remount,acl /home

Ahora que las ACL están habilitadas, podemos establecer las reglas de ACL y agrupar bits fijos:

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

Pero no tengo soporte para ACL

Si su Kernel no admite ACL, también puede usar umask(que es una configuración de tiempo de ejecución para BASH, FTP y PHP) para establecer los permisos de archivo predeterminados. Magento por lo general establece umask(0)en index.php, sin embargo, sería en su interés de cambiar esta situación.

En tu index.phpcambio, la umasklínea será

umask(022);

Y en su entorno BASH para SSH, configúrelo en su .bashrco.bash_profile

umask 022

Para su servidor FTP, necesitará leer la documentación, pero el principio es el mismo.


Revertir tema a predeterminado

Es posible que su tema o paquete sea responsable de este problema. Volver a un tema Magento de vainilla es una forma rápida de averiguarlo.

** Esto viene con la advertencia de que algunos módulos pueden depender de ciertas características del tema *

En lugar de cambiar cualquier cosa a través del panel de administración, es mucho más simple cambiar el nombre de los directorios ofensivos.

Vía SSH

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

O a través de su cliente FTP, atraviese y cambie el nombre de su paquete a otra cosa. p.ej.myBrokenTheme.tmp

Si esto resuelve tu problema

Luego debe profundizar un poco más sobre qué parte de la plantilla es problemática. Así que restaure su paquete e intente lo siguiente, probando entre cada uno.

Esencialmente, el proceso consiste en habilitar gradualmente los directorios a medida que recorre el árbol de archivos, hasta que pueda encontrar el archivo ofensivo.

  1. Cambie el nombre del directorio de diseño a .tmp
  2. Cambie el nombre del directorio de plantilla a .tmp

Luego, si se soluciona, cambie el nombre de todos los archivos dentro del directorio de diseño a .tmp- (para los usuarios de SSH ls | xargs -I {} mv {} {}.tmpo rename 's/^/.tmp/' *)

Luego, habilite gradualmente cada archivo 1 por 1 hasta que se resuelva.

Si esto no resuelve tu problema

Existe el potencial de que sus base/defaulto enterprise/defaultdirectorios se han contaminado - y lo mejor es reemplazado por una versión limpia conocida.

Puede hacerlo descargando una compilación limpia de Magento y reemplazando sus directorios según sea necesario. A través de SSH puedes hacer esto:

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 .

También puede aprovechar la oportunidad para difflos dos directorios si desea verificar cualquier cambio.

diff -r base base.tmp

NÓTESE BIEN. Este método causará más errores durante el proceso, ya que la dependencia del módulo dicta la existencia de archivos específicos. Desafortunadamente, es normal para el curso.


Deshabilitar módulos locales

Por defecto, Magento define la ruta de inclusión de PHP para cargar clases en el siguiente orden

Local > Community > Core

Si un archivo está en Local, cárguelo y no haga más.
Si un archivo está en la comunidad, cárguelo y no haga más.
Si no se puede encontrar un archivo en otro lugar, cárguelo desde el núcleo.

Una vez más, en lugar de deshabilitar los módulos a través del panel de administración de Magento, es más práctico hacerlo a nivel de archivo.

Por lo general, para deshabilitar un módulo de la forma "adecuada", editaría el ./app/etc/modules/MyModule.xmlarchivo y el conjunto respectivos <active>false</active>; sin embargo, esto no impide que se cargue una clase.

Si otra clase extiende una clase dada en un módulo (ignorando cualquier declaración de dependencia de Magento), todavía se cargará, independientemente de si la extensión está deshabilitada o no.

De nuevo, el mejor medio para deshabilitar una extensión es cambiar el nombre del directorio.

Comience deshabilitando local

Simplemente cambie el nombre del directorio a través de FTP o use el siguiente comando SSH

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

Luego deshabilitar comunidad

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

Si el problema se resuelve desde cualquiera

Entonces es un caso de entender de qué módulo en particular se originó el error. Al igual que con el ejemplo dado anteriormente para el diagnóstico del paquete, se aplica el mismo proceso.

Así que restaure el directorio X e intente lo siguiente, probando entre cada uno.

Esencialmente, el proceso consiste en habilitar gradualmente directorios (módulos) uno por uno hasta que vuelva a ocurrir el error

  1. Cambie el nombre de todos los módulos en el directorio a .tmp(para los usuarios SSH ls | xargs -I {} mv {} {}.tmpo rename 's/^/.tmp/' *)
  2. Habilite gradualmente cada módulo uno por uno, eliminando .tmpdel nombre del archivo

Si el problema no se resuelve

Entonces es posible que el núcleo esté contaminado. El núcleo principal de Magento PHP consiste en

./app/code/core
./lib

De nuevo, cambie el nombre de estos directorios y copie en una variante limpia. Suponiendo que ya haya descargado una versión limpia de Magento como se indicó anteriormente, a través de SSH, puede hacer esto:

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

Luego, si el problema aún no se resuelve, reemplace el libdirectorio también

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

En este punto, su tienda Magento no será más que una instalación sencilla con una base de datos modificada.

En realidad, algunos modelos todavía se almacenan en la base de datos (por ejemplo, incremento de orden), por lo que en este punto, se convierte en un caso de hacer manualmente esas ediciones. Hasta ahora, todos los pasos anteriores han sido reversibles sin daños duraderos. Pero si también importáramos una base de datos limpia de Magento, podría resultar irreversible (salvo restaurar una copia de seguridad).


La guía anterior sirve para ayudarlo a identificar un error; no para arreglar el error resultante.

Contenido obtenido voluntariamente de www.sonassi.com/knowledge-base/magento-debug-process y www.sonassi.com/knowledge-base/stop-magento-permissions-errors-permanently

Ben Lessani - Sonassi
fuente
77
Creo que la respuesta puede ser útil para algunos usuarios de Magento, pero debe marcarse como una pregunta de preguntas y respuestas similar a un wiki comunitario, ya que el afiche respondió a la pregunta de inmediato.
Matthias Zeis
8
Las preguntas con respuesta propia no solo están permitidas, sino que SE las alienta. blog.stackoverflow.com/2012/05/encyclopedia-stack-exchange . ¿Más usuarios deberían hacerlo para ayudar a que esta versión beta evolucione, sin molestar a otros miembros por hacer un esfuerzo para ayudar a otros y progresar en el sitio?
Ben Lessani - Sonassi 01 de
¿No debería ser esto 755y 644permisos? ¿O tiene alguna razón especial para recomendar 775y 664?
Jürgen Thelen
@Jurgen: para todos nuestros servidores, Nginx / Apache / PHP siempre se ejecuta como el mismo usuario que SSH / FTP, ya sea en un alojamiento compartido / dedicado. Por lo tanto, los permisos pueden ser rwxsolo para el propietario, ya que el grupo y todos los demás no son relevantes. Pero como mencioné, no todos configuran su servidor correctamente (de hecho, muy pocos lo hacen), y existe la posibilidad de que el usuario Apache / Nginx / PHP difiera del usuario SSH / FTP, por lo que se agregan entre sí a entonces cada grupo respectivo permite que cada uno de ellos pueda rwxarchivar como deberían.
Ben Lessani - Sonassi 01 de
Si no desea diferenciar los dos directorios utilizando el terminal, puede instalar una de estas opciones de GUI: askubuntu.com/questions/12473/…
pablofiumara
18

Según lo solicitado en Twitter y discutido en Meta , comenzaré aquí un tutorial de depuración para no desarrolladores.

Primero, creo que (incluso cuando magento intenta involucrarlo) Magento es demasiado complejo para un comerciante sin equipo de desarrollo / desarrollo. Pero si eres valiente y quieres probarlo, estamos dando lo mejor de ti para ayudarte. Creo que para algunas preguntas es la frontera entre "¿cómo puedo hacer esto?" y "haz mi trabajo, soy demasiado estúpido para googlear esto" es una línea muy fina. Entiendo que a menudo es difícil, piensa Google porque no sabes para qué buscas en Google, porque todavía no conoces el nombre. Dicho esto, recopilemos cosas que todos los que tienen una tienda de magento pueden hacer, incluso si no es desarrollador.

Sonassi ya dio una muy buena respuesta sobre cómo depurar magento, cuando quieres ensuciarte , pero trato de agregar cosas y copiar lo que creo que es aplicable para los comerciantes.

Descargo de responsabilidad: todos los directorios y archivos mencionados en esta publicación son relativos a la carpeta raíz de magento, que puede estar en /var/wwwel proveedor de alojamiento, pero dependiendo de su proveedor de alojamiento puede estar en todas partes, pregúntele a su proveedor, si no encuentra su magento !

Modo de desarrollo

Desea tener errores reales, no esa página de "error" que Mgento entrega normalmente. http://www.fontis.com.au/blog/magento/custom-magento-error-page

Gracias a fontis.com por esta imagen.

Los informes mencionados en la página se pueden encontrar en var/reports/<the_number>

Cuando activa el modo de desarrollo, magento genera un error real, ¡estos errores pueden filtrar especialmente las credenciales, como las de la base de datos! ¡Entonces, piense antes de encenderlo en los servidores de producción!

Abra su index.phparchivo en la carpeta raíz de magento, dependiendo de la versión, encontrará estas líneas alrededor de la línea 73:

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

#ini_set('display_errors', 1);

Para activar ahora el modo, debe cambiar estas líneas.

Si conoce su dirección IP (la mayoría de las personas recibe una nueva cada 24 horas, al menos en Alemania), google lo ayuda aquí:

Su dirección IP pública es 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);
}

Si no conoce su ip por alguna razón, puede mostrar errores para todos.

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

Inicio sesión

Magento registra muchas cosas en dos archivos:

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

Las excepciones se registran siempre. El registro del sistema debe estar habilitado en el backend:

System > Configuration > Developer > Log

ingrese la descripción de la imagen aquí

Establezca Enableden Sí y verá más errores y mensajes de depuración en system.logy dentroexception.log

¿Es un problema temático?

Tienes tu propio tema, esto está configurado en el backend aquí:

Sistema> Configuración> Diseño

ingrese la descripción de la imagen aquí

Gracias a kb.magenting.com por la imagen.

Aquí puede configurar el paquete y el tema. Si desea intentar reproducir el error en el tema predeterminado, elimine todo de los campos de entrada. Luego haga clic en guardar y verá el tema estándar de magento como en la tienda de demostración , si tiene una tienda anterior a 1.8 puede encontrar una captura de pantalla en la Guía del usuario de Magento Community Edition

Si no puede reproducir el problema en el tema predeterminado, su tema está roto, comuníquese con el proveedor del tema. No damos soporte para temas de terceros, especialmente los comerciales.

¿Ahora que?

¿Encontró un error real, uno puede reproducirlo, es reproducible en el tema predeterminado? Genial, por favor abra una pregunta, y estamos dando nuestro mejor esfuerzo para ayudar.

En la pregunta:

  • describe lo que estás haciendo
  • qué error se plantea
  • hay algo en los archivos de registro?
  • tal vez una captura de pantalla del error
Fabian Blechschmidt
fuente
5
  1. En primer lugar, debe habilitar el modo de desarrollador
  2. También puede habilitar la visualización de errores en index.php: ini_set ('display_errors', 1);
  3. Compile la extensión xDebug con cualquier IDE inteligente (PhpStrom / eclipse)
  4. Deshabilitar el módulo personalizado y de terceros
  5. Revise su registro de excepciones y errores, resuelva los errores enumerados en el registro de excepciones
  6. Compruebe que la extensión curl y mcrypt debe estar cargada en su servidor
  7. Verifique la carpeta y los permisos de archivos -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. Actualice los medios y el permiso de directorio var 0777 si no está configurado
  9. Inicie IDE (phpstrom), luego configure los puntos de inicio del depurador en index.php 10. Presione F8 y continúe hasta que obtenga el error

Para usar los pasos anteriores, definitivamente debería obtener errores.

Abhishek Gupta
fuente
1
Agradezco sus respuestas, pero en lugar de responder la pregunta que ya ha aceptado respuestas, ¿por qué no puede responder a estas preguntas?
dh47
3
@ dh47 Para mí, lo que hizo Abhishek es lo correcto. Solo quiero mencionar que, responder preguntas ya aceptadas sigue siendo relevante e importante. En realidad, nuestro sitio (Magento SE) carece de este aspecto importante. Es importante tener una ración de respuesta 2.5 para salir de la versión beta. Actualmente solo tenemos un índice de respuesta de 1.6. Por lo tanto, se deben apreciar múltiples respuestas sobre la misma pregunta. No deje una pregunta sin responder debido a que esa pregunta tiene una respuesta aceptada. Si tiene un punto más para agregar adicionalmente, debe responder.
Rajeev K Tomy
-1

Traza de depuración

Esta es la buena función para depurar la llamada de función en magento.

Agregue esta función en include / config.php o cree un nuevo archivo y coloque todas sus funciones php usadas comúnmente.

función back_trace ($ salida = verdadero) {
  $ call_back_methods = '';
  $ call_back_methods. = '';
  $ call_back_methods. = 'SNFunction NameLine NumberFile Name';

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

    $ call_back_methods. = ''. $ counter ++. '';
    $ call_back_methods. = ''. $ datos ['función']. '';
    $ call_back_methods. = ''. $ datos ['línea']. '';
    $ call_back_methods. = ''. $ datos ['archivo']. '';
  }

  $ call_back_methods. = '';

  print $ call_back_methods;

  if (verdadero == $ salida) salir;
}

OutPut será

ingrese la descripción de la imagen aquí

Somnath
fuente