欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

通用高速缓冲器:CMSPAD Cache 博客分类: 项目: CMSPAD CachePHPZendFlashIDEA 

程序员文章站 2024-03-20 08:06:46
...
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 中。