|
|
27.10.2008, 12:25
|
|
kulikoff
Денис Куликов
Зарегистрирован: 2007-10-26
Сообщений: 9
|
Недавно пришлось разбираться почему стал медленно работать сайт, разработанный на NetCat'e. В процессе выяснилось, что для формирования главной сраницы произоводилось ~150 запросов в БД.
Я сначала не поверил своим глазам, а потом пришёл в ужас.
После некоторых манипуляций удалось убрать около 100 лишних запросов.
Хочу рассказать о некоторых выводах и предостеречь некоторых разработчиков.
1. Не надо использовать, функцию s_list_class если подобных вызовов набирается хотя бы > 3 Дело в том, что вызов такой функции приводит к нескольким запросам к БД (от 5 и гораздо больше) (получить шаблон, данные компонента и т.п.) Если на странице нужно вывести данные из другого компонента, то лучше написать функцию для вывода этих данных в functions.inc.php дефолтного модуля. В подобном случае практически всегда можно обойтись 1 запросом.
Вообще, один вызов s_list_class может создавать десятки запросов к БД! В зависимости от компонента, объекты которого выводятся.
2. Забудьте про opt(). Используйте (<if> ? <true> : <false> )
Тут дело в том, что даже если условие в opt вернуло false, то код все равно будет выполнен, но не будет выведен на странице его результат.
3. Будьте аккуратны в использовании компонентов с полем "Файл". При выводе списка объектов такого компонента будет будет только раз сделан запрос на получение данных о файле, сколько объектов выводится. А если таких полей типа "файл" два, то и запросов будет в два раза больше. Если три, то в три и т.д.
Т.е. если у нас есть компонент "фотогалерея" и в нем 2 поля "файл" то для вывода 10 последних фотографий будет сделано больше 20 запросов к БД
Вообще, запросы в цикле - это крайнее зло! Избегайте этого.
4. Почти та же ситуация с голосованием. При выводе опроса будет столько запросов к БД, сколько вариантов ответа в нем сделано.
5. Создавая новые компоненты в которых потом будет осуществляться выборка и сортировка по разным условиям поставьте необходимые индексы для таблицы компонента. Это может существенно ускорить его работу.
P.S. Обращение к разработчикам NetCat. Пожалуйста, избегайте запросов к БД в цикле. Особенно если заранее не известно сколько в нем будет итераций. Очень хотелось, что бы данные проблемные функции были переписаны. А так же, хорошо бы в документации для разработчиков отдельно указывать, если функция производит запросы к БД, сколько она их производит и какие есть подводные камни.
www.kulikoff.net - разработка сайтов любой сложности
|
|
|
28.10.2008, 13:45
|
|
sdelali
Сделали.Ру
Зарегистрирован: 2004-12-24
Сообщений: 24
|
фигасе
Сделали.Ру
|
|
|
29.10.2008, 00:39
|
|
wultrex
Верховых Евгений
Зарегистрирован: 2008-09-15
Сообщений: 22
|
Так в Netcat 3 вроде уже не используются opt, а используется именно (<if> ? <true> : <false> )
Но по поводу всего остального, конечно ужасно. Для рядовых сайтов не заметно, но по поводу порталов тоже приходилось уменьшать кол-во запросов к бд. А ведь это еще не самые серьезные проекты были.
Что же получается, в стандартном исполнении неткет не годится для серьезно больших проектов?
|
|
|
29.10.2008, 10:08
|
|
kulikoff
Денис Куликов
Зарегистрирован: 2007-10-26
Сообщений: 9
|
WULTREX писал(а):Что же получается, в стандартном исполнении неткет не годится для серьезно больших проектов?
Ну на неткате есть довольно большие проекты. И создавать их можно. Просто создавать их должны люди действительно понимающие суть происходящих внутри процессов. Поэтому вместо части внутренних функций системы лучше использовать свои, написанные для конкретного проекта. И будет хорошо, если в документации для разработчиков эти моменты отразят
www.kulikoff.net - разработка сайтов любой сложности
|
|
|
29.10.2008, 20:36
|
|
wultrex
Верховых Евгений
Зарегистрирован: 2008-09-15
Сообщений: 22
|
То что большие проекты есть и они создаются - сомнений нет, но вопрос был в том, что этого не сделать на должном уровне стандартными функциями неткет. Если везде писать свои функции, то за что мы платим?
|
|
|
29.10.2008, 22:56
|
|
kulikoff
Денис Куликов
Зарегистрирован: 2007-10-26
Сообщений: 9
|
Основное время при разработке "с нуля" уходит на создание бэкофиса. В случае с неткатом мы получаем вполне не плохой бэкофис.
К тому же стандартными функциями пользоваться можно, но делать это надо аккуратно. Желательно понимая что и как делает каждая функция.
Разработчики обещали, что в новой версии Руководства эти моменты будут раскрыты подробно.
К тому же в скором времени будет 4-ая версия и там будет кэширование. А это во многом панацея от подобных проблем.
www.kulikoff.net - разработка сайтов любой сложности
|
|
|
31.10.2008, 01:31
|
|
Гость
Гость
|
Пробная версия с кэшированием уже разослана разработчикам
|
|
|
05.11.2008, 00:26
|
|
Гость
Гость
|
А (<if> ? <true> : <false> ) можно также использовать как OPT ?
Т.е. это альтернатива и принцип такой же или нет?
В частности интересует - можно ли использовать вложенные, как OPT
|
|
|
05.11.2008, 07:25
|
|
Гость
Гость
|
Цитата:Если на странице нужно вывести данные из другого компонента, то лучше написать функцию для вывода этих данных в functions.inc.php дефолтного модуля. В подобном случае практически всегда можно обойтись 1 запросом
а как прикажите прописывать Message40? жестко или добавлять файл с переменными
meTemplate=Message40 ?
|
|
|
05.11.2008, 08:47
|
|
pe3udent
Артур Юсупов
Зарегистрирован: 2008-04-03
Сообщений: 220
|
Цитата:В частности интересует - можно ли использовать вложенные, как OPT
Код:".( $condition1 ? $statement1 : ( $condition2 ? ( $condition3 ? $statement3 : $statement4 ) : NULL ) )."
|
|
|
05.11.2008, 08:49
|
|
pe3udent
Артур Юсупов
Зарегистрирован: 2008-04-03
Сообщений: 220
|
Цитата:а как прикажите прописывать Message40? жестко или добавлять файл с переменными
meTemplate=Message40 ?
для этого есть переменная $classID
|