.
Место для Вашей рекламы
28 Январь 2016

Анализ и оптимизация сайта Битрикс при медленной загрузке

Повторюсь с предыдущего поста:
Новое ТЗ — предоставлен сайт с временем открытия «морды» 10 секунд (в не авторизованном режиме).
В рамках этого ТЗ подразумеваю будет не один пост 🙂
Что понравилось — лицензия активна и актуальна, а движек не обновлялся с 2012года 🙂

Теперь к делу:
Пока у меня чистится БД приступлю к анализу загрузки странички — 10 сек это много!
Сначала решил глянуть FireBug-ом визуально в онлайн режиме в режиме Сеть — собственно, тормозит именно сам скрипт первый же GET отдаётся с кодом 200 размером 12кб и временем 10 секунд!
а в авторизованном режиме 16 сек!
Едем далее — авторизация, врубаем дебаг режим и обновляем страничку Читать полностью »

рубрики: Bitrix, Оптимизация | Комментарии (1)

28 Январь 2016

Битрикс оптимизация — большой размер b_sale_fuser

Новое ТЗ — предоставлен сайт с временем открытия «морды» 10 секунд (в не авторизованном режиме).
В рамках этого ТЗ подразумеваю будет не один пост 🙂
Что понравилось — лицензия активна и актуальна, а движек не обновлялся с 2012года 🙂
Конечно же, первое — решил обновиться до актуальной версии и создавая бэкап обратил внимание на очень большой размер БД.
Посмотрел phpmyadmin-ом и обратил внимание на 3 таблички с размерами более 200мб — в одной из них более 5.3 миллионов записей!
таблицы корзины
Поиск по запросу b_sale_fuser дал релевантные результаты
http://dev.1c-bitrix.ru/community/webdev/user/10337/blog/2323/
http://dev.1c-bitrix.ru/community/webdev/user/10337/blog/11317/
http://dev.1c-bitrix.ru/community/webdev/user/10337/blog/11202/
http://dev.1c-bitrix.ru/support/forum/forum6/topic50942/
http://marketplace.1c-bitrix.ru/solutions/alexkova.fileinspector/
В итоге пришел к выводу, что как раз из-за косяка в старом движке (господа — не экономьте на обновлениях!) эта проблема и всплыла.
Поставил инпектора — запустил очистку, процесс ОЧЕНЬ долгий — похоже на весь день 🙁
По хорошему кильнуть бы это всё не API Битрикса, а напрямую MySQL запросом — было бы быстрее в несколько порядков, но тут конечно риск накосопорить с базой …

P.S. ТАК НЕ ДЕЛАТЬ !!!! (инфа добавлена после этих удаление и восстановления БД — вся информация детальная о заказах тоже грохнулась, хотя странно)
В общем ждал я ждал, ждал, ждал, ждал и очень мне это всё надоело — в час по чайной ложке 🙁
Проанализировал структуру таблиц и вот решение по чистке корзин на утро сегодняшнего дня (всё что ДО — долой)

-- чистим b_sale_fuser по дате
DELETE `b_sale_fuser` WHERE `DATE_INSERT` < '2016-01-28 00:00:00' -- Запоминаем максимальный ID (пригодится ниже для удаления b_sale_basket_props ) в моём случае результат 720251 все айдишники ниже были созданы раньше - убить их SELECT max(ID) FROM `b_sale_basket` WHERE `DATE_INSERT` < '2016-01-28 00:00:00' -- Чистим саму b_sale_basket DELETE b_sale_basket` WHERE `DATE_INSERT` < '2016-01-28 00:00:00' -- Чистим b_sale_basket_props с помощью найденного выше ID DELETE `b_sale_basket_props` WHERE `BASKET_ID` <= 720251

P.S.S.
В итоге поставил удаление Инспектором, торопиться не будем 🙂
И настроил запуск агента CSaleUser::DeleteOldAgent(30, 0); 10800 сек (раз в 3 часа)
Ещё контролируем Сохранять корзину (дней) - она тут Настройки > Настройки продукта > Настройки модулей > Интернет-магазин

рубрики: Bitrix | Комментарии (0)

27 Январь 2016

Битрикс — папка Local для удобства контроля версий

Новость не нова, но всё таки репост т.к. её полезность я осознал только озадачившись вопросом контроля версий в Битриксе.

Чтобы сделать жизнь разработчиков проектов удобнее, мы решили в рамках работ по новому ядру вынести основные файлы проекта из папки /bitrix в папку /local. Это позволит изолировать изменяющиеся файлы проекта от папки продукта. По сути, в исключения достаточно будет добавить одну папку /bitrix.

Какие папки обрабатываются в /local?

activities — действия БП;
components — компоненты;
gadgets — гаджеты рабочего стола;
modules — модули;
php_interface — init.php, папка user_lang;
templates — шаблоны сайтов, шаблоны компонентов, шаблоны страниц.

local

При обработке папок приоритет всегда у /local перед /bitrix. Это означает, что если в /local/templates/ и /bitrix/templates/ будут находиться шаблоны сайта с одинаковым названием, то подключится шаблон из /local.

Мы уверены, что это нововведение позволит более эффективно разрабатывать проекты.

рубрики: Bitrix | Комментарии (0)

27 Январь 2016

Требования к HTML верстке

Вчера обратились ко мне за советом в поиске верстальщика — какие именно требования предъявлять верстальщику?!
Собственно, велосипед изобретать не стал — поискал, нашел и решил частично сохранить найденное себе.

Итак, требования и рекомендации к html вёрстке:

1. Кроссбраузерность
Сайт должен нормально работать в IE7+, FF3+, Opera9+, Safari4+, Chrome последней мажорной версии (или в зависимости от условий договора с клиентом и года, в котором вы читаете эту статью).

2. Всегда описывайте цвет фона для body даже если он белый.

3. Если используете CSS хаки, комментируйте, что это и для какого браузера, а лучше используйте css_browser_selector.js. Заботьтесь о верстальщиках, которым придется работать с этим макетом после вас.

4. Названия классов и id должны по смыслу соответствовать применению
например, header, menu, footer, news

5. Просьба разделять основные html блоки комментариями. Примерно так:




Это нужно для создания из сверстанного html макета шаблонов для CMS, после чего комментарии будут удаляться.

6. Не пренебрегать возможностью использовать GIF/PNG с 8-битным альфаканалом вместо PNG-24, где это возможно.

7. Все что можно сделать без Javascript, делать без него.

8. Если Javascript кода много — нужно его выносить в отдельный файл. Обработчики событий тоже лучше отделить и объявлять в отдельном файле.

9. Если это еще не оговорено с заказчиком, предварительно оговорить, какие JavaScript библиотеки вы планируете использовать при верстке макета, чтобы потом не оказалось, что при верстке использовался, к примеру, PrototypeJS, а заказчик планирует в обязательном порядке внедрять на сайт jQuery.

10. Для резиновых макетов обязательно должна быть задана минимальная и максимальная ширина.

11. Если в Т.З. не сказано другое, макет обязательно должен помещаться без горизонтальных скроллбаров в развернутое на весь экран окно браузера при горизонтальной составляющей разрешения экрана 1024px, а если позволяет размер макета, то и 800px.

12. В папке с изображениями не должно быть картинок, не использующихся в верстке. Если что-то исключили из верстки или переделали — не забывайте удалять уже ненужные картинки.

13. Для всех элементов, которые могут содержать текст различной длины, который должен быть вписан в одну строку (например, для кнопок или заголовков, если в дизайне не предусмотрено, что они могут занимать больше одной строки), обязательно задавайте CSS свойство white-space:nowrap.

14. CSS файл должен быть разбит с помощью строк с комментариями на блоки по функциональному назначению, например:

/* ___________1. Сброс CSS____________________*/
/* ___________2. Типовые элементы____________*/
/* _______________2.1. Залоговки______________*/
/* _______________2.2. Ссылки________________*/
/* _______________2.3. Элементы форм_________*/
/*___________3. HEADER (Шапка сайта) __________*/
/*___________4. FOOTER (Подвал )_______________*/
/*___________5. SIDEBAR (Справа)_______________*/

Как именно структурировть стили — вопрос немного холиварный, но главное — как-то это делать.

15. Если сдача верстки производится более чем одним этапом (например, верстальщик отправляет страницы по одной, или если ему возвращаются на доработку уже сверстанные страницы) и вы не используете систему контроля версий для верстки, исполнитель должен в обязательном порядке прикрепить файл с описанием изменений в макете примерно такого содержания:

Добавил новые картинки в папку img,
Картинки btnHome.jpg и btnFeedback.jpg уже не нужны, можно удалять
Изменил html-код в секции файла anketa.html
Добавил в конец файла main.css новые стили (начиная с .form_row и ниже).

16. Оговорить, в какой кодировке должен быть html-макет. CSS и JS файлы должны быть в той же кодировке, что и макет, иначе вероятность долгой и утомительной охоты на баги критически возрастает.

17. Если в макете присутствует JS, изменяющий DOM — внимательно следить, чтобы все корректно работало в Опере, т. к. этот замечательный браузер при нажатии на кнопочку назад страницу не перезагружает, а отдает закешированный документ, причем очень важный момент: документ не просто закешированный, а еще и с учетом всех модификаций DOM, которые были выполнены с помощью JS

18. Не забывайте прописывать cursor:pointer для кнопок, сделанных не с помощью input. Если вы не знаете, будет на эту кнопку повешен обработчик событий с помощью JS или это будет ссылкой, лучше в любом случае использовать тег

19. Если вы делаете обработку событий при нажатии на ссылки, следите за тем, чтобы обработчики событий возвращали false, или же используйте href=’javascript:void(0)’ вместо популярного href=’#’, чтобы страница не скроллилась вверх.

20. Верстайте формы правильно: метки полей должны находиться в тегах label, имеющих правильно заполненный атрибут for. Предусматривайте при верстке форм элементы для вывода ошибок валидации и стили для неправильно заполненных полей. Если это не предусмотрено в т.з. и дизайне, обязательно обсудите это с заказчиком.

21. Если в макете используются нестандартные шрифты, обязательно оговорите, можно ли элементы с нестандартным шрифтом делать картинками, если нельзя — обсудите, с помощью какой технологии будет реализовано их отображение (sIfr, Cufon, etc.)

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

23. В макетах, где высота страницы зависит от контента (а таких, как правило, большинство), предусматривайте, чтобы футер был прибит к низу браузера при отсутствии/малом количестве контента, если не оговорено обратное.

24. Если макет не проходит 100%-ную html-валидацию, постарайтесь по крайней мере делать так, чтобы использование невалидного кода было оправданно. Не стоит факапить валидность верстки только потому, что «мне так нравится» или «так получается короче»

——————————————————

От себя хочу добавить ещё несколько пунктов:

25. Адаптивность — в наше время всё больше и больше людей выходят в сеть с различных мобильных устройств самых разнообразных размеров браузера.

26. очень бы не помешал опыт работы с языком стилей LESS

рубрики: Вёрстка | Комментарии (1)

22 Январь 2016

Продление лицензии Битрикс

Например, начал разработку на демке и не успел в 30 дней, а допилить край как нужно!
Соответственно, помогло бы продление триального периода демо лицензии Битрикс.
Вот рабочий (пока) механизм:

Ставим свежую демку и перетаскиваем в продлеваемую демку
1. mysql значение b_option.admin_passwordh (еслич что b_option — таблица, admin_passwordh — значение поля NAME)
2. файл /bitrix/modules/main/admin/define.php
3. чистим /bitrix/managed_cache/
Вуаля! демка продлена ещё на 30 дней

P.S.
по п.1 на всякий случай уточню:
получаем значение так
SELECT `VALUE` FROM b_option WHERE `NAME`=’admin_passwordh’ (допустим получили ‘YYYYYYYYY’)
апдейтим на продлеваемой так
UPDATE b_option SET `VALUE` = ‘YYYYYYYYY’

рубрики: Bitrix, Полезности | Комментарии (0)

21 Январь 2016

Как быстро преобразовать таблицу Exel xls xlsx в простой html без лишних классов

Нарыл сегодня мега полезный скрипт преобразования таблички Excel из буфера обмена (любой формат xls xlsx и т.д.) в простой html без лишних классов! Однозначно репост! Чуть позже оформлю так же — для возможности онлайн преобразования.

jQuery(document).ready(function(){
jQuery('#convert').click(function() {
var arrayOfLines = jQuery('#input').val().split('\n');
var firstTH = false;
if(jQuery('#useth').attr('checked'))
firstTH = true;
var result = '

\n

\n';
for(var key in arrayOfLines) {
if(arrayOfLines[key]) {
var arrayOfCells = arrayOfLines[key].split('\t');
result += '

\n';
for(var key2 in arrayOfCells) {
if(firstTH && key == 0) {
result += '

\n';
}
else {
result += '

\n';
}
}
result += '

\n';
}
}
result += '

\n

' + arrayOfCells[key2] + ' ' + arrayOfCells[key2] + '

';
jQuery('#output').html(result);
jQuery('#thetable').html(result);
});
});

рубрики: Javascript, Javascript - JQuery | Комментарии (0)

19 Январь 2016

The SELECT would examine more than MAX_JOIN_SIZE rows — пример оптимизации SQL запроса

Вчера обратился ко мне друг с проблемой — при выполнении запроса возникала ошибка
#1104 - The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET MAX_JOIN_SIZE=# if the SELECT is okay
Пример устранения проблемы в оптимизации запроса — пример очень простой и наглядный, поэтому опубликую весь процесс от а до я.
Запрос следующий
SELECT order_item_id, order_id, order_item_sku, order_item_name, product_quantity, jos_vm_product.product_id, jos_vm_product.product_length, jos_vm_product_mf_xref.manufacturer_id
FROM jos_vm_order_item, jos_vm_product, jos_vm_product_mf_xref
WHERE order_status = 'C' AND product_sku = order_item_sku AND jos_vm_product.product_id=jos_vm_product_mf_xref.product_id AND product_in_stock < 5

Что-то связанное с Joomla Virtuemart (на этом движке у него магазин)- в смысл запроса сильно вникать не стал...
Итак, нам рекомендуют либо увеличить MAX_JOIN_SIZE либо использовать перед выполнением запроса SET SQL_BIG_SELECTS=1
Собственно, так и поступим SET SQL_BIG_SELECTS=1 и запрос.
УРА, запрос выполнился!
Время выполнения (118 всего, Запрос занял 0.3630 сек.)
А теперь подумаем - что же не понравилось SQL движку в данном запросе, а не понравилось в запросе слишком большое количество обрабатываемых присоединяемых строк.
Для анализа запроса - перед ним добавим EXPLAIN и посмотрим результат:

1
Для обработки запроса движек прошел ВСЕ строки таблицы jos_vm_order_item, а это 146 тыс. строк! не использовав ни одного индекса!
Условие по данной таблицы по полю order_status = 'C' соответственно, делаем по нему индекс

ALTER TABLE `jos_vm_order_item` ADD INDEX ( `order_status` ) ;

смотрим анализ запроса
2
вместо обработки 146 тыс.строк обрабатывается 117! и повторяем запрос уже без SET SQL_BIG_SELECTS=1
УРА! работает!
Причём скорость выполнения (118 всего, Запрос занял 0.0019 сек.) сильно порадовала - ускорение почти в 200 раз!
Всё! 🙂

P.S. Рекомендую изучить более профессиональную статью по оптимизации запросов с использованием EXPLAIN http://habrahabr.ru/post/211022/

рубрики: Полезности, Программирование | Комментарии (0)

Яндекс.Метрика