2011-01-28 51 views
0

我现在有一个问题,当用户登录时,他们的用户对象存储在会话变量中,比每次进行数据库调用都快。我遇到的问题是,如果某些更新(比如它们的点数)有更新,我无法修改该会话变量,我只能更新表中的行。PHP会话变量 - >访问另一个唯一标识

有没有什么办法让PHP访问该会话变量,因为它是唯一的标识符,而不是从他们的cookie中读取?或者,最好是检查数据库中的某个标志,并且如果标志已设置,则更新所有信息?

+1

我不太清楚你的意思是“在他们的最后”。你的意思是说,如果某些用户数据异步更改(而不是响应用户的操作),那么你想更新数据,但不能写入会话? – 2011-01-28 18:34:40

回答

2

你需要从一个集中的斯道阅读ge(与会话相反)。如果可以的话,你应该避免数据库调用。使用高速缓存和插入更新缓存:

  • 用户1个检查缓存用户2的得分
    • 它是不存在的,因此呼叫被转发到DB
    • 比分仍然是空的/ 0,以便在高速缓存中的条目是这样写的:键:“目标-2”(唯一标识符是容易弄清楚),值:“0”
  • 用户2个进球得分
    • 用户-2得分是通过检查所述高速缓存(它是空的),然后检查db计算(这是空的/ 0):0是当前得分
    • 新得分为0 + 1 = 1
    • 新得分被插入到数据库(持久性),与键“目标-2”保存与该高速缓存中的关键“目标-2”和值“1”

然后我们就大功告成了,让我们再次尝试循环:

  • 用户1个检查缓存用户2的成绩,发现“1”
  • 用户1再次检查缓存是否为用户2的得分,找到“1”

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

缓存一些可能的引擎是:

如果你在共享主机,或无法获得PHP具有良好的引擎缓存编译,writing to files可以完成这项工作。

1

我的建议是创建自定义对象,该对象将保存例如5分钟的数据并且将被重新加载。只需创建一个对象,它将从会话中加载数据,如果加载的对象超过五分钟,只是重新加载数据。

  1. 负载对象对象
  2. 检查变量,如果(时间()),其超过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; 
    } 
}