Переменные сессии PHP -> Доступ к другому уникальному идентификатору - PullRequest
0 голосов
/ 28 января 2011

У меня сейчас проблема: когда пользователь входит в систему, его пользовательский объект сохраняется в переменной сеанса, так что это происходит быстрее, чем каждый раз выполнять вызов базы данных.У меня проблема в том, что если что-то обновляется на их конце (например, количество точек, которые у них есть), я не могу изменить эту переменную сеанса, я могу только обновить их строку в таблице.Любой способ для php получить доступ к этой переменной сеанса, учитывая ее уникальный идентификатор вместо чтения из их куки?Или было бы лучше проверить какой-либо флаг в базе данных, и если флаг установлен, обновить всю информацию?

Ответы [ 2 ]

2 голосов
/ 28 января 2011

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

  • пользователь 1 проверяет кэш для оценки пользователя 2
    • он не существует, поэтому вызов переадресуется на db
    • счет по-прежнему пуст / 0, поэтому запись в кеше записывается так: ключ: "goal-2" (уникальный идентификатор, который легко определить), значение: "0"
  • пользователь 2 забивает гол
    • оценка для user-2 рассчитывается путем проверки кэша (который пуст) и затем проверки БД (который пуст / 0): 0 - текущий счет
    • новый счет 0 + 1 = 1
    • новый счет добавляется в базу данных (для сохранения), кэш с ключом «целей-2» сохраняется с ключом «целей-2» и значение "1"

тогда мы закончили, давайте попробуем цикл снова:

  • пользователь 1 проверяет кеш для пользователя 2 , находит "1"
  • пользователь 1 снова проверяет кэш для оценки пользователя 2 , находит "1"

Мы сохраняем очень много вызовов базы данных здесь.

Некоторые возможные движки для кеширования:

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

1 голос
/ 28 января 2011

Я предлагаю создать пользовательский объект, который будет хранить данные, например, 5 минут, и затем он будет перезагружен. Просто создайте объект, который будет загружать ваши данные из сессии, если загруженный объект старше пяти минут, просто перезагрузите данные.

  1. Загрузить объект
  2. Проверить переменную в объекте, если (time ()) старше 5 минут (или любое другое время) перезагрузить данные
  3. Если данные повторно загружают переменную в объекте на новое время и сохраняют ее в сеансе

Я думаю, что это может решить вашу проблему

class MySession
{
    public $Duration = 0;
    public $Loaded = 0;
    public static function Load()
    {
        $obj = null;
        if(isset($_SESSION["my_session"]))
        {
            $obj = deserialize($_SESSION["my_session"]);            
            if((time()-$obj->Loaded)>$Duaration)
                    $obj = self::LoadObject();
        }
        else { $obj = self::LoadObject(); }
        $obj->Save();
        return $obj;
    }
    public function Save()
    {
        $_SESSION["my_session"] = serialize($this);
    }
    public static function LoadObject()
    {
        $obj = new MySession();
        $obj->Loaded = time();
        //logic for updating data
        return $obj;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...