Дело в том, что у нас проект разделен по серверам, на одном сервере крутится php, на другом сервере полноценный MySql. Общая локальная сеть. То есть данные от MySql в PHP приходят по сети. Как только мы разделили по серверам работу сайта столкнулись с очень долго работой создания индексов. Виной этому, при создании индекса $index->continueIndex(); происходит циклическая беготня по элементам и формирования для отдельно каждого индекс. В итоге мы получаем огромное количество запросов к MySql и задержку из-за работы протокола сети TCP. Если бы, во время индексации не производить обмен данными с PHP, и уменьшать тем самым количество запросов, было бы гораздо быстрее и красивее.
Поясню на примере: Сейчас создание индекса занимает: Elements: 124 Query count: 4912 Time: 9.2134962081909 сек. Было до разъединения PHP и MySql в секундах 2.91 s при том же количестве элементов и количестве запросов.
Я прекрасно понимаю, что это наша проблема, что мы решили разделить, но теоретически ваш код тоже можно было бы оптимизировать. Даже у вас в документации и рекомендациях четко написано придерживаться правила - не делать запросов в цикле, однако сами нарушили свои рекомендации: https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=32&LESSON_ID=3594
public function continueIndex($interval = 0)
{
if ($interval > 0)
$endTime = microtime(true) + $interval;
else
$endTime = 0;
$indexedCount = 0;
if ($this->lastElementId === null)
$lastElementId = $this->storage->getLastStoredElementId();
else
$lastElementId = $this->lastElementId;
$elementList = $this->getElementsCursor($lastElementId);
while ($element = $elementList->fetch())
{
$this->indexElement($element["ID"]); <-----------
$indexedCount++;
$this->lastElementId = $element["ID"];
if ($endTime > 0 && $endTime < microtime(true))
break;
}
return $indexedCount;
}
public function indexElement($elementId)
{
$element = new Element($this->iblockId, $elementId);
$element->loadFromDatabase();
$elementSections = $element->getSections();
$elementIndexValues = $this->getSectionIndexEntries($element);
foreach ($element->getParentSections() as $sectionId) <-------------
{
foreach ($elementIndexValues as $facetId => $values) <-------------
{
foreach ($values as $value) <-------------
{
$this->storage->addIndexEntry(
$sectionId,
$elementId,
$facetId,
$value["VALUE"],
$value["VALUE_NUM"],
in_array($sectionId, $elementSections)
);
}
}
}
foreach ($elementIndexValues as $facetId => $values)
{
foreach ($values as $value)
{
$this->storage->addIndexEntry(
0,
$elementId,
$facetId,
$value["VALUE"],
$value["VALUE_NUM"],
empty($elementSections)
);
}
}
}
В этом случае необходимо собрать все элементы в кучу, обработать что надо, и потом разом воткнуть в MySql Спасибо за внимание, возможно учтете это в разработке.
Есть необходимость фильтровать список заказов и выбрать например заказы из Города 1 Города 2 и Города три. Сейчас такое невозможно, так как можно выбрать только например Город 2. Становиться неудобно, если работаешь в разных городах и есть ответственные лица за каждый регион, которые сейчас по отдельности фильтруют только по одному городу, и приходиться выбирать разные города. Согласитесь, неудобно?
Если в названии товара указаны дюймы в виде одинарных кавычек (''), яваскрипт не обрабатывает и не вставляет выбираемый товар в заказ. По этому, не первый раз после обновления приходится редактировать данную форму и прошу учесть сей конфликт яваскриптов и кавычек. Требуется всего лишь добавить в строчку 262 файла product_search.php параметр ENT_QUOTES для функции htmlspecialchars. Пример:
$arParams = "{'id' : '".$arItems["ID"]."', 'name' : '".htmlspecialchars($arItems["NAME"], ENT_QUOTES)."', 'url' : '".CUtil::JSE scape($URL)."', 'urlImg' : '".CUtil::JSE scape($ImgUrl)."', ... ... ... 'payCallback' : 'CatalogPayOrderCallback'}"; Спасибо. Думаю не у нас одних такая петрушка.
Есть большая необходимость в добавлении этого функционала, так как внутренний код не нужен абсолютно, так как у товара имеется внешний код по 1С и все ориентируются именно по нему. Например что бы привязать к фотоаппарату несколько сумочек, имеется список этих кодов сумочек по базе 1С. И проще всего и быстрее искать именно по этому коду, то есть по Внешнему коду XML_ID.То же самое и в создании скидки к определенным товарам, которые тоже искать проще всего по внешнему коду. И конечно же, что бы этот код XML_ID присутствовал столбиком и в самом списке элементов ниже фильтра. Ручками устал после каждого обновления вписывать 5 строк в два файлика. Для быстрой реальзации этого дела могу выслать вам что и куда вписать. Надеюсь на понимание и быструю реализацию сего дела.
Изменения касаются файлов: 1. /bitrix/modules/iblock/admin/iblock_element_search.php 2. /bitrix/modules/catalog/admin/cat_product_search.php
/bitrix/modules/iblock/admin/iblock_element_search.php - выйдет в обновлении iblock 14.0.6 /bitrix/modules/catalog/admin/cat_product_search.php - больше не используется, вместо него cat_store_product_search.php, фильтр добавлен в обновлении catalog 14.0.0
/bitrix/modules/catalog/admin/cat_product_search.php - больше не используется, вместо него cat_store_product_search.php, фильтр добавлен в обновлении catalog 14.0.0