Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: оптимизация, и прочие улучшения
Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
Помог: 53 раз(а)
как бы изловчиться при выводе нескольких однотипных элементов
в моем случае это товары, хотя могут быть и анонсы, и еще кака я нить упрощенная тому подобная однотипная структура
1) нынче это работает так: выгрибаем из базы все необходимые поля в ассоциативный массив, после чего это перенаправляется в "шаблонизатор"
минусы:
1 относительно много памяти,
2 неудобство рабоыт с ассоциативным массивом,
3 получение списка происходит из разных мест, в итоге если нужно расширить количество параметров, приходится повторять эти действия
плюсы (если их так можно назвать):
1 базу дергаем не часто
2) хотелось бы: получасть список индексов для объектов-моделей, передаваемый в шаблонизатор или итерационный объект который будет возвращать объекты модели,
а там уже по полученным ID получить объекты (товаров/статей/отзывов/коментов/...) подставлять их в шаблон
тут уже от реализации объектов, если получение значений делается в виде дерганья каждый раз базы, то база будет дергаться ну очень часто, а в манах к мускулю написано что запросы в цыкле это зло
3) иной вариант реализации это если для объекта а точнее вывода будут выдергиваться все необходимые элементы из базы за один присест
минусы почти теже что и в предыдущем варианте, хотя база дергается чуть реже. но по прежлему в цикле
4) следующий вариант, получить индексы для базы, и уже на основе них делать запрос к базе, и итеративно полученные значения впихивать в шаблон или генерить объект, а потом объект в шаблон
минусы с объектом в том, что это не модель, а некий вывод, который работает в обход модели
в общем вот такая каша в голове, может есть светлые идеи по реализации?
Покинул форум
Сообщений всего: 195
Дата рег-ции: Июнь 2013
Помог: 1 раз(а)
Первый способ видится самым нормальным:
1. Неужели на странице так много товаров, что есть смысл экономить память?
2. Работай с обычным массивом, необязательно же получать из бд именно ассоциативный массив. Сэкономишь память значительно.
3. Ничего непонятно. Конкретнее объяснить не можешь?
В остальных вариантах по описанию не очень понятно. Но из базы лучше за один запрос все получить, так что они отметаются. (Добавление)
Цитата:
плюсы (если их так можно назвать):
1 базу дергаем не часто
Это очень значительный плюс.
DlTA
Отправлено: 18 Апреля, 2014 - 16:02:54
Постоянный участник
Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
$oDBLink= CDB::link('SELECT `name`, `text`, ... WHERE ...');
foreach($oDBLinkas$itemGoods){
echo"<b>{$itemGoods['name']}</b><br>";
}
понимаю что примеры слабоваты, и скорее всего не показывают масштаб опы
Edwvee
Отправлено: 18 Апреля, 2014 - 16:43:31
Частый гость
Покинул форум
Сообщений всего: 195
Дата рег-ции: Июнь 2013
Помог: 1 раз(а)
Не понял, чем первый от последнего отличается. Так как не нашел ничего по запросу "php cdb". Но первый лучше всего, только в целях экономии памяти, запрос должен быть таким, чтобы было например:
но для удобности песледний завернут в класс итерратор
Edwvee
Отправлено: 21 Апреля, 2014 - 09:46:05
Частый гость
Покинул форум
Сообщений всего: 195
Дата рег-ции: Июнь 2013
Помог: 1 раз(а)
Ну можно просто mysql_fetch, но это уже из того что я говорил понятно.
По скорости выполнения разницы не должно быть особой. По памяти не знаю, смотрите разницу в memory_get_peak_usage(). Предполагаю, что это окажется экономией на спичках, а первый подход правильнее с точки зрения разделения логики и представления.
Stierus
Отправлено: 24 Апреля, 2014 - 23:56:55
Рекордсмен по количеству сообщений за 7 дней
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Рабочий из показанных - первый
Плюсы:
1) 1 запрос на получение всех данных (ну, может 2 или 3 вместе с обогащением из других таблиц/кешей и прочего)
2) Самая высокая скорость работы
Если смущает результат в виде ассоциативного массива (в шаблоне, принимающем данные, не понятно, какие ключи могут быть у массива) - то перед отдачей в шаблон, этот ассоциативный массив можно положить внутрь класса - итератора с четким интерфейсом. Таким образом и скорость будет примерно такой же (добавляется всего 1 - 2 экземпляра класса, массив не копируется) и в шаблоне понятно, какие геттеры есть у объекта.
Для экономии делают либо пагинацию, либо аяксовую подгрузку данных. Оба эти решения скорее клиентские, чем серверные.
DlTA
Отправлено: 25 Апреля, 2014 - 01:26:18
Постоянный участник
Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
Помог: 53 раз(а)
сижу дамаю, как получить максимальную скорость и удобстро, и при этом экономить память и т.д.
и на мысль приходит только следующее решение
// получаем очередную строку из базы и запихиваем в создаваемый объект
$oModel=new$this->className($id,$arrData);
return$oModel;
}
}
то есть: некая модель, конструктор которой получает как id для возможности осуществления запроса, так и массив с данными,
дальше для получения значений, данные вытаскиваются из массива, если же нужны только актуальные данные, то ставится соответствующий флаг в методе
вроде красиво получилось?
tato
Отправлено: 30 Апреля, 2014 - 09:23:18
Посетитель
Покинул форум
Сообщений всего: 468
Дата рег-ции: Сент. 2011 Откуда: Владивосток
Помог: 8 раз(а)
Вот если б PDO заюзать, то тогда подошла бы вот такая штука PDO::FETCH_CLASS
И вы бы сразу получали массив нужных объектов, например Ваш CModel
----- просто ?: сложно
DlTA
Отправлено: 30 Апреля, 2014 - 10:25:21
Постоянный участник
Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
Помог: 53 раз(а)
tato пишет:
Вот если б PDO заюзать, то тогда подошла бы вот такая штука PDO::FETCH_CLASS
И вы бы сразу получали массив нужных объектов, например Ваш CModel
мда, прикольно, в итоге получается что я на своем лесопеде реализовал по сути туже хрень, хотя есть некоторые внутренние отличия, что делает мой вариант в моих условиях более оптимальным
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.