受论坛排版和格式限制,这篇帖子的格式不是很利于阅读,如果你看帖子觉得不那么舒服,可以看我发表在自己博客上的原文:http://www.ofcss.com/2014/04/25/use-aliyun-ace-cache-in-laravel4.html
===================以下是正文===================
之前我写了一篇
在 Laravel 4 框架中使用阿里云 OCS 缓存 的文章,介绍了如何通过扩展 Laravel 4 来支持需要 SASL 认证的阿里云 OCS 缓存服务。有网友问我,ACE 的缓存怎么在 Laravel 4 中使用。我本来觉得应该可以完全用相同的办法,后来自己尝试的时候才发现,ACE 的缓存差别非常大。所以再写一篇,介绍一下如何在 Laravel 框架中使用阿里云 ACE 的缓存服务。
如何扩展 Laravel 的缓存驱动
在 Laravel 4 中使用 Cache::get($key), Cache::put($key, $value, $minutes) 这样的代码时,实际上是访问 实例化的 Illuminate\Cache\Repository, 所以我们通过 Cache::extend 方法扩展自定义缓存驱动时,同样应该返回一个 Illuminate\Cache\Repository 对象。
Laravel 4 内置的 Memcached 缓存驱动,实现的流程是这样的:
// 指定缓存空间名称
'ace' => 'lblog-cache',
"autoload": {
"classmap": [
// autoload class
],
"psr-4": {
"Ace\\": "src/Ace"
}
},
创建 src/Ace/AceMemcachedStore.php 文件,代码如下:
<?php
namespace Ace;
use Illuminate\Cache\StoreInterface;
use Illuminate\Cache\TaggableStore;
class AceMemcachedStore extends TaggableStore implements StoreInterface {
protected $memcached;
protected $prefix;
public function __construct($space, $prefix = '') {
$this->memcached = \Alibaba::Cache($space);
$this->prefix = strlen($prefix) > 0 ? $prefix.':' : '';
}
/**
* Retrieve an item from the cache by key.
*
* @param string $key
* @return mixed
*/
public function get($key)
{
$value = $this->memcached->get($this->prefix.$key);
if(is_bool($value) && $value === false) {
return null;
}
return $value;
}
/**
* Store an item in the cache for a given number of minutes.
*
* @param string $key
* @param mixed $value
* @param int $minutes
* @return boolean
*/
public function put($key, $value, $minutes)
{
return $this->memcached->set($this->prefix.$key, $value, $minutes);
}
/**
* Increment the value of an item in the cache.
*
* @param string $key
* @param mixed $value
* @return boolean
*/
public function increment($key, $value = 1)
{
return $this->memcached->increment($this->prefix.$key, $value);
}
/**
* Decrement the value of an item in the cache.
*
* @param string $key
* @param mixed $value
* @return boolean
*/
public function decrement($key, $value = 1)
{
return $this->memcached->decrement($this->prefix.$key, $value);
}
/**
* Store an item in the cache indefinitely.
*
* @param string $key
* @param mixed $value
* @return boolean
*/
public function forever($key, $value)
{
return $this->memcached->set($key, $value, 0);
}
/**
* Remove an item from the cache.
*
* @param string $key
* @return boolean
*/
public function forget($key)
{
return $this->memcached->delete($this->prefix.$key);
}
/**
* Remove all items from the cache.
*
* @return void
*/
public function flush()
{
//$this->memcached->flush();
return false;
}
public function getMemcached()
{
return $this->memcached;
}
/**
* Get the cache key prefix.
*
* @return string
*/
public function getPrefix()
{
return $this->prefix;
}
}
这段代码比较简单,不过要特别注意一下 get($key) 方法的实现。标准 memcached 以及 ACE 的缓存对象的 get 方法都是key有效时返回对应的缓存值,否则返回false,而在 Laravel 4 中,是通过检测 get 方法返回的是否 null 来做判断,所以这里需要处理一下,返回缓存值或者null。
// 扩展名为 ace 的缓存驱动
Cache::extend('ace', function($app)
{
// 从 app/config/cache.php 文件中读取 "ace" 的值
$space = $app['config']['cache.ace'];
// 从 app/config/cache.php 文件中读取 "prefix" 的值
$prefix = $app['config']['cache.prefix'];
// 创建 \Ace\AceMemcachedStore 对象
$store = new \Ace\AceMemcachedStore($space, $prefix);
// 创建并返回 \Illuminate\Cache\Repository 对象
return new \Illuminate\Cache\Repository($store);
});
// 添加缓存,有效时间10分钟
Cache::put('my_key', 'my value', 10);
// 读取缓存
Cache::get('my_key')
// 判断缓存是否存在
Cache::has('my_key')
// 数据查询缓存
$users = DB::table('users')->remember(10)->get();
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。