Основы отладки магазина Magento


81

Как я могу отладить мой магазин Magento

Это вопрос, который не слишком важен для нас сейчас, но если бы сайт Magento SE существовал 5 лет назад, это, вероятно, был бы наш первый вопрос. Для тех, кто только попадает в Magento или не знаком с ним - знание основ отладки может быть ключом к исключению причины проблем. И, несмотря на то, что сейчас он не имеет никакого отношения к нам, мы опережаем этот вопрос с помощью подхода с самоотвечением.

Помогите, мой сайт не работает!

  1. Мой дизайн виноват?
  2. Неисправен ли сторонний модуль?
  3. Почему я не вижу ошибку?

На каждый из этих вопросов можно легко ответить, следуя стандартизированному подходу к отладке, который могут выполнить даже самые простые пользователи. Посредством процесса устранения основ отладки магазина Magento.


5
Используйте хороший отладчик и свой интеллект ...
Сильвен Райе

4
Это серьезный вопрос?
Давидгер

5
Нет, это преднамеренный вопрос, на который я могу ответить самостоятельно, чтобы помочь начать игру на этой бета-версии. Обмен стеками позволяет не только самостоятельно отвечать на вопросы, но и активно поощряет их. Blog.stackoverflow.com/2012/05/encyclopedia-stack-exchange . @sylvain Этот вопрос предназначен для новых / неопытных пользователей, чтобы помочь начать процесс отладки
Бен Лессани - Sonassi

@sonassi Я не понизил голосование, а ты реструктурировал свой вопрос более четко. Наверное, я мог бы помочь в этом :) Я не знал, что SE это не только вопросы и ответы, это хорошо знать. Что касается основной темы, ответ здесь - только поверхность большинства возможных более глубоких проблем, поэтому я говорю, что используйте отладчик и сначала поймите, как работает процесс внутренней отправки Magento, вы можете решить множество проблем, после того, как вы его поняли. Это мои 5 центов. Как решить проблему с расчетом налога, способами доставки, генерацией блока или другим способом: отладка! Это также помогает изучать процесс стажировки.
Сильвен Райе

2
Понял. В чем я пытался помочь, так это в более фундаментальных фатальных ошибках. Очевидно, что масштабы проблем слишком широки, чтобы можно было найти единственное решение. Причуды / небольшие ошибки диагностируются путем отладки - но для фатальных ошибок - требуется менее деликатный подход, как показано ниже. И да, я подправил вопрос :)
Бен Лессани - Sonassi

Ответы:


98

Отладка - это что-то вроде искусства, но с этим можно легко справиться, следуя простому режиму.

Следуйте каждому пункту, пока, наконец, не найдете решение.


Включить ошибки PHP

Это ключ к большинству вопросов. В целях безопасности или по другим причинам отображение ошибок PHP может быть отключено по умолчанию в вашей конфигурации PHP.

Вы можете включить ошибки с более постоянным решением или просто что-то более временное.

Постоянное решение

Для пользователей Apache / mod_php

В .htaccessфайле корня вашего документа - просто поместите это вверху.

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

Для пользователей Nginx / FastCGI

В вашей конфигурации виртуального хоста Nginx, либо в конечной location .php {директиве, либо в fastcgi_paramsфайле (если он указан)

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;

Временное / Универсальное решение

Для любой платформы

Отредактируйте загрузчик Magento index.phpв корневом каталоге вашего документа и раскомментируйте следующую строку:

#ini_set('display_errors', 1);

Включить режим разработчика

Когда у вас возникла ошибка, и вы внезапно нажали на страницу «Отчет об ошибке», и вам была дана, казалось бы, бесполезная строка с ошибкой вроде 1184257287824- у вас есть несколько вариантов.

Постоянное решение

Для пользователей Apache / mod_php

В корневой .htaccessфайл вашего документа - просто поместите это вверху.

SetEnv MAGE_IS_DEVELOPER_MODE true

Для пользователей Nginx / fastcgi

В вашей конфигурации виртуального хоста Nginx, либо в конечной location .php {директиве, либо в fastcgi_paramsфайле (если он указан)

fastcgi_param MAGE_IS_DEVELOPER_MODE true;

Временное / Универсальное решение

Отредактируйте загрузочную версию Magento index.phpв корневом каталоге вашего документа и либо сделайте ifутверждение всегда верным, либо включите его для вашего конкретного IP-адреса.

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

или же

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

Проверьте ваши разрешения

Неправильные разрешения вызовут массу проблем, многие из которых не так легко найти на первый взгляд.

Например.
Если PHP не может записать в ./mediaкаталог, и у вас включено объединение JS - Magento не может сгенерировать объединенный файл и связанный уникальный URI для носителя. Таким образом, вместо того, что вы найдете в исходном коде вашего браузера, это полный путь сервера к медиа-файлу /home/path/public_html/media/xxx

В противном случае сайт может функционировать как обычно - без видимых критических ошибок.

Пожалуйста, имейте в виду, что эта практика безопасна для выделенного хостинга, но может представлять проблемы безопасности с общим хостингом, если процесс Apache не привязан к каждому пользователю.

В нашем примере пользователь SSH / FTP - sonassiэто пользователь Apache, apacheа группа -apache

Добавьте пользователя FTP / SSH в группу Apache

Самое главное, мы должны убедиться, что пользователь FTP / SSH входит в группу Apache, в нашем примере это ее apache(но также обычно www-data)

usermod -a -G apache sonassi

Добавляйте в группу столько пользователей, сколько у вас есть для FTP / SSH.

Сбросить исходные разрешения

Итак, прежде чем мы начнем, давайте удостоверимся, что все разрешения правильны.

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

Делать изменения постоянными

ACL и Sticky Bits

ACL в Linux позволяют нам определять конкретные правила, в нашем случае, какие файлы разрешений должны наследоваться при создании. Липкий бит (упомянутый выше) заботится о группе наследования, но не помогает с правами, и именно поэтому мы используем ACL.

Начните с включения поддержки ACL на активном разделе, убедитесь, что ваше ядро ​​скомпилировано с поддержкой ACL .

Ваш раздел может быть /, /home, /varили что - то другое, заменить в случае необходимости.

mount -o remount,acl /home

Теперь ACL включены, мы можем установить правила ACL и группировать липкие биты:

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

Но у меня нет поддержки ACL

Если ваше Ядро не поддерживает ACL, вы также можете использовать umask(это настройка времени выполнения для BASH, FTP и PHP), чтобы установить разрешения для файлов по умолчанию. Magento обычно устанавливает umask(0)в index.php, однако, это было бы в ваших интересах , чтобы изменить это.

В вашем index.phpизменении umaskстрока должна быть

umask(022);

И в вашей среде BASH для SSH, установите это либо в вашем .bashrcили.bash_profile

umask 022

Для вашего FTP-сервера вам необходимо прочитать документацию к нему, но принцип тот же.


Восстановить тему по умолчанию

Вполне возможно, что ваша тема или пакет отвечает за эту проблему. Возвращаясь к ванильной теме Magento - это быстрый способ выяснить это.

** Это связано с оговоркой, что некоторые модули могут зависеть от определенных функций темы *

Вместо того, чтобы что-либо менять через панель администратора, гораздо проще просто переименовать нарушающие каталоги.

Через SSH

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

Или через ваш FTP-клиент, пройдите и переименуйте ваш пакет во что-то другое. например.myBrokenTheme.tmp

Если это решит вашу проблему

Затем вам нужно немного покопаться в том, какая часть шаблона проблематична. Так что восстановите ваш пакет и попробуйте следующее, тестируя между ними.

По сути, процесс состоит в том, чтобы постепенно включать каталоги при прохождении по дереву файлов - пока вы не найдете файл, нарушающий работу.

  1. Переименуйте каталог макета в .tmp
  2. Переименуйте каталог шаблона в .tmp

Затем, если любой из них приведет к исправлению, переименуйте все файлы в каталоге макета в .tmp- (для пользователей SSH ls | xargs -I {} mv {} {}.tmpили rename 's/^/.tmp/' *)

Затем постепенно включите каждый файл 1 на 1 до разрешения.

Если это не решит вашу проблему

Существует вероятность того, что ваши каталоги base/defaultили enterprise/defaultкаталоги были заражены - и их лучше заменить известной чистой версией.

Вы можете сделать это, загрузив чистую сборку Magento и при необходимости заменив каталоги. Через SSH вы можете сделать это:

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 .

Вы также можете воспользоваться возможностью для diffдвух каталогов, если вы хотите проверить какие-либо изменения.

diff -r base base.tmp

NB. Этот метод вызовет больше ошибок во время процесса, так как зависимость от модуля диктует существование определенных файлов. К сожалению, его номинал для курса.


Отключить локальные модули

По умолчанию Magento определяет путь включения PHP для загрузки классов в следующем порядке

Local > Community > Core

Если файл находится в Local - загрузите его и больше не делайте.
Если файл находится в сообществе - загрузите его и не делайте больше.
Если файл не может быть найден где-либо еще - загрузите его из ядра.

Опять же, вместо того, чтобы отключать модули через админ-панель Magento, это более практично делать на уровне файлов.

Как правило, чтобы отключить модуль «правильным» способом, вы должны отредактировать соответствующий ./app/etc/modules/MyModule.xmlфайл и установить его <active>false</active>- однако это не мешает загрузке класса.

Если другой класс расширяет данный класс в модуле (игнорируя любые объявления зависимостей Magento), он все равно будет загружен - независимо от того, отключено ли расширение или нет.

Итак, еще раз, лучший способ отключить расширение - переименовать каталог.

Начните с отключения локальной

Просто переименуйте каталог через FTP или используйте следующую команду SSH

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

Затем отключите сообщество

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

Если проблема решена из

Тогда это пример понимания того, из какого модуля произошла ошибка. Как и в примере, приведенном выше для диагностики упаковки, применяется тот же процесс.

Поэтому восстановите каталог X и попробуйте выполнить следующее, тестируя между ними.

По сути, процесс состоит в том, чтобы постепенно включать каталоги (модули) по одному, пока ошибка не возникнет снова.

  1. Переименуйте все модули в каталоге в .tmp(для пользователей SSH ls | xargs -I {} mv {} {}.tmpили rename 's/^/.tmp/' *)
  2. Постепенно включите каждый модуль по отдельности, удалив .tmpиз имени файла

Если проблема не решена

Тогда возможно, что само ядро ​​загрязнено. Основное ядро ​​Magento PHP состоит из

./app/code/core
./lib

Итак, еще раз, переименуйте эти каталоги и скопируйте в чистом варианте. Предполагая, что вы уже загрузили чистую версию Magento, как указано выше, через SSH, вы можете сделать это:

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

Тогда, если проблема все еще не решена, замените libкаталог тоже

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

На этом этапе ваш магазин Magento будет не более чем простой установкой с измененной базой данных.

Некоторые модели на самом деле все еще хранятся в базе данных (например, приращение порядка) - поэтому на данном этапе это становится случаем ручного внесения этих изменений. До сих пор все вышеперечисленные шаги были обратимыми без какого-либо длительного ущерба. Но если бы мы импортировали чистую базу данных Magento - это могло бы стать необратимым (если не считать восстановления резервной копии).


Приведенное выше руководство поможет вам обнаружить ошибку; не исправить полученную ошибку.

Контент охотно получен от www.sonassi.com/knowledge-base/magento-debug-process и www.sonassi.com/knowledge-base/stop-magento-permissions-errors-permanently


7
Я думаю, что ответ может быть полезен для некоторых пользователей Magento, но его следует пометить как вопросы и ответы, подобные вики-сообщества, поскольку автор сразу же ответил на него.
Матиас Цейс

8
Вопросы с самостоятельным ответом не только разрешены, но и поощрены SE. blog.stackoverflow.com/2012/05/encyclopedia-stack-exchange . Больше пользователей должны делать это, чтобы помочь этой бета-версии развиваться, не отдавая предпочтение другим участникам за то, что они пытаются помочь другим и продвинуть сайт?
Бен Лессани - Сонасси

Разве это не должно быть 755и 644разрешения? Или у вас есть особые причины, чтобы рекомендовать 775и 664?
Юрген Телен

@Jurgen - Для всех наших серверов - Nginx / Apache / PHP всегда работает от имени того же пользователя, что и SSH / FTP - будь то на общем / выделенном хостинге. Таким образом, разрешения могут быть rwxтолько для владельца - как группа, так и все остальные не имеют отношения. Но, как я уже говорил, не все настраивают свой сервер должным образом (на самом деле, очень, очень немногие это делают), и у пользователя Apache / Nginx / PHP есть вероятность отличаться от такового у пользователя SSH / FTP - поэтому добавляем друг друга в каждая соответствующая группа затем разрешает для каждого rwxфайла, как они должны быть в состоянии.
Бен Лессани - Сонасси

Если вы не хотите различать две директории с помощью терминала, вы можете установить один из следующих вариантов графического интерфейса: askubuntu.com/questions/12473/…
pablofiumara

18

В соответствии с просьбой в Twitter и обсуждением в Meta, я начну здесь учебник по отладке для не-разработчиков.

Во-первых, я думаю (даже если вы magento пытаетесь этим заниматься), Magento слишком сложен для продавца без команды разработчиков / разработчиков. Но если вы смелы и хотите попробовать, мы сделаем все возможное, чтобы помочь вам. Я думаю, что для некоторых вопросов есть граница между "как я могу это сделать?" и "пожалуйста, сделайте мою работу, я слишком глуп, чтобы гуглить это" - довольно тонкая грань. Я понимаю, что Google часто думает, что это трудно, потому что вы не знаете, для чего вы ищете, потому что вы еще не знаете названия. При этом давайте собирать то, что может сделать каждый, кто работает в магазине magento, даже если вы не являетесь разработчиками.

Очень хороший ответ о том, как отлаживать magento, когда вы хотите испачкаться, уже дал Sonassi , но я стараюсь добавлять вещи и копировать то, что, по моему мнению, применимо для торговцев.

Отказ от ответственности: все каталоги и файлы, упомянутые в этом посте, относятся к корневой папке magento, которая может быть в, /var/wwwно в зависимости от хостинг-провайдера, ваш так называемый Document Root может быть везде, спросите вашего провайдера, если вы не нашли свой magento !

Режим разработки

Вы хотите иметь настоящие ошибки, а не ту дрянную страницу "произошла ошибка", которую magento выдает нормально. http://www.fontis.com.au/blog/magento/custom-magento-error-page

Спасибо fontis.com за это изображение.

Отчеты, упомянутые на странице, можно найти в var/reports/<the_number>

Когда вы активируете режим разработки, magento вызывает реальную ошибку, эти ошибки могут особенно утекать учетные данные, например, для базы данных! Итак, подумайте, прежде чем включать его на производственных серверах!

Откройте ваш index.phpфайл в корневой папке magento, в зависимости от версии вы найдете следующие строки в строке 73:

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

#ini_set('display_errors', 1);

Чтобы активировать сейчас режим, нужно поменять эти строки.

Если вы знаете свой IP-адрес (большинство людей получают новый каждые 24 часа, по крайней мере, в Германии), Google поможет вам здесь:

Ваш публичный IP-адрес 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);
}

Если по каким-либо причинам вы не знаете свой ip, вы можете показать ошибки для всех.

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

логирование

Magento записывает много вещей в два файла:

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

Исключения регистрируются всегда. Системный журнал должен быть включен в бэкэнде:

System > Configuration > Developer > Log

введите описание изображения здесь

Установите EnabledДа, и вы увидите больше ошибок и сообщений отладки в system.logи вexception.log

Это проблема темы?

У вас есть собственная тема, это настраивается в бэкэнде здесь:

Система> Конфигурация> Дизайн

введите описание изображения здесь

Спасибо kb.magenting.com за изображение

Здесь вы можете настроить пакет и тему. Если вы хотите попытаться воспроизвести ошибку в теме по умолчанию, удалите все из полей ввода. Затем нажмите «Сохранить», и вы увидите стандартную тему magento, как в демонстрационном магазине. Если у вас есть магазин до 1.8, вы можете найти снимок экрана в Руководстве пользователя Magento Community Edition.

Если вы не можете воспроизвести проблему в теме по умолчанию, ваша тема повреждена, обратитесь к поставщику темы. Мы не поддерживаем сторонние темы, особенно коммерческие.

Что теперь?

Вы нашли реальную ошибку, которую можно воспроизвести, она воспроизводима в теме по умолчанию? Отлично, пожалуйста, откройте вопрос, и мы делаем все возможное, чтобы помочь.

В вопросе:

  • опиши что ты делаешь
  • какая ошибка возникает
  • что-нибудь в лог-файлах?
  • возможно скриншот ошибки

5
  1. Прежде всего вы должны включить режим разработчика
  2. Вы также можете включить отображение ошибок в index.php: ini_set ('display_errors', 1);
  3. Скомпилируйте расширение xDebug с помощью любой интеллектуальной IDE (PhpStrom / eclipse)
  4. Отключить пользовательский и сторонний модуль
  5. Просмотрите журнал исключений и ошибок, устраните перечисленные ошибки в журнале исключений.
  6. Проверьте, что на вашем сервере должно быть загружено расширение curl и mcrypt
  7. Проверьте права доступа к папкам и файлам. 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. Обновите разрешение media и var directory 0777, если не установлено
  9. Запустите IDE (phpstrom), затем установите начальные точки отладчика на index.php 10. Нажмите F8 и переходите дальше, пока не получите ошибку

Для использования вышеуказанных шагов вы должны получить ошибки определенно.


1
Я ценю ваши ответы, но вместо того, чтобы отвечать на вопрос, который уже принял ответы, почему вы не можете ответить на эти вопросы.
dh47

3
@ dh47 Для меня то, что сделал Абхишек, правильно. Я просто хочу отметить, что ответы на уже принятые вопросы по-прежнему актуальны и важны. На самом деле нашему сайту (Magento SE) не хватает этого важного аспекта. Очень важно иметь 2,5 ответа, чтобы выйти из бета-версии. В настоящее время у нас только 1,6 соотношение ответов. Таким образом, множественные ответы на один и тот же вопрос должны быть оценены. Не оставляйте вопрос без ответа, потому что на этот вопрос есть принятый ответ. Если у вас есть еще один пункт, чтобы добавить дополнительно, вы должны ответить.
Раджив К Томи

-1

Отладка Backtrace

Это хорошая функция для отладки вызова функции в magento.

Добавьте эту функцию в include / config.php или создайте новый файл и поместите все свои распространенные функции php.

функция back_trace ($ exit = true) {
  $ call_back_methods = '';
  $ call_back_methods. = '';
  $ call_back_methods. = 'SNFunction NameLine NumberFile Name';

  $ counter = 1;
  foreach (debug_backtrace () как $ index => $ data) {
    // if (0 == $ index) continue;

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

  $ call_back_methods. = '';

  печатать $ call_back_methods;

  if (true == $ exit) выход;
}

OutPut будет

введите описание изображения здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.