我现在遇到一个问题,当用户登录时,他们的用户对象存储在会话变量中,比每次调用数据库更快。我遇到的问题是如果有什么东西更新(比如他们拥有的点数),我无法修改那个会话变量,我只能更新他们在表中的行。
有没有办法让php访问该会话变量给定它的唯一标识符而不是从他们的cookie中读取?或者更好的方法是检查数据库中的某个标志,如果设置了标志,请更新所有信息吗?
答案 0 :(得分:2)
您需要从集中存储中读取它(与会话相反)。如果可以,您应该避免数据库调用。使用缓存并更新插入缓存:
然后我们完成了,让我们再次尝试循环:
我们在这里保存了很多数据库调用。
一些可能的缓存引擎是:
如果您正在使用共享主机,或者无法使用良好的缓存引擎编译PHP,writing to files可以完成此任务。
答案 1 :(得分:1)
我建议创建自定义对象,该对象将保存数据,例如5分钟,然后重新加载。只需创建将从会话加载数据的对象,如果加载的对象超过五分钟就重新加载数据。
我认为这可以解决您的问题
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;
}
}