Страница 1 из 1

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

Добавлено: 2012.01.31, 12:23
delancer
Решил использовать в своём проекте AuthManager, выполнил всё по мануалу, всё впринципе работает, но когда я посмотрел в Profiler, то там я увидел около 50 запросов к БД касательно таблиц AuthManager'а
Это так и должно быть или я как-то не правильно использую AuthManager?

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

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

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

В целом менеджер вычисления прав в фреймворке устроен не эффективно, точнее он работает как по книжке, обходя последовательно все узлы дерева распределения прав, вместо того, чтобы использовать метод последовательного приближения и манипулировать наборами.

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

Добавлено: 2012.01.31, 14:16
delancer
Я так думаю что придётся свой простенький для своих нужд велосипед написать =)
Не знаете, может уже есть какойто дополнение к yii по этому поводу?

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

Добавлено: 2012.01.31, 18:28
Nafania
yii-rights есть

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

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

Ну и в yii-rights кэширование есть

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

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

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

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

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

Добавлено: 2012.02.01, 11:47
TM123
Вроде речь о checkAccess? Или мы о разном?
Ну да, а запрашивает она данные разве не через AR
Конечно, выкладывайте.. в отдельной теме.. тем более там 10 команд.. Хотя у "хранимки" есть один небольшой минус - она "хранимка"
Позже, любую хранимку можно переделать под PHP, только работать будет дольше.

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

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