Как сократить кучу запросов при выполнении checkAccess?

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
delancer
Сообщения: 58
Зарегистрирован: 2011.03.11, 19:37
Откуда: Украина, Донецк

Как сократить кучу запросов при выполнении checkAccess?

Сообщение delancer »

Решил использовать в своём проекте AuthManager, выполнил всё по мануалу, всё впринципе работает, но когда я посмотрел в Profiler, то там я увидел около 50 запросов к БД касательно таблиц AuthManager'а
Это так и должно быть или я как-то не правильно использую AuthManager?
TM123
Сообщения: 608
Зарегистрирован: 2011.06.09, 11:18

Re: Как сократить кучу запросов при выполнении checkAccess?

Сообщение TM123 »

Настройте связи между таблицами (скорее всего они уже настроены, на память не помню) и включите загрузку связанных таблиц одним запросом с помощью with, тогда запрос к базе будет только один.

А вообще это привет от AR, только давайте не будем опять разводить срач по этому поводу.

В целом менеджер вычисления прав в фреймворке устроен не эффективно, точнее он работает как по книжке, обходя последовательно все узлы дерева распределения прав, вместо того, чтобы использовать метод последовательного приближения и манипулировать наборами.
delancer
Сообщения: 58
Зарегистрирован: 2011.03.11, 19:37
Откуда: Украина, Донецк

Re: Как сократить кучу запросов при выполнении checkAccess?

Сообщение delancer »

Я так думаю что придётся свой простенький для своих нужд велосипед написать =)
Не знаете, может уже есть какойто дополнение к yii по этому поводу?
esche
Сообщения: 1054
Зарегистрирован: 2010.11.24, 03:39

Re: Как сократить кучу запросов при выполнении checkAccess?

Сообщение esche »

TM123 писал(а):А вообще это привет от AR, только давайте не будем опять разводить срач по этому поводу.
Эм.. а здесь-то каким боком AR?
...менеджер вычисления прав в фреймворке устроен не эффективно, точнее он работает как по книжке..
Быть может оформите кодом.. да отправите разработчикам.. (они на такую "критику" лучше реагируют)
Это так и должно быть или я как-то не правильно использую AuthManager?
По мне - лучше PHPAuthManager пользовать.. Где-то видел про "красивую" обёртку ("велосипед"?), которая формирует массив правил для него на основе галочек (из БД). Что касается DBAuthManager-а - количество запросов можно уменьшить при помощи кэширования..
http://www.yiiframework.com/forum/index ... ac-caching

Ну и в yii-rights кэширование есть
...
TM123
Сообщения: 608
Зарегистрирован: 2011.06.09, 11:18

Re: Как сократить кучу запросов при выполнении checkAccess?

Сообщение TM123 »

м.. а здесь-то каким боком AR?
AR по умолчанию настроено чтоб не грузить связи, соответственно если у AR потом запрашивают не загруженную связь, то она ее начинает грузить по одному, вместо того, чтобы переспросить базу и загрузить данные с запрошенной связью.
Быть может оформите кодом.. да отправите разработчикам.. (они на такую "критику" лучше реагируют)
Я уже об этом писал, но имеющийся на форуме член команды разработчиков интереса не проявил, наверное их все устраивает. Я собственно не менял алгоритм в штатном механизме, иначе бы выложил код замены. Авторизация у меня идет точно также, но вот вычислять права тысяч пользователей к миллионам записей при наличии сотен ролей очень напряжно штатным методом, поэтому написал хранимку которая работает на основе данных штатной системы распределения прав, но на много быстрее за счет того, что в штатной системе количество запросов равно количеству узлов в дереве конкретного пользователя, в моей оптимизации количество запросов равно максимальной глубине дерева для конкретного пользователя.
Если интересен код функции, могу выложить она всего команд 10, писал на скорую руку, думаю есть масса способов ее оптимизировать. Результаты работы функции можно без проблем встроить в штатный механизм распределения прав.
esche
Сообщения: 1054
Зарегистрирован: 2010.11.24, 03:39

Re: Как сократить кучу запросов при выполнении checkAccess?

Сообщение esche »

TM123 писал(а):
м.. а здесь-то каким боком AR?
AR по умолчанию настроено чтоб не грузить связи, соответственно если у AR потом запрашивают не загруженную связь, то она ее начинает грузить по одному, вместо того, чтобы переспросить базу и загрузить данные с запрошенной связью.
Вроде речь о checkAccess? Или мы о разном?
TM123 писал(а):
Быть может оформите кодом.. да отправите разработчикам.. (они на такую "критику" лучше реагируют)
Я уже об этом писал, но имеющийся на форуме член команды разработчиков интереса не проявил
...
Если интересен код функции, могу выложить она всего команд 10, писал на скорую руку, думаю есть масса способов ее оптимизировать. Результаты работы функции можно без проблем встроить в штатный механизм распределения прав.
Конечно, выкладывайте.. в отдельной теме.. тем более там 10 команд.. Хотя у "хранимки" есть один небольшой минус - она "хранимка" :)
...
TM123
Сообщения: 608
Зарегистрирован: 2011.06.09, 11:18

Re: Как сократить кучу запросов при выполнении checkAccess?

Сообщение TM123 »

Вроде речь о checkAccess? Или мы о разном?
Ну да, а запрашивает она данные разве не через AR
Конечно, выкладывайте.. в отдельной теме.. тем более там 10 команд.. Хотя у "хранимки" есть один небольшой минус - она "хранимка"
Позже, любую хранимку можно переделать под PHP, только работать будет дольше.
Аватара пользователя
radamir
Сообщения: 142
Зарегистрирован: 2009.08.10, 08:02
Откуда: Новосибирск

Re: Как сократить кучу запросов при выполнении checkAccess?

Сообщение radamir »

TM123 писал(а):
Вроде речь о checkAccess? Или мы о разном?
Ну да, а запрашивает она данные разве не через AR
Посмотрел код CDbAuthManager и не нашел там AR, чистое DAO.
Ответить