Основы отладки магазина Magento
Как я могу отладить свой магазин Magento
Это вопрос, который сейчас не слишком актуален для нас, но если бы сайт Magento SE существовал 5 лет назад, это, вероятно, был бы наш первый вопрос. Для тех, кто только знакомится с Magento или не знаком с ним, знание основ отладки может быть ключом к устранению причины проблем. И, несмотря на его неуместность для нас сейчас, мы предвосхищаем появление этого вопроса с подход с самостоятельным ответом.
Помогите мой сайт не работает!
- Виноват ли мой дизайн?
- Неисправен ли сторонний модуль?
- Почему я не вижу ошибки?
На каждый из этих вопросов можно легко ответить, следуя стандартизированному подходу к отладке, который могут выполнить даже самые простые пользователи. Посредством процесса устранения основ отладки магазина Magento.
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
Если это решит вашу проблему
Затем вам нужно копнуть немного глубже, чтобы понять, какая часть шаблона является проблемной. Поэтому восстановите свой пакет и попробуйте выполнить следующее, проверяя каждый из них.
По сути, процесс заключается в постепенном включении каталогов по мере продвижения вниз по дереву файлов - до тех пор, пока вы не сможете найти оскорбительный файл.
- Переименуйте каталог компоновки в
.tmp
- Переименуйте каталог шаблонов в
.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 и выполните следующие действия, протестировав между каждым из них.
По сути, процесс заключается в постепенном включении каталогов (модулей) один за другим, пока ошибка не повторится
- Переименуйте все модули в каталоге в
.tmp
(для пользователей SSHls | xargs -I {} mv {} {}.tmp
илиrename 's/^/.tmp/' *
) - Постепенно включайте каждый модуль по одному, удаляя
.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
Как запрошено в Twitter и обсуждено в Meta Я начну здесь учебник по отладке для не-разработчиков.
Во-первых, я думаю (даже ты, magento, пытаешься этим заниматься), что Magento слишком сложен для продавца без команды разработчиков/разработчиков. Но если вы смелы и хотите попробовать, мы делаем все возможное, чтобы помочь вам. Я думаю, что для некоторых вопросов граница между "как я могу это сделать?" и "пожалуйста, сделайте мою работу, я слишком глуп, чтобы гуглить это" - это довольно тонкая грань. Я понимаю, что часто бывает трудно, думает Google, потому что вы не знаете, для чего вы гуглите, потому что вы еще не знаете названия. Это говорит о том, что давайте собирать вещи, которые могут делать все, у кого есть магазин magento, даже если вы (ы) не являетесь разработчиками.
Очень хороший ответ о том, как отлаживать magento, когда вы хотите испачкаться, уже был дан Sonassi, но я стараюсь добавлять и копировать то, что, по моему мнению, применимо для продавцов.
Отказ от ответственности: Все каталоги и файлы, упомянутые в этом посте , относятся к корневой папке magento, которая может находиться в
/var/www
, но в зависимости от хостинг-провайдера ваш так называемый корневой каталог документов может быть везде, спросите своего провайдера, если вы не найдете свой magento!
Режим разработки
Вы хотите, чтобы у вас были реальные ошибки, а не эта дерьмовая страница "произошла ошибка", которую обычно предоставляет magento.
Благодаря 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
Если вы можете не воспроизводите проблему в теме по умолчанию, ваша тема сломана, пожалуйста, свяжитесь с поставщиком темы. Мы не поддерживаем сторонние темы, особенно коммерческие.
Что теперь?
В вопросе:
- опишите, что вы делаете
- что такое ошибка поднятый
- есть ли что-нибудь в файлах журнала?
- возможно, снимок экрана с ошибкой
- Прежде всего, вы должны включить режим разработчика
- Вы также можете включить отображение ошибок в файле index.php:ini_set('отображать ошибки', 1);
- Скомпилируйте расширение xdebug с помощью любой интеллектуальной среды разработки (PhpStrom/eclipse)
- Отключить пользовательский и сторонний модуль
- Просмотрите журнал исключений и ошибок, устраните перечисленные ошибки в журнале исключений
- Проверьте, что расширение curl и mcrypt должно быть загружено на ваш сервер
- Проверьте права доступа к папкам и файлам chown-R sonassi: apache/главная страница/путь/public_html/ найти /главная/путь/public_html/ -тип d-exec chmod 775 {} \; найти /главная/путь/public_html/ -тип f-exec chmod 664 {} \;
- Обновите разрешение для носителя и каталога var 0777, если оно не установлено
- Запустите IDE(phpstrom), затем установите начальные точки отладчика на index.php 10. Нажмите F8 и идите дальше, пока не получите сообщение об ошибке
Для использования описанных выше шагов вы определенно должны получить ошибки.
Отладка обратного пути
Это хорошая функция для отладки вызова функции в 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; }