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


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

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

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

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

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

Author: kab8609, 2013-01-31

4 answers

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

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


Включить ошибки 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 combine, 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 {} \;

Внесение изменений на постоянной основе

Списки управления доступом и липкие биты

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

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

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

mount -o remount,acl /home

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

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

Но у меня нет Поддержка ACL

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

В вашем index.php измените строку umask на

umask(022);

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

umask 022

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


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

Возможно, что либо ваша тема, либо пакет ответственны за эту проблему. Возврат к теме vanilla 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

ПРИМЕЧАНИЕ. Этот метод вызовет больше ошибок во время процесса, так как зависимость модуля диктует наличие определенных файлов. К сожалению, его номинал для курс.


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

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

Local > Community > Core

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

Опять же, вместо того, чтобы отключать модули через панель администратора 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 из имени файла

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

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

./приложение/код/ядро
./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

 98
Author: Ben Lessani - Sonassi, 2015-06-30 20:27:48

Как запрошено в Twitter и обсуждено в Meta Я начну здесь учебник по отладке для не-разработчиков.

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

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

Отказ от ответственности: Все каталоги и файлы, упомянутые в этом посте , относятся к корневой папке magento, которая может находиться в /var/www, но в зависимости от хостинг-провайдера ваш так называемый корневой каталог документов может быть везде, спросите своего провайдера, если вы не найдете свой 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

enter image description here

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

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

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

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

enter image description here

Благодаря kb.magenting.com для изображения

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

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

Что теперь?

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

В вопросе:

  • опишите, что вы делаете
  • что такое ошибка поднятый
  • есть ли что-нибудь в файлах журнала?
  • возможно, снимок экрана с ошибкой
 18
Author: Fabian Blechschmidt, 2017-04-13 12:55:02
  1. Прежде всего, вы должны включить режим разработчика
  2. Вы также можете включить отображение ошибок в файле index.php:ini_set('отображать ошибки', 1);
  3. Скомпилируйте расширение xdebug с помощью любой интеллектуальной среды разработки (PhpStrom/eclipse)
  4. Отключить пользовательский и сторонний модуль
  5. Просмотрите журнал исключений и ошибок, устраните перечисленные ошибки в журнале исключений
  6. Проверьте, что расширение curl и mcrypt должно быть загружено на ваш сервер
  7. Проверьте права доступа к папкам и файлам chown-R sonassi: apache/главная страница/путь/public_html/ найти /главная/путь/public_html/ -тип d-exec chmod 775 {} \; найти /главная/путь/public_html/ -тип f-exec chmod 664 {} \;
  8. Обновите разрешение для носителя и каталога var 0777, если оно не установлено
  9. Запустите IDE(phpstrom), затем установите начальные точки отладчика на index.php 10. Нажмите F8 и идите дальше, пока не получите сообщение об ошибке

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

 5
Author: Abhishek Gupta, 2014-12-20 10:20:20

Отладка обратного пути

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

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

function back_trace($exit = true) {
  $call_back_methods = '';
  $call_back_methods .= '';
  $call_back_methods .= 'S.N.Function NameLine NumberFile Name';
  
  $counter = 1;
  foreach (debug_backtrace() as $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 .= '';
  
  print $call_back_methods;
  
  if (true == $exit) exit;
}

Вывод будет

enter image description here

 -1
Author: Somnath, 2020-06-15 08:30:17