Основи налагодження магазину Magento


81

Як я можу налагодити свій магазин Magento

Це питання, яке зараз для нас не надто актуальне, але якщо сайт Magento SE існував 5 років тому, це, мабуть, було б нашим першим питанням. Для тих, хто просто потрапляє в Magento або незнайомий з ним - знання основ налагодження може бути ключовим, щоб виключити причину проблем. І незважаючи на його важливість для нас зараз, ми переважаємо, що це питання виникає з підходом із самовідповіддю.

Допоможіть, що мій сайт не працює!

  1. Чи винен мій дизайн?
  2. Чи винен сторонній модуль?
  3. Чому я не бачу помилки?

На кожне з цих питань можна легко відповісти, дотримуючись стандартизованого підходу до налагодження, який можуть виконати навіть найпростіші користувачі. За допомогою процесу усунення основ налагодження магазину Magento.


5
Використовуйте хороший налагоджувач і свій інтелект ...
Sylvain Rayé

4
Це серйозне питання?
davidalger

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

@sonassi Я не звернувся до уваги, і ви переробили своє питання чіткіше. Можливо, я міг би допомогти в цьому :) Я не знав, що SE - це не лише питання Q&A, добре знати. Щодо головної теми, то тут відповідь - це лише поверхня більшості можливих глибших проблем, тому я кажу, що використовую налагоджувач і спочатку розумію, як працює процес диспетчеризації стажистів у Magento, ви можете вирішити багато проблем після того, як ви зрозуміли це. Це мої 5 копійок. Як вирішити проблему з обчисленням податку, методами доставки, генеруванням блоків чи іншим: налагодження! Це також допомагає вивчити процес стажування.
Sylvain Rayé

2
Зрозумів. Що я намагався допомогти, це більш фундаментальні фатальні помилки. Очевидно, що сфера проблем є занадто широкою, щоб відповісти на одне рішення. Вигадки / маленькі помилки діагностуються за допомогою налагодження - але для фатальних помилок потрібен менш делікатний підхід, як зазначено нижче. І так, я поставив питання :)
Бен Лессані - Сонассі

Відповіді:


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 virtualhost, або в кінцевій 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 virtualhost, або в кінцевій 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 та липкі шматочки

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

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

Знову, замість того, щоб відключити модулі через адміністративну панель 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 складається з

./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
Самовідповіді на запитання не тільки дозволені, але і заохочуються ДП. 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файлів, як вони повинні.
Бен Лессані - Сонассі

Якщо ви не хочете відрізняти два каталоги за допомогою терміналу, ви можете встановити один із цих параметрів GUI: askubuntu.com/questions/12473/…
pablofiumara

18

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

По-перше, я думаю (навіть ти, магенто, намагається цим займатися) Magento занадто складний для продавця без розробника / команди розробників. Але якщо ви сміливі і хочете спробувати це, ми надаємо все можливе, щоб допомогти вам. Я думаю, що для деяких питань є межа між "як я можу це зробити?" і "будь ласка, зробіть мою роботу, я занадто дурний, щоб це гугл" - це досить тонка лінія. Я розумію, що думати Google часто важко, тому що ви не знаєте, для чого ви гуглі, тому що ви ще не знаєте іменування. Це сказало: давайте збираємо речі, які можуть зробити кожен, хто має магазин в Магенто, навіть якщо ви не розробники.

Дуже гарну відповідь про те, як налагодити магенто, коли ви хочете забруднитись, вже дав Сонассі , але я намагаюся додати речі та скопіювати те, що, на мою думку, є застосовним для продавців.

Відмова: Усі каталоги та файли, згадані в цій публікації, відносяться до кореневої папки magento, яка може бути, /var/wwwале залежно від постачальника послуг хостингу, ваш так званий корінь документа може бути скрізь, запитайте свого постачальника, якщо ви не знайдете свого магенто !

Режим розвитку

Ви хочете мати справжні помилки, а не ту шалену сторінку "сталася помилка", яку magento доставляє нормально. http://www.fontis.com.au/blog/magento/custom-magento-error-page

Завдяки fontis.com за це зображення.

Звіти, згадані на сторінці, можна знайти в var/reports/<the_number>

Коли ви активуєте режим розробки, magento викликає реальну помилку, ці помилки можуть особливо витікати облікові дані, як ті, що стосуються бази даних! Отже, подумайте, перш ніж увімкнути це на виробничих серверах!

Відкрийте свій index.phpфайл у кореневій папці Магенто, залежно від версії, ви знайдете ці рядки навколо рядка 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. Перевірте права доступу до папок та файлів -wn 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. Оновіть дозвіл 0777 на медіа та var, якщо не встановлено
  9. Запустіть IDE (phpstrom), потім встановіть початкові точки налагоджувача на index.php 10. Натисніть F8 і перейдіть далі, поки не з’явиться помилка

Для використання вищезазначених кроків ви обов'язково повинні помилитися.


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

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

-1

Налагодження Backtrace

Це хороша функція для налагодження виклику функції в магенто.

Додайте цю функцію в 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) {
    // якщо (0 == $ індекс) продовжувати;

    $ call_back_methods. = ''. $ counter ++. '';
    $ call_back_methods. = ''. $ data ['функція']. '';
    $ call_back_methods. = ''. $ data ['рядок']. '';
    $ call_back_methods. = ''. $ data ['файл']. '';
  }

  $ call_back_methods. = '';

  друкувати $ call_back_methods;

  if (true == $ exit) вихід;
}

OutPut буде

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.