Долгая загрузка сайта при открытии каталога на Bitrix. Битрикс загрузка


Обмен 1С с Битрикс

Общая схема импорта

type=sale - обмен заказами, type=catalog - импорт каталога

Шаги импорта выгрузки Битрикс

Ответ Шаг $NS[«STEP»]
Распаковка архива завершена -
Временные таблицы удалены -
Временные таблицы созданы 1
Обработано 94.35% файла 2
Файл импорта прочитан 2
Временные таблицы проиндексированы 3
Метаданные импортированы успешно 4
Группы импортированы 5
Деактивация/удаление групп завершено 6
Обработано 5781 из 10061 элементов 7
Обработано 10061 из 10061 элементов 7
Загрузка элементов завершена 7
Деактивация/Удаление элементов завершены 8
Импорт успешно завершен -

Порядок импорта по шагам

Этот процесс возможно запустить без 1С, достаточно иметь файлы выгрузки и curl или этот скрипт

Создадим переменные (файл кукисов $COOK и логин-пароль $BASIC_AUTH - это base64 от логин:пароль):

COOK='data/cookiefile.txt' BASIC_AUTH=`echo -n "логин:пароль" | base64`

Авторизация

Пример запуска:

curl -s -c $COOK 'http://site.ru/bitrix/admin/1c_exchange.php?type=catalog&mode=checkauth' -H "Authorization: Basic $BASIC_AUTH"

Ответ:

success PHPSESSID 1sk5v5eu830h5ddpfkj22eitf5

success - успех. Если вернулся HTML - проверьте логин-пароль, а также войдите под этими данными на сайт, введя каптчу (еще одна причина отказа).

Инициация

curl -s -c $COOK -b $COOK 'http://site.ru/bitrix/admin/1c_exchange.php?type=catalog&mode=init' -H "Authorization: Basic $BASIC_AUTH"

Ответ:

zip=yes file_limit=204800

Загружаем файл

Выгружаем на сайт файлы обмена в формате CommerceML 2, посылая содержимое файла или его части в виде POST:

curl -s -c $COOK -b $COOK -X POST --data-binary @- 'http://site.ru/bitrix/admin/1c_exchange.php?type=catalog&mode=file&filename=offers.xml' -H "Authorization: Basic $BASIC_AUTH" -H 'Content-Type: application/octet-stream' -H 'Expect:' < offers.xml

Ответ:

success

Пошаговая обработка файлов

curl -s -c $COOK -b $COOK 'http://site.ru/bitrix/admin/1c_exchange.php?type=catalog&mode=import&filename=offers.xml' -H "Authorization: Basic $BASIC_AUTH"

Если в первой строке содержится слово progress - это означает необходимость послать тот же запрос еще раз.

В этом случае во второй строке будет возвращен текущий статус обработки, объем загруженных данных, статус импорта и т.д.

Ответы:

progress Распаковка архива завершена. progress Временные таблицы удалены. progress Временные таблицы созданы. progress Обработано 49.57% файла. progress Обработано 98.19% файла. progress Файл импорта прочитан. progress Временные таблицы проиндексированы. progress Метаданные импортированы успешно. progress Группы импортированы. progress Деактивация/удаление групп завершено. progress Обработано 9168 из 9168 элементов. progress Загрузка элементов завершена. progress Обработано 9168 из 9168 элементов. progress Деактивация/Удаление элементов завершены.

Если в ответ передается строка со словом «success», то это будет означать сообщение об успешном окончании обработки файла.

success Импорт успешно завершен.

Если в ходе какого-либо запроса произошла ошибка, то в первой строке ответа системы управления сайтом будет содержаться слово failure, а в следующих строках - описание ошибки, произошедшей в процессе обработки запроса.

Если произошла необрабатываемая ошибка уровня ядра продукта или sql-запроса, то будет возвращен html-код.

pushorigin.ru

Долгая загрузка сайта при открытии каталога на Bitrix

Забегая вперед, – проблема решилась отключением в MySQL пары опций.

Решение:

# Нужно закомментировать следующие 2 строки в my.cnf #innodb_flush_method=O_DIRECT #optimizer_search_depth = 0

# Нужно закомментировать следующие 2 строки в my.cnf

#innodb_flush_method=O_DIRECT

#optimizer_search_depth = 0

Предистория

Однажды случилась такая вещь, что одна крупная студия по разработке сайтов сделала интернет-магазин на CMS 1С-Битрикс для другой крупной компании. Сайт успешно перенесся на сервер заказчика. При этом оптимизировали как сам сервер, так и настройки сайта. Не смотря на нагрузку порядка 1000 уников в сутки, сайт просто летал.

Сервер был довольно мощный, – 6 ядерный Intel Xeon E5-2430 с 32 гигабайтами оперативы на борту и консольной версией операционной системы Ubuntu 12.04. Из программного обеспечения стояла связка Nginx + php5-fpm и база данных mysql 5.5.

Однако оказалось не все так гладко и в последствии выяснилось, что при открытии страницы, где выводился полный список каталога товаров (их было порядка 3000 тысяч с выводом по 20 штук на страницу) он впадает в ступор, пытаясь что-то долго загрузить. Когда были убраны в настройках все лимиты таймаутов, каталог все-таки появлялся спустя 5-10 минут. И так при попытке открытия каждой страницы, чтобы отобразить очередные 20 товаров из каталога.

Проблема сразу же была передана студии, которая занималась разработкой сайта. Через 3 дня они как-то временно решили ее, но проблема всплыла опять через неделю. В итоге они отказались этим заниматься, свалив все на нас (клиента) который якобы уже залез в “их” код и немного его изменил.

Ну чтож, включив в битриксе лог запросов, стало видно, что нормальной работе сайта мешал запрос, который собственно и выводил каталог. Чтобы отсечь влияние другого ПО, этот запрос был выдернут и запихан на исполнение напрямую в базу. Время ожидания было такое же. Т.е. очевидно была проблема с MySQL. Перекопав настройки и испробовав различные конфигурации MySQL и было найдено решение. В нашем случае это полностью решило проблему и не повлияло на остальную производительность.

aione.ru

Загрузка файла больше 4Мб 1C Bitrix

При подготовке сервера под хостинг сайта на 1С Bitrix всплывают ошибки, с которыми я никогда не сталкивался при работе с другими CMS. Здесь я распишу что надо поменять, чтобы  обмен с сайтом и upload файлов и картинок успешно выполнились.

Если честно, то Bitrix очень капризный продукт и требует очень точной настройки, для начинающих есть варианты уже с готовыми виртуальными образами, на которых развернут CentOS и Bitrix: Веб-окружение. Но если вы привыкли работать с другим дистрибутивом (лично я предпочитаю Debian и Ubuntu), то придется поковыряться в конфигах ручками.

Итак, в Apache максимальный размер файлов указывается либо в php.ini (не у всех есть доступ к этому файлу), либо напрямую в .htaccess. В моей статье Все про файл .htaccess я подробно расписывал все настройки. Ну а мы в .htaccess допишем:php_value upload_max_filesize 10Mphp_value post_max_size 10MЯ уже было решил, что проблема решена, но проверка системы также ругалась на максимальный размер файлы.

Причина оказалась в связке Nginx+Apache. Так как Nginx работает кэширующим фронт-энд сервером, то он работает изначально по своим правилам, а затем по этим правилам решает, передавать ли файл дальше в Apache или нет. Логи ясно показали ошибку

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

Путем недолгих поисков в интернете увидел правильные настройки виртуального хоста Nginx, с указанием максимального размера файла, который Nginx может передать бэкенд-серверу. Добавляем в /etc/nginx/sites-available/example.org.conf следующие директивы в блок настроек прокси

proxy_buffering off;client_max_body_size 10m;

Перезапускаем службу и проверяем результат также через проверку системы Bitrix.

 

На сайте были такие настройки. У меня они чутка отличаются

proxy_pass http://127.0.0.1:8080/;proxy_redirect off;proxy_buffering offproxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;client_max_body_size 10m;client_body_buffer_size 128k;proxy_connect_timeout 90;proxy_send_timeout 6000;proxy_read_timeout 6000;proxy_buffer_size 4k;proxy_buffers 4 32k;proxy_busy_buffers_size 64k;proxy_temp_file_write_size 64k;

Похожие записи

treeone.ru

1С-Битрикс. LazyLoad или ленивая загрузка контента при включенном кешировании

В этой заметке я хочу рассказать о технологии LazyLoad или в простонародье «ленивая загрузка»(её ещё называют бесконечный скроллинг или Infinity Scroll) в Битриксе. Метод, описанный мной, будет точно работать в компонентах catalog.section и news.list.

Файлы компонентов, мы конечно же, модифицировать не будем.

«Ленивая загрузка» позволяет снизить нагрузку на сервер, а так же намного быстрее показывать нужный контент пользователю. Зачем ему перезагружать всю страницу целиком, если можно подгрузить только нужный фрагмент страницы. В нашем случаем — это элементы, будь то, элементы новостей или товары каталога.

Суть такого механизма проста: пользователю сначала показывается, например, 15 новостей и потом, как только он докручивает до их конца, сразу же подгружаются следующие 15 элементов. И так, пока не закончатся элементы.

Технические детали

В конце, после списка элементов, мы будем вставлять пустую ссылку, на следующие элементы. В ссылку будем добавлять параметр AJAX_PAGE, он нам ещё понадобится.Выглядеть она будет примерно так:

/news/?PAGEN_2=2&AJAX_PAGE=Y

Формировать ссылку будем следующим образом:

<?php $paramName = 'PAGEN_'.$arResult['NAV_RESULT']->NavNum; $paramValue = $arResult['NAV_RESULT']->NavPageNomer; $pageCount = $arResult['NAV_RESULT']->NavPageCount; if ($paramValue < $pageCount) { $paramValue = (int) $paramValue + 1; $url = htmlspecialcharsbx( $APPLICATION->GetCurPageParam( sprintf('%s=%s', $paramName, $paramValue), array($paramName, 'AJAX_PAGE',) ) ); echo sprintf('<div> <a data-wrapper-class="news-list" href="%s"></a> </div>', $url); } ?>

Способ первый: без кеширования

Этот способ самый простой и первым приходит в голову.

В шаблон компонента, до вывода элементов вставляем такую строку:

if(isset($_GET['AJAX_PAGE'])) { $APPLICATION->RestartBuffer(); }

А после вывода элементов вставляем это:

if(isset($_GET['AJAX_PAGE'])) { die(); }

Что мы делаем:Если страницу открываем при помощи AJAX, то перед выводом элементов сбрасываем буфер контента функцией $APPLICATION->RestartBuffer(). А в конце просто выходим. Тем самым мы отдаем только нужный кусок контента при аякс запросе.

Но в этом способе есть большой минус. Функция RestartBuffer() не будет работать при включенном кешировании.

Способ второй: с кешированием

Тут нам на помощь приходит файл component_epilog.php. Он выполняется при каждой загрузке страницы и запускается после того, как отработал шаблон. Как раз то, что нам нужно.

Теперь в шаблон компонента, до вывода элементов и после вывода элементов вставляем html комментарий:

<!--RestartBuffer-->

В папке с темой для нужного компонента создаем файл component_epilog.php и вставляем в него этот код:

if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); if (isset($_GET['AJAX_PAGE'])) { $content = ob_get_contents(); ob_end_clean(); $APPLICATION->RestartBuffer(); list(, $content_html) = explode('<!--RestartBuffer-->', $content); echo $content_html; die(); }
Пример JavaScript кода
(function(){ var ajaxPagerLoadingClass = 'ajax-pager-loading', ajaxPagerWrapClass = 'ajax-pager-wrap', ajaxPagerLinkClass = 'ajax-pager-link', ajaxWrapAttribute = 'wrapper-class', ajaxPagerLoadingTpl = ['<span>', 'Загрузка…', '</span>'].join(''), busy = false, attachPagination = function (wrapperClass){ var $wrapper = $('.' + wrapperClass), $window = $(window); if($wrapper.length && $('.' + ajaxPagerWrapClass).length){ $window.on('scroll', function() { if(($window.scrollTop() + $window.height()) > ($wrapper.offset().top + $wrapper.height()) && !busy) { busy = true; $('.' + ajaxPagerLinkClass).click(); } }); } }, ajaxPagination = function (e){ e.preventDefault(); busy = true; var wrapperClass = $('.'+ajaxPagerLinkClass).data(ajaxWrapAttribute), $wrapper = $('.' + wrapperClass), $link = $(this); if($wrapper.length){ $('.' + ajaxPagerWrapClass).append(ajaxPagerLoadingTpl); $.get($link.attr('href'), {'AJAX_PAGE' : 'Y'}, function(data) { $('.' + ajaxPagerWrapClass).remove(); $wrapper.append(data); attachPagination(wrapperClass); busy = false; }); } }; $(function() { if($('.'+ajaxPagerLinkClass).length && $('.'+ajaxPagerLinkClass).data(ajaxWrapAttribute).length){ attachPagination($('.'+ajaxPagerLinkClass).data(ajaxWrapAttribute)); $(document).on('click', '.' + ajaxPagerLinkClass, ajaxPagination); } }); })();

Объясню, что происходит. Теперь при открытии страницы при помощи AJAX запроса, отрабатывает шаблон и вызывается файл component_epilog.php. В нем мы получаем весь контент из буфера, разбиваем его по нашему html комментарию и отдаем клиенту.

Вот такой вот хитрый способ :)

Обновлено 1.12.14

В комментариях к заметке и в письмах на почту люди спрашивают, как быть с включенным композитным режимом? Ведь второй способ «с включенным кешированием» не заработает. И совершенно верно.

Способ третий: с включенным композитным режимом

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

Привожу код обработчика для композитного режима:

\Bitrix\Main\EventManager::getInstance()->addEventHandlerCompatible('main', 'OnEndBufferContent', function(&$content){ if (version_compare(SM_VERSION, '14.5.0') >= 0 && CHTMLPagesCache::IsCompositeEnabled()) { if (isset($_SERVER['HTTP_X_REQUESTED_WITH'], $_GET['AJAX_PAGE']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') { list(, $content_html) = explode('<!--RestartBuffer-->', $content); if(is_string($content_html) && strlen($content_html)){ $content = $content_html; } } } });

Добавить его нужно в init.php вашего сайта.

Если в настройках композита стоит галочка «Сохранять на диск только страницы без параметров», то в поле «а также страницы содержащие только следующие параметры» надо добавить параметр AJAX_PAGE.

И хочу заметить, что при этом способе код приведённый во втором пункте для файла component_epilog.php с включенным кеширование нужно удалить.

Ещё теги для роботов: ajax постраничная навигация, ajax пагинация, ajax подгрузка товаров.

www.olegpro.ru


Prostoy-Site | Все права защищены © 2018 | Карта сайта