我已经想出了一种缓存数据的方法(这样我就不必在之前已经获取相同的数据时重新访问数据库了),并且我通过在函数内部使用静态变量来实现:
function get_user( $id, $flush=false ){
static $cache;
if ( isset($cache[$id]) && !$flush )
return $cache[$id];
// Do something here to get user information
$user_info = $value;
// Return value after storing data into cache
return $cache[$id] = $user_info;
}
我不确定这是不是一个好主意,也可能是更好的缓存方式。这是一个好方法吗?如果没有,那么有哪些缺点?
答案 0 :(得分:2)
你的代码是一个很好的起点,因为它可以完成这项工作(或多或少 - array_key_exists
比isset
更好,而你没有初始化数组显式)。
随着您的代码发展并开始需要更多功能到您的缓存层,这种简单方法的缺点将开始变得明显。一系列问题将源于您的后备存储无法在get_user
函数之外访问的事实。将缓存实用程序打包到类中会更好,以便以后可以使用多个操作来修改后备存储。在最基本的形式中,这看起来像
class Cache {
private $store = array();
public function get($key, $flush = false) {
// implementation
}
}
进一步的改进是抽象您的后备存储(例如,进入ICacheBackingStore
接口),以便您可以动态地插入和配置缓存的后备存储(这里有很多选项 - 存储在数据库中,序列化文件,会话,memcached或类似的)。例如:
interface ICacheBackingStore {
function exists($key);
function get($key);
function set($key, $value);
function purge($key);
function getAllKeys();
}
class ArrayBackingStore implements ICacheBackingStore {
private $store = array();
public function exists($key) {
return array_key_exists($this->store, $key);
}
// etc
}
class Cache {
// you can now change/configure how the cache works through one line of code
private $store = new ArrayBackingStore;
public function set($key) {
return $store->get($key);
}
}
答案 1 :(得分:1)
看看here。有几种解决方案。缓存的类型取决于您需要缓存数据的时间。静态变量不在PHP进程之间共享,只能在很短的时间内缓存 - 跨越脚本执行生命周期。
答案 2 :(得分:0)
我没有为你测试任何东西,但我相信你可以让它发挥作用。但是一个好方法呢?据我所知,并非如此。
基本上,您有两种选择:一次运行脚本中的“缓存”或更长的缓存。
此代码仅适用于您当前的会话/文件/脚本,因此其范围有限。如果您需要获得某些数据,则可能只需要将某些模型保存到变量中。 您已经应该知道您需要哪些型号(或者您可以在运行脚本期间找到)并且您只需加载一次,多次访问。我没有看到需要一个特殊的“一个脚本/会话缓存”?
另一方面,如果您想要缓存更长时间,多个请求等,您应该使用memcached
或APC
之类的内容。它们具有易于使用的PHP方法,可帮助您存储太昂贵的东西,无法继续从数据库中读取
答案 3 :(得分:0)
您可以使用文件缓存或memcache,apc。 Zend有一个很好的缓存库叫Zend_Cache,它支持许多后端,如file,memcache,apc。因此,如果您使用它,您可以根据客户需求配置缓存,而无需重新编码。