Проблема блокування є однією з найбільших і найскладніших проблеми, які потрібно виправити в Magento 2 , з якою рано чи пізно стикається кожен розробник Magento. Як тільки ви почнете шукати, як виправити проблеми блокування в Magento, вам буде важко знайти повний посібник.
Отже, я думаю, що це, мабуть, не перша стаття, на яку ви натрапляєте. Але, сподіваюся, ви знайдете тут відповідь.
У цій статті ви дізнаєтеся все, що потрібно знати, щоб зрозуміти та виправити проблеми з блокуванням. Або принаймні значно зменшити їхню кількість.
Чому індекси Magento стають недійсними?
Коли ви зіткнулися з проблемою блокування Magento, перше, що потрібно зробити, це перевірити Індекси Magento і дізнайтеся, чому вони стають недійсними. Для цього перейдіть за посиланням Система > Інструменти > Керування індексами, переконайтеся, що у вас є налаштувати режим індексування правильно, і що ваш crons працюють .
Режими індексації Magento
Magento має два режими індексації:
- Оновлення щодо збереження — переіндексація виконується під час збереження продукту (не рекомендується вмикати цей режим у продакшені, оскільки це може значно збільшити час збереження продукту).
- Оновлення за розкладом — переіндексація виконується за допомогою завдань cron indexer_reindex_all_invalid і indexer_update_all_views.
Сторінка керування індексами Magento з недійсними індексами
Ви також можете побачити ПРОСТІЙНИЙ(n) У ВІДСТАННІ у розділі керування індексатором, що означає, що індекси для (n) продуктів є недійсними, і потрібна переіндексація. Однак після запуску переіндексації всі індекси мають бути дійсними.
Сторінка керування індексами Magento з дійсними індексами
Тестування індексаторів Magento
Давайте проведемо невелике тестування:
Змінити режими індексування на Оновлення за розкладом та запустіть переіндексацію за допомогою такої команди:
bin/magento indexer:reindex
Потім відкрийте Управління індексамиУсі індекси повинні мати Оновлення за розкладом режим та IDLE - 0, як на малюнку вище.
Після цього перейдіть до будь-якого товару та збережіть його. Немає потреби змінювати значення атрибутів. Відкрити Управління індексами у новій вкладці та порівняйте її з попередньою. Ви можете помітити, що деякі індекси змінилися з ХОЛОСТИЙ РЕЖИМ - 0 до ХОЛОСТИЙ РЕЖИМ - 1 (якщо ви відредагували 5 товарів, ви побачите IDLE - 5 і так далі).
Моніторинг індексаторів Magento
Тепер, коли ви знаєте, як зробити індекс недійсним, нам слід перейти до реального прикладу.
Вам потрібно стежити за Управління індексами сторінка, щоб переконатися, що всі індекси дійсні (зелений). Magento виконує завдання переіндексації щохвилини, і якщо всі індекси дійсні це займе не більше кількох секунд.
Як ви, можливо, знаєте, Magento зберігає дані про атрибути товарів у елемент_каталогу_продукту* таблиці. Ці таблиці мають тригери MySQL, які спрацьовують індекси недійсні при зміні даних. Тож, якщо ваші індекси недійсні (червоні) щоразу, коли ви їх перевіряєте (наприклад, кожні 2 години), це тому, що процес переіндексації використовує багато ресурсів, і таблиці БЛОКУЮТЬСЯ під час цього процесу.
Як ви могли здогадатися, переіндексація в цьому випадку буде не такою швидкою. І саме тоді починають проявлятися проблеми з блокуваннями Magento, проблеми зі збереженням продукту.
Таким чином,Причина, чому ваші індекси стають недійсними, полягає в зміні значень атрибутів.
Коли виникає проблема блокування Magento?
Припустимо, у вас є сайт із 3 переглядами магазинів та приблизно 20 тисячами товарів, 200 категорій. Повна переіндексація займе близько 40 хвилин.
У вас є розширення, яке динамічно оновлюється є_новим атрибут продукту за умовою — якщо продукт створено_за_адресою менше ніж 30 днів тому, позначте товар як новий.
Розширення має завдання cron, яке оновлює атрибут щогодини. Дані оновлюються таким чином:
- Зміна є_новим значення атрибута 0 для всіх продуктів
- Знайдіть товари, створені менше 30 днів тому, та встановіть значення атрибута на 1
Якщо скрипт виконується щогодини, то потрібно змінювати дуже мало значень атрибутів. Отже, кількість нових продуктів, найімовірніше, залишатиметься незмінною протягом кількох годин або навіть днів.
Скрипт маніпулюватиме даними (змінить усі значення атрибутів на 0, потім деякі на 1), і кінцевий результат залишиться незмінним. Але дані були оброблені, а індекси визнані недійсними — потрібно уникати такої ситуації.
Отже, після виконання скрипта ми отримали 20 тисяч недійсних індексів.
Як ми вже згадували вище, повне переіндексування займає 40 хвилин. Якщо ваш режим індексування Оновлення за розкладомMagento виконує певну переіндексацію (лише для індексів, які були визнані недійсними) під час виконання завдань cron. indexer_reindex_all_invalid і indexer_update_all_views виконуються. Конкретне переіндексування швидше за повне, але також займає певний час і створює непотрібне перевантаження бази даних.
Саме під час такого процесу переіндексації виникає проблема блокування Magento.
Як знайти причини недійсності індексу?
Оскільки ви вже знаєте, що ваші індекси стають недійсними через зміну значень атрибутів, вам також потрібно знати, які саме значення. Щоб з'ясувати це, спробуйте один із наведених нижче методів.
1. Встановіть , який допоможе вам контролювати ваші cron-завдання.
Приклад розширення для керування cron
2. Виконайте повне переіндексування bin/magento ind:reind щоб зробити всі індекси дійсними (зелений).
3. Збільшення Історія життя в Магазини > Конфігурація > Додатково > Система > Cron (Заплановані завдання) до 14:40 хв = 24 години. Це дозволить вам дізнатися, що відбувається на вебсайті протягом 24 годин.
Примітка: За замовчуванням історія зберігатиметься протягом 3 годин.
Конфігурація Cron (запланованих завдань)
4) Слідкуйте за indexer_update_all_views завдання та індекси в Журнал Cron Scheuleрозділ.
Журнал розкладу Cron в адміністративній панелі
У нашому випадку, indexer_update_all_views Завдання виконується кожні 5 хвилин і, в більшості випадків, час виконання становить 1 секунду — усі індекси є дійсними та не перевантажують базу даних.
Ви можете помітити, що після червоного блоку виконання indexer_update_all_views займає 6 хвилин. Це означає, що деякі індекси були анульовані певними діями. Зазвичай, ви можете знайти завдання, яке анулює індекси в інтервалах між виконанням завдань — червоний блок.
Тепер вам потрібно з'ясувати, яке завдання ініціює недійсність індексу. Для цього вам потрібно виконати cron-завдання, яке, на вашу думку, спричиняє недійсність індексу. Не забудьте перед ним виконати переіндексацію .
Отже, ви просто запускаєте завдання та перевіряєте індекси. Якщо індекси стають недійсними, вам потрібно перевірити, чи розширення працює належним чином і чи потрібні якісь зміни даних. Ви також можете перепланувати завдання cron для виконання деяких дій у нічний час, коли ніхто не працює з адміністративною панеллю, і трафіку менше, ніж вдень.
Як виправити проблему блокування в Magento 2?
Якщо проблема із заблокованими файлами Magento виникає під час збереження продукту або якоїсь іншої дії, ви можете з'ясувати причину, виконавши такі дії:
1. Відкрити phpMyAdmin та виберіть свою базу даних.
2. Відкрийте Статус вкладку та виберіть Процес вкладка. Тут ви можете побачити запити, що виконуються на даний момент, та час, необхідний для їх виконання.
Відображення запущених SQL-запитів у phpMyAdmin
Якщо ви бачите якийсь запит, який виконується більше 1 хвилини, вам потрібно звернути на це увагу. Можливо, запит заблоковано на таблицях, і саме тому Magento не може зберегти продукт.
Щоб перевірити це, ви можете зачекати, поки запит завершиться, або завершити запит і спробувати повторити дію, яку ви намагалися виконати (збереження продукту або якусь іншу дію, яка не вдалася через проблему блокування).
Примітка: Закриття запитів не рекомендується для робочого середовища.
Перевірте конфігурацію бази даних
І останнє, але не менш важливе, що слід перевірити, коли у вас виникла проблема блокування в Magento, це конфігурація бази даних.
Magento рекомендує використовувати наступне Конфігурації БД для кращої продуктивності. Тож, якщо у вас виникають проблеми із блокуванням Magento, перевірте це.
![]()
Ви також можете зіткнутися з такою проблемою:
SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction, query was...
Ви можете спробувати змінити вузол блокування у вашому app/etc/env.php файл та змініть префікс у внутрішньому вузлі конфігурації.
<?php
return [
'lock' => [
'provider' => 'db',
'config' => [
'prefix' => 'new-prefix-here'
]
]
];
Потім просто скиньте налаштування індексаторів і спробуйте переіндексувати Magento ще раз.
Виправлення проблем із блокуванням Magento не таке складне, як ви можете подумати, якщо знати, з чого почати. Сподіваюся, цей посібник допоможе вам краще зрозуміти проблему блокування та причини її виникнення.