PHP会话变量 - >访问另一个唯一标识符

时间:2011-01-28 18:31:22

标签: php session variables uniqueidentifier

我现在遇到一个问题,当用户登录时,他们的用户对象存储在会话变量中,比每次调用数据库更快。我遇到的问题是如果有什么东西更新(比如他们拥有的点数),我无法修改那个会话变量,我只能更新他们在表中的行。

有没有办法让php访问该会话变量给定它的唯一标识符而不是从他们的cookie中读取?或者更好的方法是检查数据库中的某个标志,如果设置了标志,请更新所有信息吗?

2 个答案:

答案 0 :(得分:2)

您需要从集中存储中读取它(与会话相反)。如果可以,您应该避免数据库调用。使用缓存并更新插入缓存:

  • 用户1 检查用户2 分数的缓存
    • 它不存在,因此呼叫转发到db
    • 得分仍为空/ 0所以缓存中的条目写成如下:key:“goals-2”(唯一标识符很容易弄清楚),值: “0”
  • 用户2 获得了一个目标
    • user-2 的分数是通过检查缓存(为空)然后检查db(为空/ 0)来计算的:0是当前分数
    • 新分数为0 + 1 = 1
    • 新分数被插入数据库(用于持久性),带有“goal-2”键的缓存将使用“goals-2”键保存,值“1”

然后我们完成了,让我们再次尝试循环:

  • 用户1 检查用户2 分数的缓存,找到“1”
  • 用户1 再次检查缓存中用户2 的分数,找到“1”

我们在这里保存了很多数据库调用。

一些可能的缓存引擎是:

如果您正在使用共享主机,或者无法使用良好的缓存引擎编译PHP,writing to files可以完成此任务。

答案 1 :(得分:1)

我建议创建自定义对象,该对象将保存数据,例如5分钟,然后重新加载。只需创建将从会话加载数据的对象,如果加载的对象超过五分钟就重新加载数据。

  1. 加载对象
  2. 检查对象中的变量if(time())是否超过5分钟(或任何自定义时间)重新加载数据
  3. 如果数据将对象中的update变量重新加载到新时间并将其保存到会话
  4. 我认为这可以解决您的问题

    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;
        }
    }