Долгая загрузка сайта при открытии каталога на Bitrix. Битрикс загрузка
Обмен 1С с Битрикс
Общая схема импорта
type=sale - обмен заказами, type=catalog - импорт каталога
mode=checkauth - авторизация
mode=init - инициация
mode=query - запрос (для заказов)
mode=file&filename=<имя файла> - загрузка файла
mode=import&filename=<имя файла> - обработка файла
Шаги импорта выгрузки Битрикс
Распаковка архива завершена | - |
Временные таблицы удалены | - |
Временные таблицы созданы | 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 1sk5v5eu830h5ddpfkj22eitf5success - успех. Если вернулся HTML - проверьте логин-пароль, а также войдите под этими данными на сайт, введя каптчу (еще одна причина отказа).
Инициация
curl -s -c $COOK -b $COOK 'http://site.ru/bitrix/admin/1c_exchange.php?type=catalog&mode=init' -H "Authorization: Basic $BASIC_AUTH"Загружаем файл
Выгружаем на сайт файлы обмена в формате 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 Деактивация/Удаление элементов завершены.Если в ходе какого-либо запроса произошла ошибка, то в первой строке ответа системы управления сайтом будет содержаться слово 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); } }); })();Вот такой вот хитрый способ :)
Обновлено 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