PHP сессия против БД Поиск - PullRequest
1 голос
/ 26 июля 2011

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

В моем случае есть «пользователи», которые имеют доступ к «группам», которые состоят из «разделов». Каждый раздел может иметь различный уровень разрешений в зависимости от того, как настроен пользователь. Так что я могу быть «администратором» для раздела, в то время как мой коллега «базовый».

После входа в систему пользователь выбирает группу, которой он хочет управлять / просматривать. Мой первоначальный план заключался в поиске информации о пользователе / ​​группе / разделе / ​​разрешении и сохранении в массиве в сеансе, как ...

$_SESSION[group_id][sectioin_id]['permission'] = 7; // 1+2+4 (R+W+X)

Затем, когда они переходят на страницу, я могу посмотреть, в какую группу они входят, посмотреть, в каком разделе они находятся, и отобразить соответствующую информацию, основываясь на их разрешениях.

В качестве альтернативы, я мог бы создать сценарий поиска в БД, чтобы проверить эту информацию, но он должен будет просмотреть несколько объединенных таблиц и проанализировать результаты для КАЖДОЙ СТРАНИЦЫ. Это кажется мне неэффективным, но из того, что я читаю о том, как сессии пишутся для каждой страницы, это может быть не так.

Спасибо за любые идеи / предложения.

// ---- больше информации о возможном размере сеанса

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

$_SESSION[1][1]['permission'] = 7;
$_SESSION[1][1]['type'] = 'paid';
$_SESSION[1][1]['expires'] = '2011-08-01';
$_SESSION[1][2]['permission'] = 7;
$_SESSION[1][2]['type'] = 'free';
$_SESSION[1][3]['permission'] = 7;
$_SESSION[1][3]['type'] = 'paid';
$_SESSION[1][3]['expires'] = '2011-08-01';
$_SESSION[1][4]['permission'] = 7;
$_SESSION[1][4]['type'] = 'paid';
$_SESSION[1][4]['expires'] = '2011-08-01';
$_SESSION[1][5]['permission'] = 7;
$_SESSION[1][5]['type'] = 'free';

Это может быть в случае, когда 1,3,4 раздела находятся на платном уровне, а 2,5 - в бесплатной версии. Это слишком много материала для сеанса, чтобы отслеживать за логин?

Ответы [ 2 ]

0 голосов
/ 26 июля 2011

Я бы назвал это довольно уродливым хаком.То, что вы пытаетесь сделать, - это создать большой объект и удерживать его в течение нескольких исполнений интерпретатора php.Вставка объекта в данные сеанса - это умный, но «неправильный» способ сделать это.

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

IMO, вы должны сделать дорогой поиск во время входа в систему (в любом случае, вероятно, нет никакой другой тяжелой работы), а затем сохранить маску разрешения пользователя в своем сеансе, например_SESSION ["разрешение"] = 7

Если вы действительно хотите сохранить поставщика разрешений для нескольких взаимодействий, изучите сериализацию объектов;вы можете хранить объекты в вашей базе данных по-настоящему, не злоупотребляя $ _SESSION.

0 голосов
/ 26 июля 2011

В любом случае будет работать.На что следует обратить внимание:

  • Насколько чувствителен доступ к системе?Если вы используете сеансовый подход, и пользователь отключается или удаляется разрешение, он будет иметь доступ до следующего входа в систему.
  • Размер данных сеанса должен быть ограничен.Если у вас есть миллион групп / разделов / разрешений, данные вашего сеанса будут достаточно большими и медленными для обработки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...