通用高速缓冲器: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. 创建缓冲引擎:
2. 使用缓冲引擎:
使用起来还是相当简单的吧,下面就有个问题了,如果某些牛人或组织自己开发了一个缓冲组件,那怎么才能做CMSPAD Cache的适配器呢?
3. 自定义缓冲组件适配器的开发:
把上面的代码保存到 inc/cache/providers/MyCustomCache.php 文件中,通过
下面的给出一段Memcache的实现类,一般比较复杂的缓冲组件都可以这么实现:
以上代码保存在 inc/cache/providers/memcache.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 中。