большие массивы в сессиях @ DeForum.ru
DeДверь  
Логин:  
Пароль:  
  Автологин  
   
Разместить рекламу
Письмо админу
Правила | FAQ | *Поиск | Наша команда | Регистрация | Вход
 
 
 Страница 1 из 1 [ Сообщений: 7 ] 
*   Список форумов / Начинка и техника / Программирование для WWW » ответить » создать топик « | »
Автор Сообщение
indexphp
новый человек
0
Сообщения: 3
Зарегистрирован: 19.11.08
Заголовок сообщения: большие массивы в сессиях
Сообщение Добавлено: 19 Ноябрь 2008, 16:33:26 
Здравствуйте, помогите оценить нормальность идеи:)

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

мне вот тока интересно, не будет ли это всё глючить и тупить? как у механизма сессий со скоростью надежностью и тд. и какие вобще могут быть проблемы

незнаю чё и делать. если так можно то мне удобно и быстро дальше будет делать, и писанины меньше и про безопасность думать меньше
тока если это глючить потом будет то переделывать это всё страшный гемарой

посоветуйте как жить дальше :insane: )


файл сессии при 40 запросах на странице занимает 3-5 кб, в принципе больше и не понадобится
fStrange Муж.
соучастник
10
Сообщения: 900
Зарегистрирован: 25.07.05
Откуда: Ростов-на-Дону
Сообщение Добавлено: 19 Ноябрь 2008, 18:36:19 

indexphp писал(а):
мне вот тока интересно, не будет ли это всё глючить и тупить? как у механизма сессий со скоростью надежностью и тд. и какие вобще могут быть проблемы



если возникают такие вопросы, то может быть рано браться за *многопользовательский сайт со сложным разделением прав* ?

_________________
Записки мобильного веб разработчика
indexphp
новый человек
0
Сообщения: 3
Зарегистрирован: 19.11.08
Заголовок сообщения: Re: большие массивы в сессиях
Сообщение Добавлено: 19 Ноябрь 2008, 22:53:05 
я знал что вы так ответите))

конечно я не всё знаю, я и сам пхп не на 100% знаю, или не помню что-нибудь, но того что знаю мне достаточно чтобы сделать то что запланировал, вот только с сессиями этими непонятно)) мало ли что. у меня както раз на мастерхосте внезапно начало заклинивать скрипт при первой операции с сессией. 3 месяца заклинивало а потом само перестало, я ничего за это время не менял, это они чтото там меняли видимо. вот и знать бы что это и че еще может быть

нехотелось бы от идеи отказываться, тока от страха сессий избавиться

или отказаться, вдруг я по не знанию не учёл чего-то

вобщем мне совет на эту тему нужен а не моей профпригодности:)
jettero
новый человек
0
Сообщения: 230
Зарегистрирован: 14.09.03
Сообщение Добавлено: 19 Ноябрь 2008, 23:04:43 
indexphp,
если есть недоверие к сессиям, храните хешевый ключ сеанса в куках и все данные в БД, так и логичнее и понятнее имхо
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Заголовок сообщения: Re: большие массивы в сессиях
Сообщение Добавлено: 20 Ноябрь 2008, 09:23:58 
indexphp, мне кажется Вы еще рано беспокоитесь насчет оптимизации по скорости.
Видно что программа сложная, поэтому я бы делал упор на простоту и понятность.
А когда программа хорошо и понятно написана - ее легко оптимизировать в случае надобности.

Сессии можно хранить автоматически в базе, см: session_set_save_handler().
Это очень полезно при ведении лога ошибок: достаточно сохранить session_id и можно узнать состояние сессии на момент фатальной ошибки.

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

:)

_________________
Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
Konyukhov Муж.
новый человек
0
Сообщения: 166
Зарегистрирован: 10.12.06
Откуда: 89
Сообщение Добавлено: 20 Ноябрь 2008, 15:33:42 
Скорость отработки скрипта на сервере (даже при сложных и множественных запросах к БД) все равно достаточно высока. Не стоит бояться повторных проверок, тем более, разменивать их на еще более сложные извращения с ключами и сессиями. А лишняя проверка в наш век не повредит.

_________________
Лишь одно в моём кармане - беспонтовый пирожок
indexphp
новый человек
0
Сообщения: 3
Зарегистрирован: 19.11.08
Сообщение Добавлено: 20 Ноябрь 2008, 17:23:38 
спасибо, я вроде разобрался. мне недавно ещё где-то мелькнуло что сессии не приспособлены для больших количеств одновременно и что может начать тормозить и чего-то одновременно делать там нельзя. наверно лучше в бд хранить, +1 запрос при загрузке не так страшно

а от способа хранить готовые запросы заранее я уже не хочу отказываться потомучто просто всё получается))

вот если интересно

когда страница генерится, создается массив в сессии. вот например таблица из 4 выбиралок по 4 кнопки. риквест_дата() это всё запихивает в сессию и на выходе выдаёт массив для шаблона сразу
Код:
$keys = request_data('USER_SETTINGS_PRIVACY', array(
        'mod' => 'user_settings',
        'section' => 'access'), array(
        'wr' => array(0, 1, 2, 3),
        'ww' => array(0, 1, 2, 3),
        'pa' => array(0, 1, 2, 3),
        'fl' => array(0, 1, 2, 3),
        ));
        
$template
->assign_block_vars('user_settings_privacy', $keys); 


на странице получаются кнопки типа
Код:
<td id="wr0" class="wr" onclick="request('9eee5ce5bef024abda870dbb72778a6b', 'cell_check')">set wr 0</td>
Код:
function request(h, callback)
{   
   $.getJSON("/request.php", {h: h}, function(obj){eval(callback+'(obj)');});
}
реквест пхп получает тока ключ, вытаскивает из сессии по этому ключу массив с остальными параметрами и по ним всё делает и какието данные на странцу возращает что типа сделал тото и тото, в данном случае красит кнопки в соответствии с новым состоянием


а в сессии вот скока фигни ради этих 16 кнопок
Код:
self|s:1:"1";request_data|a:16:{s:32:"9eee5ce5bef024abda870dbb72778a6b";a:3:{s:3:"mod";s:13:"user_settings";s:7:"section";s:6:"access";s:2:"wr";i:0;}s:32:"febb6337222ce1d2b4d2925b73942cdf";a:3:{s:3:"mod";s:13:"user_settings";s:7:"section";s:6:"access";s:2:"wr";i:1;}s:32:"0b45476007ade20032d838221cc8021d";a:3:{s:3:"mod";s:13:"user_settings";s:7:"section";s:6:"access";s:2:"wr";i:2;}s:32:"809a0d9425e3f55107de2a20e6f79104";a:3:{s:3:"mod";s:13:"user_settings";s:7:"section";s:6:"access";s:2:"wr";i:3;}s:32:"6227062615e72b750fb0d7100e865aef";a:3:{s:3:"mod";s:13:"user_settings";s:7:"section";s:6:"access";s:2:"ww";i:0;}s:32:"d27285fe23395661b0be9b47bca2720c";a:3:{s:3:"mod";s:13:"user_settings";s:7:"section";s:6:"access";s:2:"ww";i:1;}s:32:"57c3e117a9de3ced37e686d16f1a52bd";a:3:{s:3:"mod";s:13:"user_settings";s:7:"section";s:6:"access";s:2:"ww";i:2;}s:32:"54c6cf4d32e7d750fd610b89111789f4";a:3:{s:3:"mod";s:13:"user_settings";s:7:"section";s:6:"access";s:2:"ww";i:3;}s:32:"7d2a634f00263f61045f6ccb693401b5";a:3:{s:3:"mod";s:13:"user_settings";s:7:"section";s:6:"access";s:2:"pa";i:0;}s:32:"62e49aaea7dbee83800be51998420ea7";a:3:{s:3:"mod";s:13:"user_settings";s:7:"section";s:6:"access";s:2:"pa";i:1;}s:32:"174431f1925eb86fa7309530425455f0";a:3:{s:3:"mod";s:13:"user_settings";s:7:"section";s:6:"access";s:2:"pa";i:2;}s:32:"fd37a04af539605466bde72031135e13";a:3:{s:3:"mod";s:13:"user_settings";s:7:"section";s:6:"access";s:2:"pa";i:3;}s:32:"1ae5a83d2e7993ed0f9cfc44b29f5ec1";a:3:{s:3:"mod";s:13:"user_settings";s:7:"section";s:6:"access";s:2:"fl";i:0;}s:32:"52aa0eefe6e69ea9188ae549a4aa71f4";a:3:{s:3:"mod";s:13:"user_settings";s:7:"section";s:6:"access";s:2:"fl";i:1;}s:32:"a90528be6b255c238ce4c1ae45a65dff";a:3:{s:3:"mod";s:13:"user_settings";s:7:"section";s:6:"access";s:2:"fl";i:2;}s:32:"921b603e70d0a743f54609c6f749be70";a:3:{s:3:"mod";s:13:"user_settings";s:7:"section";s:6:"access";s:2:"fl";i:3;}}



вот и нормально такое в сессиях хранить и обновлять при каждой загрузке?

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


в среднем вот как выглядит проверка
Код:
if ( $album['section'] == 'u' )
{
    $album_owner = t2a("SELECT * FROM users WHERE id='".$album['s_id']."'", 2);
    $owner_id = 'u'.$album_owner['id'];
    $user_relation = user_relation($album_owner['id']);
    $user_access = $album_owner['access'];
    if ( ( $user_access[0] >= $user_relation && $album['access'] >= $user_relation ) 
|| $album['s_id'] == $_SESSION['self'] ) $access = true;
 
+
Код:
function user_relation($user_id)
{
    global $self_friends, $user_friends;
    
    if 
( !$user_friends ) $user_friends = user_friends($user_id);

    $user_relation = 3; // нет связи
    if ( $_SESSION['self'] )
    {
        if ( $user_id == $_SESSION['self'] ) $user_relation = 0; // своя страница
        elseif ( is_array($user_friends) && in_array($_SESSION['self'], $user_friends) ) 
          $user_relation 
= 1; // страница друга
        elseif ( is_array($user_friends) && count(intersect($self_friends, $user_friends)) > 0 ) 
          $user_relation 
= 2;// страница друга друга
    }
    
    return $user_relation
;
}

function user_friends($user_id)
{
    $user_friends = t2a("SELECT user_a AS user_id FROM friends 
                        WHERE user_b='"
.$user_id."' 
                        UNION SELECT user_b AS user_id FROM friends
                        WHERE user_a='"
.$user_id."'", 1);
    return $user_friends['user_id'];
}
 


помоему слишком дофига чтоб повторно это проверять
*   Список форумов / Начинка и техника / Программирование для WWW « | » » ответить » создать топик
 Страница 1 из 1 [ Сообщений: 7 ] 
Показать сообщения за:   Поле сортировки  
Найти:
Перейти:  
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.
cron


ООО ДеФорум
При использовании материалов сайта ссылка на DeForum.ru — обязательна.
Проект Павла Батурина ©2001-2077; // Powered by phpBB © 2013 phpBB Group
Rambler's Top100