我最近阅读了许多关于 PHP 应用程序可扩展性的文章。几乎我读过的所有文章都提到了缓存,所以我想出了在类属性中缓存数据库数据的想法,以防止过多的数据库查询。我想分享这个想法,所以我在博客上发布了它,只是让我的老师告诉我这是毫无意义和愚蠢的。除了用无意义和愚蠢这两个词之外,他无法真正解释为什么它很糟糕。有人可以在这里解释为什么这种缓存方法来帮助扩展 PHP 应用程序是不好的吗?
方法:
理论:
我认为最好有一个类属性(变量)来存储获取的数据库数据,以防止需要重复将返回相同数据的查询或查询。
如果你不明白,这是我博客中的一个例子:
我将把 Facebook 带入这个例子,只是为了简化解释。假设我们正在为社交网络重新编码用户类。
class FBuser
{
}
此类将包含的明显方法:
getStatusUpdates()
getAccountInfo()
getFriendIDs()
最初,这些方法都必须执行数据库查询,以获取所需的数据。但是使用缓存方法,我会定义一个类属性来存储缓存的数据,并且所有数据库查询都在一个方法中进行:
class FBuser
{
private $userCache = array();
private function getData( $dataToGet = '' )
{
//all of my db querying would happen here
}
}
但在同样的方法中,如果允许的话,我也会寻找缓存:
private function getData( $dataToGet = '' , $useCache = true )
{
//am I allowed to use cache?
if ( $useCache === true )
{
//does the appropriate data exist in cache?
if ( isset($this->userCache[ $dataToGet ]) )
{
return $this->userCache[ $dataToGet ];//return the cached data, and forget about the DB queries
}
}
//if we get here, caching was disabled or the required data has not yet been cached :(
//all of my db querying would happen here
//store the data that's just been fetched by the queries in the cache property
}
这样,我可以getData( 'the data I want' , true );
在我想从数据库中获取数据时调用,允许我在可能的地方和时间使用缓存的数据。
因此,如果我需要调用或多次调用getAccountInfo()
,此方法将阻止执行多个 DB 查询 = 有利于扩展(我认为)。getStatusUpdates()
getFriendIDs()