Битриксоид из Колхоза
744 subscribers
297 photos
9 videos
5 files
98 links
Изучаем #Битрикс, находим ошибки, обслуживаем проекты, пишем модули, разрабатываем компоненты.

Ютуб: shorturl.at/himBM
Модуль-ускоритель: shorturl.at/lsyTW
Модуль комментариев: shorturl.at/ACDT2
Сайт разработчика: https://burlaka.studio
Download Telegram
=====
Чтобы принудительно, на время тестирования(!) включить режим отладки SQL-запросов, в dbconn.php меняем
$DBDebug = false;
$DBDebugToFile = false;
на
$DBDebug = true;
$DBDebugToFile = true;

Отладка будет включена, а лог начнёт накапливаться в пути
$_SERVER["DOCUMENT_ROOT"]."/".$DBType."_debug.sql"
...где $DBType тоже задаётся в dbconn.php.

#битрикс #mysql #программирование #отладка
Ситуация с местоположениями:

Был запущен процесс импорта местоположений, с уровнем до улиц (самая расширенная информация). В какой-то момент приходит мысль, что нужны другие настройки.

Останавливается импорт, запускается с другими настройками. Он через определённое время падает с ошибкой.

Перезапускаем импорт. Аякс-запросы начинают отваливаться с сервера с ошибкой 504 (по таймауту).

Перезагрузка страницы даёт 504 ошибку и сайт перестаёт работать.

Диагностика показала, что в фоне остались несколько потоков заливки местоположений, мускуль ушёл в клин, нагрузка на сервере стабильно растёт и всё рушится.

#битрикс #mysql #местоположения
Причина: в базу местоположений продолжали литься несколькими потоками данные. На момент остановки (перезагрузка серверов и mysql):
• в таблице b_sale_location накопилось записей на 30000+ СТРАНИЦ!
• в таблице b_sale_loc_name накопилось записей на 56000+ СТРАНИЦ!

Залипание возобновляется если после всех рестартов пытаться войти в админке на страницу Местоположений.

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

#битрикс #mysql #местоположения
Действия: нужно вычистить таблицу местоположений и имён. В моём случае нужно было вернуться на местоположения 1.0 (на них корзина работала), в исходную точку.

b_sale_location:
Один из отличительных признаков старых местоположений и новых (в моём случае): координаты (LATITUDE) NOT NULL

b_sale_loc_name:
Отличие в поле SHORT_NAME

#битрикс #mysql #местоположения
На заметку для задач об оптимизации или написания своих механизмов.

MySQL умеет экономить свои ресурсы. Так например при попытке записать значение, которое уже есть в базе данных, мы получаем статистику о том, что ноль строк было изменено.

То есть с прикладной точки зрения, если мы решаем «помочь» базе данных и перед записью делаем проверочные запросы с тем, чтобы «не нагружать БД лишними запросами на обновление», представляется более оптимальным отдать MySQL то, что мы хотим записать, а она уже сама решит, что нужно записывать а что нет.

#битрикс #mysql
Не работает поиск по заголовкам
-== мини-чек-лист ==-

Ситуация: в инфоблоке есть элементы (разделы) с целевым названием, но поиск их не ищет.

0. Запускаем полную переиндексацию

1. Проверяем наличие подключения к поисковому движку (Настройки Модулей / Поиск / Морфология) — не отвалился ли Сфинкс, нет ли ошибки MySql.

2. Проверяем актуальность индекса:

2.1. Если поиск через MySql: идём в таблицу b_search_content_title
/bitrix/admin/perfmon_table.php?lang=ru&table_name=b_search_content_title
...и ищем по полю WORD. Примеры запросов: ДОМ%, ТЕЛЕФО%, САПОГ%

2.2. Если поиск работает через Сфинкс: в любом файле из публички пробуем код, пример:
\Bitrix\Main\Loader::includeModule('search');
$arId = \CSearchFullText::getInstance()->searchTitle("телефо", ["ТЕЛЕФО" => 0]);
echo '<pre>', print_r($arId, true), '</pre>';
! Искать для проверки из админки через «Командную php-строку» не получится, потому что под админкой SITE_ID != КодСайта.

Нам должен вернуться массив айдишек — записей таблицы b_search_content. Идём туда и проверяем записи на наличие. Если их там нет, значит контент не проиндексирован (см. ниже).

3.1. Если не найдено ничего, значит в поисковый индекс не попало то, что мы ожидаем там увидеть. Проверяем:
• настройки индексации элементов/разделов в настройках инфоблока;
• проверяем, подписан ли основной движок индексации инфоблоков (в таблице b_module_to_module на событие OnReindex модуля search).

3.2. Если наш тест даёт результаты, затык с поиском где-то по пути. Проверяем:
• что установлено в области поиска в параметрах компонента, который производит поиск в публичной части;
• проверяем, нет ли ошибок в проверке сайта;
• автор ловил ситуацию, когда под аякс-хитом некорректно ведут себя функции типа strtoupper (при том, что в админке перевод регистра проходит корректно). Сбой в этом случае наблюдается не поголовно, а на каких-то отдельных символах (например: дом ищет, а телефон — нет; по числам ищет, по словам — нет, английские ищет, кириллицу — нет).

Это основные пункты.
Если я чего-то упустил, напишите мне, я дополню.

#битрикс #поиск #заголовки #сфинкс #индексация #mysql