Регистрация
Регистрируясь, вы подтверждаете свое согласие с соглашением об использовании персональных данных.
Восстановление пароля

Что меньше нагружает хостинг и работает быстрее $nc_core->message->get_by_id или $nc_core->db->get_row

05.11.2017, 21:23
Kit

Зарегистрирован:
2016-02-02
Сообщений: 13

Недавно начал осваивать систему и сайты в целом и задался таким вопросом:
Например есть у меня несколько компонент, например с товаром (для разных типов товаров разные компоненты), в котором несколько десятков полей с некоторыми параметрами. Некоторые поля одинаковые в этих компонентах
Есть другой компонент, который планирую сделать для хранения заказов на эти товары.
Задача при получении заказа на какой-либо товар отправлять письма заказчику товара и менеджеру и в тексты писем надо размещать не только информацию о заказчике (например имя, телефон, email и пр.) но и некоторые параметры товаров (те параметры-значения полей, которые у компонентов имеют одинаковые названия полей).
В поля компонента с заказами добавлю поле с идентификатором компонента в котором был заказанный товар и идентификатор товара в этом компоненте. В действии после добавления заказа хочу получать данные (значения тех полей которые у всех компонентов товара одинаковые) и подставлять их в текст письма.
Суть вопроса в следующем:
Каким способом лучше получать данные из полей компонентов товаров?
Понял что можно прямым запросом вынимать из БД всю информацию по товару в ассоциативный массив и потом нужные значения массива подставлять в нужные места.
$nc_core->db->get_row("SELECT * FROM `Message".$f_ComponentID."` WHERE `Invoice_ID` = ".$f_ObjectID."", ARRAY_A );
или $nc_core->message->get_by_id($f_ComponentID, $f_ObjectID) также получать всё в массив.
А можно с помощью $nc_core->message->get_by_id($f_ComponentID, $f_ObjectID, "Название поля") получать значения нужных поле и также подставлять в нужные места.
Нужных полей ~ 15-20шт. Типы полей как целые числа, строки, текстовые блоки... ну практически все, кроме файл.
Что эффективнее использовать с точки зрения производительности и нагрузки на хостинг?
Прямой запрос в БД используя $nc_core->db->get_row или через $nc_core->message->get_by_id и данные в массив или по одному полю дёргать из БД через $nc_core->message->get_by_id ?
Может ещё какой вариант подскажите?
Спасибо!
09.11.2017, 18:07
Nexwich
Панасин Александр
Nexwich

Зарегистрирован:
2011-04-05
Сообщений: 1037

$nc_core->message->get_by_id() кеширует полученный ответ.
$nc_core->message->get_by_id($f_ComponentID, $f_ObjectID, "Название поля") так не стоит делать. Разделяйте расчеты и вывод.

Модуль "Почтовые уведомления" – настройка email уведомлений на вашем сайте без программирования. Бесплатно. http://netcat.ru/products/CatStore/solution_242.html
09.11.2017, 18:48
Kit

Зарегистрирован:
2016-02-02
Сообщений: 13

Александр, спасибо за ответ!
А если использовать $nc_core->message->get_by_id($f_ComponentID, $f_ObjectID, "Название поля", true) тоже не вариант?
И чем плохо то, что ответ кешируется? Правильно ли я понимаю, что при большом потоке заказов может получиться так, что некоторым пользователям будут отправлены письма с данными предыдущих заказов? или что? можете немного пояснить что вы имеете ввиду под "Разделяйте расчёты и вывод"? Спасибо.
И получается лучше использовать вариант с $nc_core->db->get_row ... так ?
10.11.2017, 11:27
Kit

Зарегистрирован:
2016-02-02
Сообщений: 13

Ещё такой момент.
Где-то читал что лучше брать из базы конкретное значение, чем забирать сразу всё в массив и потом использовать из этого массива то, что нужно.
В моём случае в компонентах примерно 35-40 полей. Из них примерно от 5 до 20 (25) надо выбирать и использовать их информацию в дальнейших действиях (формирование писем заказчику и менеджеру).
Как лучше поступать (дёргать по одному значению или писать в массив) и что для этого эффективнее использовать (какой инструмент/способ/метод) с точки зрения оптимизации быстродействия и нагрузки на хостинг?
11.11.2017, 22:12
Руслан Густокашин
Студия Вэлпис

Зарегистрирован:
2012-02-06
Сообщений: 962

Kit, а почему у вас вообще возникла задача на столь низком уровне оперировать с товарами к заказам? Не лучше ли использовать штатный модуль "Интернет-магазин"? В нем есть ведь уже готовый шаблонизатор писем о заказах, в котором по каждому товару все свойства можно вывести с помощью макропеременных и элементов массива. Даже варианты товаров поддерживаются. Да и само сохранение товаров к заказам уже давно реализовано, зачем велосипед-то изобретать?
13.11.2017, 14:07
Kit

Зарегистрирован:
2016-02-02
Сообщений: 13

Руслан, спасибо за отклик.
дело в том, что заказы не совсем товары, а мне надо к каждому товару свой текст письма пользователю отправлять при заказе. Плюс некоторые товары так сказать бесплатные, а некоторые платные и платные могут быть сразу по полной оплате, а могут оплачиваться частями.
Думал про магазин, но как мне показалось там могут быть сложности с формированием текстов писем при разной оплате или бесплатном товаре. Или надо делать несколько вариантов одного товара и в нужное время отключать лишние. Например, когда хочу раздавать товар бесплатно, то надо будет отключать платный вариант и включать бесплатный, вместо простого удаления цены, т.к. текст письма пользователя сильно зависит от того, какой товар заказан . + описание товаров может меняться как у всех вариантов, так и у каждого в отдельности....
Попробую ещё раз детальнее посмотреть возмножности магазина.., но...
В общем хотелось бы понять как лучше/правильнее в netcat получать данные из описаний "товаров" в разных местах чтобы потом с ними что-либо делать.
14.11.2017, 05:03
Руслан Густокашин
Студия Вэлпис

Зарегистрирован:
2012-02-06
Сообщений: 962

Тогда может быть пойти гибридным способом...
Воспользоваться все-таки модулем магазина, но отправку писем сделать самодельную (стандартную отправку писем в настройках модуля можно отключить).
Понимаете, отправка письма о заказе - не совсем та процедура, которую есть смысл оптимизировать по быстродействию, вылизывать код. Выиграете на быстродействии, а проиграете на масштабируемости и сроках выполнения задачи. Мне кажется, здесь выгоднее воспользоваться netshop'овскими обертками по работе с заказами и товарами (см. описание "Коллекций" в документации на нетшоп). Как раз благодаря абстракции у вас будет под рукой объект $cart, содержимое которого можно обойти обычным foreach'ем, а элементом будут товары (item), у каждого item'а доступны все свойства, прописанные у этого товара в компоненте. Если товар дочерний, то недостающее берется автоматом из родителя. Если поле списочное, то у него автоматом подхватится строковое значение из соответствующего классификатора. Формируете и отправляете какое надо письмо при каких требуется условиях.
Нулевую цену нетшоп проглатывает нормально (как ни странно).

Ну а если отвечать на ваш вопрос в том виде, в котором вы его поставили - это вам надо, пожалуй, делать циклический get_row(...), как вы и написали.
Делая get_ by_id, у вас будет кеширование, но выигрыша от этого кеширования не будет, потому что в конкретный момент времени ваш скрипт будет обрабатывать содержимое заказа только один раз.
14.11.2017, 11:24
Kit

Зарегистрирован:
2016-02-02
Сообщений: 13

Руслан, спасибо за разъяснения!
У меня в заказе всегда возможен только один "товар". Поэтому цикл не нужен и получать данные заказанного "товара" надо всего один раз.
Правильно ли я понял что лучше получать одним запросом все данные заказанного товара в массив и потом из массива подставлять нужные значения или лучше дёргать запросами каждое нужное значение из базы. Дело в том, что в компоненте полей 15-20 (в некоторых 20-25), которые нужно получать и с которыми нужно работать дальше. Получается либо одним запросом получаю все данные записи либо 15-20(20-25) запросов на получение разных данных этой записи...
Что быстрее и меньше грузит сервер? я подозреваю что лучше делать через массив.
И, так как товар в заказе всегда один, то может быть всё же лучше get_ by_id, чем get_row ?
14.11.2017, 11:33
Руслан Густокашин
Студия Вэлпис

Зарегистрирован:
2012-02-06
Сообщений: 962

Если товар в заказе один,и в нем есть объемные поля (например, поле "Описание товара") тогда лучше делайте get_row с перечислением конкретных полей, которые нужно прочитать, даже если их 20. Результат будет в виде массива, из него потом и берите все значения.
А get_by_id, читающий все без исключения поля товарного объекта, делать рискованно, потому что у товара может быть чересчур длинное описание, которое, может быть, съест всю оперативную память.
Но если вы считаете, что это маловероятно - тогда используйте get_by_id. У него единственный плюс - это кеширование, в остальном это тот же самый get_row, в который подставляется либо "*", либо конкретное имя поля.
Делать N запросов get_by_id (по одному на каждое поле), конечно же, нельзя - это может слишком сильно нагрузить БД,
14.11.2017, 12:07
Kit

Зарегистрирован:
2016-02-02
Сообщений: 13

Спасибо!
198 196 2017-11-14 12:07:50 14861
Описание проекта