我正在重写旧的php框架。目前,导航,路由和授权是基于每个页面请求上加载的配置文件完成的。
我已将配置文件更改为数据库。根据用户级别和授权,每个用户加载的页面数会有所不同。 但仍然在每个页面请求执行多个数据库查询时,将加载所有条目并处理导航,路由和授权。 我想这可以被缓存'因为大多数时候这些功能的结果对于特定用户来说是相同的。
最好的方法是什么?
缓存对象中函数的结果并将它们存储在会话中? 为每个用户生成包含对象的临时文件?使用memcached将它们存储在内存中? 或者保持这种方式并对每个页面请求进行处理?
编辑: 该框架面向OOP,并且已经在会话对象中缓存了诸如username / userlevel之类的内容。
答案 0 :(得分:1)
不知道你的框架是如何工作的,无论是一堆函数还是面向OOP,所以要指明你的确切方向并不容易,但这里有一种方法可以避免执行重复的查询在单个请求期间返回相同的数据。
假设您在应用中有多个位置需要记录用户的信息,为了简单起见,我假设您的用户是对象,并且还使用类执行auth:)
class Auth
{
private static $logged_user = false;
static function getLoggedUser()
{
if (self::$logged_user === false) {
self::$logged_user = do_some_magic_();
}
return self::$logged_user;
}
}
在上面的示例中,调用Auth::getLoggedUser()
将检查私有属性$logged_user
是否为默认false
,如果是,则它将执行身份验证(例如,使用会话中的数据或其他),将它存储在该私有类属性中,每次连续调用Auth::getLoggedUser()
将只返回已经获取的用户的对象。您也可以在登录时设置logged_user
。
以类似的方式,您可以“缓存”复杂操作的各种其他结果,并节省时间/内存/查询。但请注意,如果在应用程序请求期间生成的对象确实发生了更改,则可能会产生不良结果,因此请注意:)