`
yipsilon
  • 浏览: 242241 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

通用高速缓冲器:CMSPAD Cache

阅读更多
PHP中的高速缓冲器,对高负载来的网站来说是一个非常需要的组件。其中最经典的使用案例就是用户会话(Session)的高速存取:如果使用默认的基于文件的会话句柄,负载量较大时会产生大量的IO操作,导致系统运行效率降低;而使用基于数据库的会话句柄,虽然性能会得以提高,但负载量大时,还是容易给数据库服务器造成负担。那如何才能调整会话句柄来使PHP最优化呢?
引用
答案是:使用高速缓冲器!

市面上现有的PHP高速缓冲组件很多,常用的有 eAccelerator、XCache、Memcache(这个东东Robin经常提到)、APC等。
这就产生了一个问题:当网站访问量较小时,使用了一种缓冲组件,而访问量增大时可能因为性能问题转到另一个缓冲组件中,如果负载非常大时,估计还要自己写个缓冲组件来适应网站的需要。那么,开发人员需要不断更新网站程序以适应在不同的缓冲组件。
能不能使用一种简单的方法来使用缓冲组件呢?答案是肯定的,CMSPAD团队中有专门负责研发通用缓冲组件的子项目,叫做 CMSPAD Cache。下面看看 CMSPAD Cache 的一些基本使用情况:

1. 创建缓冲引擎:
import('cache.CacheEngine');
$cacheEngine = new CacheEngine('eaccelerator'); // 使用eAccelerator来作为默认的缓冲器。
$cacheEngine = new CacheEngine('xcache'); // 使用XCache来作为默认的缓冲器。
$cacheEngine = new CacheEngine('memcache'); // 使用Memcache来作为默认的缓冲器。
$cacheEngine = new CacheEngine('apc'); // 使用Alternative PHP Cache来作为默认的缓冲器。
$cacheEngine = new CacheEngine('zendplatform'); // 使用Zend Platform来作为默认的缓冲器。
$cacheEngine = new CacheEngine('filesystem'); // 使用本地文件系统来作为默认的缓冲器。
$cacheEngine = new CacheEngine('database'); // 使用CMSPAD内置的数据库组件来作为默认的缓冲器。

//除此之外,您还可以不指定默认缓冲器,让系统自己来选择
$cacheEngine = new CacheEngine(); // 系统根据已载入的PHP扩展库来自行指定缓冲器。


2. 使用缓冲引擎:
$cacheEngine->set('name', 'value'); // 设置永不过期的数据.
$cacheEngine->set('name', 'value', 60); // 设置过期时间为60秒的数据.
$cacheEngine->get('name'); // 获取名称为name的值,如果该值不存在或已过期,则返回NULL。
$cacheEngine->del('name'); // 从缓冲中删除名称为 name 的数据。
$cacheEngine->has('name'); // 检查名称为 name 的数据是否存在,如果不存在或已过期,则返回 false.


使用起来还是相当简单的吧,下面就有个问题了,如果某些牛人或组织自己开发了一个缓冲组件,那怎么才能做CMSPAD Cache的适配器呢?

3. 自定义缓冲组件适配器的开发:
import('cache.CacheProvider');
class cmspad_cache_MyCustomCache extends CacheProvider{
  public function set($key, $value, $ttl = 0){
    // 添加、更新缓冲数据
  }
  public function get($key){
    // 获取缓冲数据
  }
  public function del($key){
    // 删除缓冲数据
  }
  public function has($key){
    // 检查缓冲数据是否存在
  }
}

把上面的代码保存到 inc/cache/providers/MyCustomCache.php 文件中,通过
$cacheEngine = new CacheEngine('MyCustomCache');
即可使用。
下面的给出一段Memcache的实现类,一般比较复杂的缓冲组件都可以这么实现:
class cmspad_cache_memcache extends CacheProvider{
  public function __construct($config = array()){
    if(isset($config['HOST'])){
      $host = $config['HOST'];
    }else{
      $host = 'localhost';
    }

    if(isset($config['PORT'])){
      $port = intval($config['PORT']);
    }else{
      $port = false;
    }

    if(isset($config['TIMEOUT'])){
      $timeout = intval($config['TIMEOUT']);
    }else{
      $timeout = false;
    }

    if($port){
      if($timeout){
        memcache_connect($host, $port, $timeout);
      }else{
        memcache_connect($host, $port);
      }
    }else{
      memcache_connect($host);
    }
  }

  public function __destruct() {
    memcache_close();
  }

  public function set($name, $value, $ttl = 0){
    return memcache_set($name, $value, 0, $ttl);
  }

  public function get($name){
    return memcache_get($name);
  }

  public function del($name){
    return memcache_delete($name);
  }

  public function has($name){
    return memcache_get($name) !== FALSE;
  }
}

以上代码保存在 inc/cache/providers/memcache.php 中。
分享到:
评论
2 楼 dival 2008-05-30  
引用
[url][/url][flash=200,200][/flash][/i][b][/b][i][u][/u]
1 楼 dival 2008-05-30  
               

相关推荐

Global site tag (gtag.js) - Google Analytics