Множество вопросов. AR. Model. etc.

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Damange
Сообщения: 11
Зарегистрирован: 2010.05.17, 16:30
Откуда: Нижневартовск
Контактная информация:

Множество вопросов. AR. Model. etc.

Сообщение Damange »

Sam Dark писал(а): стоит собрать список таких непонятных мест или мест с излишне заумными формулировками и отметить, что именно непонятно. Возможно, поможет улучшить документацию.

Прочитал документацию. Выполнил демо пример. Заглядывал в API. Смотрел и разбирался в коде Юпи и ПламЦМФ.
После 2 суток общения с Yii сложились вопросы:

Active Records
1. Модели без AR. Да, в документации есть пример, но он какой-то жиденький.
2. Чего мы лишаемся, при НЕиспользовании AR?
3. Валидация, пагинация, zii-виджеты с dataProvider, кэширование для моделей без AR.
4. Как можно оптимизировать AR, кроме кэширования схемы.

Модели
5. Включить в официальную документацию расширенный пример с DAO (да он есть в рецептах, может что то добавить в основную документацию)
по мне, так более понятно описано в Laravel http://laravel.ru/docs/models#сущности, http://laravel.com/docs/models#best-practices
Различия между DAO и Entities - Services - Repositories: http://stackoverflow.com/questions/8550 ... y-patterns
6. Простые модели, а ля модели CodeIgniter. То есть когда есть построитель запросов, с помощью которого выполняются выборки и возврат результатов. 1 модель - 1 файл.
7. Было бы не плохо добавить в документацию или в рецепты более глобальный пример использования Yii без AR. Можно на примере базового демо-блога.
8. Есть ли вообще проекты (хотя бы простенький блог) без использование AR?

Общее
9. В документации используется просто Widget. В примере по демоблогу используется Yii::import('zii.widgets.CPortlet'). Вначале я думал что я читал невнимательно официальную документацию. Проверил поиском "CPortlet" - ничего не найдено. Зачем нужно делать Yii::import?


ps. Данные вопросы дублирую в ветке вопросов. Интересные ответы - верну сюда.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Множество вопросов. AR. Model. etc.

Сообщение samdark »

1. http://yiiframework.ru/doc/guide/ru/form.model разве жиденький?
2. Лишаемся AR :)
3. Валидация см. п.1. Постраничка и виджеты см. http://www.yiiframework.com/doc/api/1.1 ... aProvider/ и http://www.yiiframework.com/doc/api/1.1 ... aProvider/. Кеширование стандартное http://yiiframework.ru/doc/guide/ru/caching.overview
4. Обновиться до последней версии Yii, использовать APC. При сохранении одного поля указывать это поле в saveAttributes().
5. http://yiiframework.ru/doc/guide/ru/database.dao
6. В CI, насколько помню, как таковых моделей нет. Вы про какое-то расширение?
7. Зачем, если есть AR? Да и SQL, скорее всего, человек который отказывается от AR, знает.
8. Должны быть.
9. http://www.yiiframework.com/doc/api/1.1/CPortlet/. Импорт делатеся потому как Zii по умолчанию не импортирован.
Damange
Сообщения: 11
Зарегистрирован: 2010.05.17, 16:30
Откуда: Нижневартовск
Контактная информация:

Re: Множество вопросов. AR. Model. etc.

Сообщение Damange »

Sam Dark писал(а):6. В CI, насколько помню, как таковых моделей нет. Вы про какое-то расширение?
Я про стандартный механизм работы с моделями. Там же все делается ручками. Составили запрос через построитель (или скормили готовый sql), вернули результат в виде массива/объекта.
Sam Dark писал(а):7. Зачем, если есть AR? Да и SQL, скорее всего, человек который отказывается от AR, знает.
В том то и дело. Я знаю SQL. Хочу что бы приложение работало быстро. Что бы страница не кушала 20Мб памяти и не делала 100 запросов к БД. Хочу что бы при множественных связях M-M-M-M-M получение данных с крайних таблиц не вызывало коллапс у системы в целом. Хочу контролировать весь процесс общения приложения Yii с БД.

AR - это удобный черный ящик. В него подал набор данных - получил искомое. Глянул в профайлер - ужаснулся.
Что будет, если в проекте 100 таблиц, связанных между собой, иногда через 3-5 множественных связей?
Спасет ли простое кэширование?
Sam Dark писал(а):2. Лишаемся AR
Есть ли смысл отказываться от AR? Насколько неудобно использовать Yii без него (к примеру часть Yiiext поведений заточены под AR и тд).
maxyer
Сообщения: 290
Зарегистрирован: 2012.01.10, 17:55
Откуда: отсюда

Re: Множество вопросов. AR. Model. etc.

Сообщение maxyer »

Damange писал(а): После 2 суток общения с Yii сложились вопросы:
подписываюсь под каждым словом
Аватара пользователя
Koduc
Сообщения: 140
Зарегистрирован: 2011.02.15, 18:56

Re: Множество вопросов. AR. Model. etc.

Сообщение Koduc »

Damange писал(а):AR - это удобный черный ящик. В него подал набор данных - получил искомое. Глянул в профайлер - ужаснулся.
"Premature optimization is the root of all evil".

На самом деле с профайлером и памятью не так всё страшно.
- В конфиг для базы ставьте schemaCachingDuration в что-то разумное на девелопменте - количество запросов уменьшится в примерно 3 раза (иначе AR каждый раз опрашивает таблицу и вытаскивает столбы, дефолтовые значения для них и прочее);
- Не создавайте кучу AR объектов. Если нужно выбрать/отобразить много данных - лучше сделать через sql;
- Используйте ..->with(..)->.., чтобы джоины делались все и сразу, а не через lazy load (где необходимо само собой); Сюда же - используйте ->select()
- AR в Yii даёт довольно гибкий функционал программисту. Я могу сделать $user->delete(); при этом удалится пользователь, всего его фото/видео и всё, что у нему относится. Однажды сделав связи - потом просто не думаешь о таких мелочах. Плюс валидация и сохранения. Это чудесно: $user->name = 'Tester'; $user->save(false);

Гоняется Yii на довольно крупных проектах. Косяки и затыки с производительностью были как раз таки там, где запросы писались вручную: люди, оказалось, ошибаются чаще :) Сам же AR работает хорошо.

PS: как я понимаю, все после CodeIgniter так пугаются AR?
Разработка на Yii: monoray.ru
Открытое бесплатное решение для создания сайтов по аренде/продаже недвижимости: Open Real Estate
Damange
Сообщения: 11
Зарегистрирован: 2010.05.17, 16:30
Откуда: Нижневартовск
Контактная информация:

Re: Множество вопросов. AR. Model. etc.

Сообщение Damange »

maxyer писал(а):"Premature optimization is the root of all evil".
50 человек стоит на берегу бурной реки. Нужно переправиться на другой берег. Глупо влезать всем 50 сразу на борт, но уяснив некоторые ньюансы (выдержит, не выдержит, а что если и т д)

У меня есть большой опыт работы, как с ORM (onPHP на проекте rabota.ru), так и с фреймворками: CI, Kohana, FuelPHP, Laravel. Сейчас перед командой разработчиков стоит крупная задача, для которой мы хотим использовать Yii, как зрелый и надежный фреймворк с большим сообществом. Вот я и пытаюсь уяснить узкие/непонятные моменты работы с Yii.

И еще вопрос по оптимизации AR.
В закладках у меня добавлен такой сниппет:
Добавлю от себя о кешировании запросов если вы используете AR:
$model = Post::model()->cache($duration, $dep)->find($criteria)
значительно! медленней классического подхода
$model=Yii::app()->cache->get($id)
if($model===false)
{
$model=Post::model()->find($criteria);
Yii::app()->cache->set($id, $model);
}

Поскольку при кешированни через ...model()->cache->… AR что-бы получить
запись из кеша строит sql запрос, что и создает большую нагрузку и +cpu time
Можете привести подобные примеры?
Аватара пользователя
Koduc
Сообщения: 140
Зарегистрирован: 2011.02.15, 18:56

Re: Множество вопросов. AR. Model. etc.

Сообщение Koduc »

Damange писал(а):Глупо влезать всем 50 сразу на борт, но уяснив некоторые ньюансы (выдержит, не выдержит, а что если и т д)
Это согласен. Просто по первому посту сложилось впечатление о полном выпиливании AR из Yii. Как по мне - так это уже был бы не Yii :)
В своё время тоже стоял на распутье, Yii казался "тяжелым" после CI. Страхи оказались напрасными.
Damange писал(а):
Поскольку при кешированни через ...model()->cache->… AR что-бы получить
запись из кеша строит sql запрос, что и создает большую нагрузку и +cpu time
Ну оно и логично. В первом случае кэш с зависимостью (проверяет - изменились ли данные?), во втором случае просто кэш по времени. Если подключить что-то типа memcached - второй вариант станет еще быстрее. Но тогда надо следить за кэшем и везде, где происходит обновление данных, его сбрасывать/обновлять. Рано или поздно это где-то забудется и попрут "полтергейсты" - данных нет, а из кэша они еще доступны.

По нагрузке - большую ли? Всё зависит от того, что у вас в $dep. При наличии зависимости вида SELECT MAX(date_updated) FROM.. (ну и если date_updated сделать индексом) - запрос отрабатывает быстро. Сталкивался даже с тем, что запрос к базе (простой) проходил быстрее (без кэша), чем запрос из кэша! (кеш лежал в файлах, в том время как индексы в базе обычно лежат в памяти).
Кстати, профайлинг (и включенный дебаг) тоже тормозить может сильно, отсюда может быть и расход памяти с cpu.

По примерам - что-то типа: viewtopic.php?f=8&t=8073

По крупным проектам: лично у меня получается по такой схеме - делаем всё быстро и просто с использованием AR. Смотрим что получилось в итоге, если вылезли узкие места - можно переписать уже без AR.
Но, как писал где-то в соседней ветке, криво написанный запрос вручную может оказать еще хуже - людям свойственно делать ошибки.
Разработка на Yii: monoray.ru
Открытое бесплатное решение для создания сайтов по аренде/продаже недвижимости: Open Real Estate
Damange
Сообщения: 11
Зарегистрирован: 2010.05.17, 16:30
Откуда: Нижневартовск
Контактная информация:

Re: Множество вопросов. AR. Model. etc.

Сообщение Damange »

Посмотрел Open Real Estate.
Поставил его на свою VPS.

Добавил кэшировние схемы, отключил отладку.
'enableParamLogging' => 0,
'enableProfiling' => 0,
'schemaCachingDuration' => 3600,

На сервере есть nginx, apc.
Главную страницу ORE открыл в браузере, что бы все попало в кэш.
ab -n 100 -c 5
ORE выдает: 40.87 rpm
мой проект на CI: 258.57 rpm

для сравнения
блог на WP: 21.21 rpm
пустой домен с index.htm: 5547.54 rpm


Пробовал заменить yii.php на yiilite.php - эффекта ноль.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Множество вопросов. AR. Model. etc.

Сообщение samdark »

Я про стандартный механизм работы с моделями. Там же все делается ручками. Составили запрос через построитель (или скормили готовый sql), вернули результат в виде массива/объекта.
Ну, в Yii также есть построитель запросов.
Что будет, если в проекте 100 таблиц, связанных между собой, иногда через 3-5 множественных связей?
Спасет ли простое кэширование?
Вы же не будете делать выборку из всех 100 одновременно? Если собираетесь — лучше, конечно, SQL через Yii::app()->db->createCommand($sql)->queryAll();
Есть ли смысл отказываться от AR? Насколько неудобно использовать Yii без него (к примеру часть Yiiext поведений заточены под AR и тд).
Совсем отказываться смысла нет. Всякие отчёты строить и импорт по 100—200 записей делать, конечно, лучше без AR. А формочку отобразить да данные обработать AR в разы удобней.
Аватара пользователя
Koduc
Сообщения: 140
Зарегистрирован: 2011.02.15, 18:56

Re: Множество вопросов. AR. Model. etc.

Сообщение Koduc »

Damange писал(а):Пробовал заменить yii.php на yiilite.php - эффекта ноль.
Давайте по порядку..
1. Я где-то писал, что ORE отличается производительностью? (так и знал, вас соблазнила подпись! :) ). По дефолту кэширование отключено (админка -> настройки), плюс оно выпиливалось из кода на протяжении 8 месяцев за ненадобностью. Цели сделать продукт быстрее не было. Цель одна - сделать быстрее разработку (продукт бесплатный, быстрее разработка = дешевле).
Объясню: на заре становления продукта было проведено тестирование - по всему сайту пробежались xenu (чтобы всё закешировалось), потом проводили тесты через ab по списку различных страниц. Так вот, тесты показали, что без кеширования (в файлы) продукт работал быстрее. В следующем же релизе кэширование было отключено по дефолту и постепенно начало выпиливаться из продукта.
1.1. У меня нету цели меряться ab. Всю главную страницу можно положить в кэш и радоваться :)
2. По вашим тестам мы быстрее wp в два раза, ура!
3. rpm - requests per minute? Если так, то задеты мои админские чувства :)
ab -n 100 -c 5 http://re.monoray.ru/
Time taken for tests: 16.272 seconds
Requests per second: 6.15 [#/sec] (mean)
6.15 запроса в секунду на удаленный сервер (хиленький с кучей проектов и тоже под nginx, но без ускорителей, пинг до сервера порядка 35 ms, mysql на конфигурации minimal) - то это 369 запросов в минуту (rpm?).

Но мы с Вами, к сожалению, отклонились от темы. Через ab сравнивать различные проекты как минимум не корреткно, этим и страдают все громкие статьи про сравнение CI vs ZF vs Yii - там гоняют какие-то элементарные вещи, не имеющие отношения к реальности.
Давайте попробуем подойти к вопросу с другой стороны: какое количество посещений планируется на проекте? На каком железе будет крутиться? На сколько сложные и связанные данные должны выводиться?
Разработка на Yii: monoray.ru
Открытое бесплатное решение для создания сайтов по аренде/продаже недвижимости: Open Real Estate
Ответить