当前位置: 首页 > 工具软件 > CMSPAD > 使用案例 >

通用高速缓冲器:CMSPAD Cache

云啸
2023-12-01
PHP中的高速缓冲器,对高负载来的网站来说是一个非常需要的组件。其中最经典的使用案例就是用户会话(Session)的高速存取:如果使用默认的基于文件的会话句柄,负载量较大时会产生大量的IO操作,导致系统运行效率降低;而使用基于数据库的会话句柄,虽然性能会得以提高,但负载量大时,还是容易给数据库服务器造成负担。那如何才能调整会话句柄来使PHP最优化呢?
[quote]答案是:使用高速缓冲器![/quote]
市面上现有的PHP高速缓冲组件很多,常用的有 eAccelerator、XCache、Memcache(这个东东Robin经常提到)、APC等。
这就产生了一个问题:当网站访问量较小时,使用了一种缓冲组件,而访问量增大时可能因为性能问题转到另一个缓冲组件中,如果负载非常大时,估计还要自己写个缓冲组件来适应网站的需要。那么,开发人员需要不断更新网站程序以适应在不同的缓冲组件。
能不能使用一种简单的方法来使用缓冲组件呢?答案是肯定的,CMSPAD团队中有专门负责研发通用缓冲组件的子项目,叫做 CMSPAD Cache。下面看看 CMSPAD Cache 的一些基本使用情况:

1. 创建缓冲引擎:
[code]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扩展库来自行指定缓冲器。[/code]

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

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

3. 自定义缓冲组件适配器的开发:
[code]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){
// 检查缓冲数据是否存在
}
}[/code]
把上面的代码保存到 inc/cache/providers/MyCustomCache.php 文件中,通过[code]$cacheEngine = new CacheEngine('MyCustomCache');[/code] 即可使用。
下面的给出一段Memcache的实现类,一般比较复杂的缓冲组件都可以这么实现:
[code]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;
}
}[/code]
以上代码保存在 inc/cache/providers/memcache.php 中。
 类似资料: