这是在PHP中缓存数据的好方法吗?

时间:2012-04-03 11:31:20

标签: php caching

我已经想出了一种缓存数据的方法(这样我就不必在之前已经获取相同的数据时重新访问数据库了),并且我通过在函数内部使用静态变量来实现:

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;
}

我不确定这是不是一个好主意,也可能是更好的缓存方式。这是一个好方法吗?如果没有,那么有哪些缺点?

4 个答案:

答案 0 :(得分:2)

你的代码是一个很好的起点,因为它可以完成这项工作(或多或少 - array_key_existsisset更好,而你没有初始化数组显式)。

随着您的代码发展并开始需要更多功能到您的缓存层,这种简单方法的缺点将开始变得明显。一系列问题将源于您的后备存储无法在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)

我没有为你测试任何东西,但我相信你可以让它发挥作用。但是一个好方法呢?据我所知,并非如此。

基本上,您有两种选择:一次运行脚本中的“缓存”或更长的缓存。

此代码仅适用于您当前的会话/文件/脚本,因此其范围有限。如果您需要获得某些数据,则可能只需要将某些模型保存到变量中。 您已经应该知道您需要哪些型号(或者您可以在运行脚本期间找到)并且您只需加载一次,多次访问。我没有看到需要一个特殊的“一个脚本/会话缓存”?

另一方面,如果您想要缓存更长时间,多个请求等,您应该使用memcachedAPC之类的内容。它们具有易于使用的PHP方法,可帮助您存储太昂贵的东西,无法继续从数据库中读取

答案 3 :(得分:0)

您可以使用文件缓存或memcache,apc。 Zend有一个很好的缓存库叫Zend_Cache,它支持许多后端,如file,memcache,apc。因此,如果您使用它,您可以根据客户需求配置缓存,而无需重新编码。