Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存


Posted in PHP onFebruary 10, 2015

Laravel 是我最近用得非常多而且越用就越喜欢的一款PHP框架,由于没有向下兼容的历史包袱,完全面向对象的风格,借助 Facades 优雅的IoC Container 实现,采用 Composer 进行包管理,可以方便地引入和使用开源社区里的优秀组件……总而言之,这是一款真正让你能够 "code happy" 的“巨匠级PHP开发框架”。

在尝试把自己的 Laravel App 部署到阿里云的时候,遇到了一个问题: Laravel 支持 Memcached 缓存,阿里云的 OCS 也是基于 Memcached 的缓存,但是阿里云 OCS 采用 SASL 认证,而 Laravel 的 Memcached 驱动并没有实现相关的方法,即使在服务器上编译PHP Memcached 的时候启用了 SASL 认证选项,也没办法设定用户名和密码。

在 Laravel 中,解决这样的问题,有很多方法。我选择了最快捷最省事的方法:扩展 Laravel 自己的 Memcached 驱动,通过 Memcached 对象自身的 setSaslAuthData 方法,指定用户名和密码。

背景知识

这是利用了 Illuminate\Cache\CacheManager 的 extend 方法(继承自Illuminate\Support\Manager)。先看一下这个方法的定义:

/**

 * Register a custom driver creator Closure.

 *

 * @param  string   $driver

 * @param  Closure  $callback

 * @return \Illuminate\Support\Manager|static

 */

public function extend($driver, Closure $callback){}

这个方法接收两个参数,第一个是代表你自定义的驱动名称的字符串,第二个是一个闭包回调函数,这个函数就是当调用你的自定义驱动时要执行的方法。通过阅读 Illuminate\Cache\CacheManager 的源代码,我们可以发现创建驱动的函数要返回一个 Illuminate\Cache\Repository 的实例,Illuminate\Cache\Repository 的构造函数如下:
/**

 * Create a new cache repository instance.

 *

 * @param  \Illuminate\Cache\StoreInterface  $store

 */

public function __construct(StoreInterface $store)

{

    $this->store = $store;

}

它需要一个实现了 Illuminate\Cache\StoreInterface 接口的对象,这个接口中定义了 Cache 对象能够执行的方法。由于我计划是扩展原有的 Memcached 缓存驱动,在 Illuminate\Cache\CacheManager 的源代码中,可以看到 Laravel 是这样创建 Memcached 驱动的:

/**

 * Create an instance of the Memcached cache driver.

 *

 * @return \Illuminate\Cache\MemcachedStore

 */

protected function createMemcachedDriver()

{

    $servers = $this->app['config']['cache.memcached'];

 

    $memcached = $this->app['memcached.connector']->connect($servers);

 

    return $this->repository(new MemcachedStore($memcached, $this->getPrefix()));

}

它先从配置文件中读取你定义的 Memcached 服务器,然后创建一个 Memcached 对象(通过 Illuminate\Cache\MemcachedConnector 实现,实际上就是创建一个标准的 Memcached 对象,然后调用 Memcached 的 addServer 方法来指定要连接的服务器,然后返回实例化的 Memcached 对象。)

扩展自己的缓存驱动

了解了上述的背景知识之后,就可以来扩展自己的缓存驱动了。思路如下:

1.在 app/config/cache.php 文件中,增加三个配置项,用来设定“是否使用sasl认证”,“sasl认证账户”,“sasl认证密码”。
2.在 bootstrap/start.php 文件中,调用 Cache::extend 方法扩展驱动。
3.在 app/config/cache.php 文件中,修改 driver 配置项,指定系统使用自己扩展的驱动。

增加配置项

首先,打开 app/config/cache.php 文件,找到:

'memcached' => array(

        array('host' => '127.0.0.1', 'port' => 11211, 'weight' => 100),

    ),

修改为:
'memcached' => array(

        array('host' => '127.0.0.1', 'port' => 11211, 'weight' => 100),

    ),

 

    'memcached_sasl' => 'true', // 启用sasl认证

    'memcached_user' => 'your ocs username', // 你的 OCS 用户名

    'memcached_pass' => 'your ocs password', // 你的 OCS 密码

扩展驱动

然后,打开 bootstrap/start.php 文件,在最后一行 return $app; 前面插入代码:

// 基于系统自己的 Memcached 缓存驱动,扩展一个名为 saslMemcached 的缓存驱动

Cache::extend('saslMemcached', function($app){

    // 从配置文件中读取 Memcached 服务器配置

    $servers = $app['config']['cache.memcached'];

     

    // 利用 Illuminate\Cache\MemcachedConnector 类来创建新的 Memcached 对象

    $memcached = $app['memcached.connector']->connect($servers);

 

    // 如果服务器上的 PHP Memcached 扩展支持 SASL 认证

    if(ini_get('memcached.use_sasl')){

         

        // 从配置文件中读取 sasl 认证用户名

        $user = $app['config']['cache.memcached_user'];

 

        // 从配置文件中读取 sasl 认证密码

        $pass = $app['config']['cache.memcached_pass'];

         

        // 禁用 Memcached 压缩 (阿里云的文档里这样做了……)

        $memcached->setOption(Memcached::OPT_COMPRESSION, false);

 

        // 指定 Memcached 使用 binary protocol ( sasl 认证要求 )

        $memcached->setOption(Memcached::OPT_BINARY_PROTOCOL, true);

 

        // 指定用于 sasl 认证的账号密码

        $memcached->setSaslAuthData($user, $pass);

    }

 

    // 从配置文件中读取缓存前缀

    $prefix = $app['config']['cache.prefix'];

 

    // 创建 MemcachedStore 对象

    $store = new \Illuminate\Cache\MemcachedStore($memcached, $prefix);

     

    // 创建 Repository 对象,并返回

    return new \Illuminate\Cache\Repository($store);

});

修改配置,使用自己扩展的缓存驱动

打开 app/config/cache.php 文件,找到:

"driver" => "file", // 默认是使用文件缓存

修改为:
"driver" => "saslMemcached", // 刚才扩展实现的驱动名称

现在,你就可以在你的 阿里云 ECS 服务器上, 让 Laravel 使用 阿里云 OCS 缓存服务了。(前提是你的 PHP 支持 Memcached 扩展,并且启用了 SASL 认证,参考:http://help.aliyun.com/doc/view/13553932.html
PHP 相关文章推荐
PHP脚本数据库功能详解(上)
Oct 09 PHP
php 设计模式之 单例模式
Dec 19 PHP
PHP array_multisort()函数的使用札记
Jul 03 PHP
PHP函数学习之PHP函数点评
Jul 05 PHP
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
Jul 03 PHP
PHP清除字符串中所有无用标签的方法
Dec 01 PHP
php中文验证码实现方法
Jun 18 PHP
PHP url的pathinfo模式加载不同控制器的简单实现
Aug 12 PHP
php实现XML和数组的相互转化功能示例
Feb 08 PHP
Yii2实现自定义独立验证器的方法
May 05 PHP
Yii 2中的load()和save()示例详解
Aug 03 PHP
快速解决PHP调用Word组件DCOM权限的问题
Dec 27 PHP
PHP框架Laravel的小技巧两则
Feb 10 #PHP
Laravel模板引擎Blade中section的一些标签的区别介绍
Feb 10 #PHP
Laravel 5.0 发布 新版本特性详解
Feb 10 #PHP
PHP转盘抽奖接口实例
Feb 09 #PHP
PHP积分兑换接口实例
Feb 09 #PHP
PHP答题类应用接口实例
Feb 09 #PHP
自己写的php中文截取函数mb_strlen和mb_substr
Feb 09 #PHP
You might like
php实现的简单美国商品税计算函数
2015/07/13 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
2018/08/17 PHP
js防止表单重复提交实现代码
2012/09/05 Javascript
js/jquery解析json和数组格式的方法详解
2014/01/09 Javascript
JavaScript定时器和优化的取消定时器方法
2015/07/03 Javascript
使用jquery动态加载Js文件和Css文件
2015/10/24 Javascript
javascript入门之数组[新手必看]
2016/11/21 Javascript
详解Python中logging日志模块在多进程环境下的使用
2016/12/26 Javascript
原生js实现商品放大镜效果
2017/01/12 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
2017/03/02 Javascript
Vue2.0表单校验组件vee-validate的使用详解
2017/05/02 Javascript
详解使用Node.js 将txt文件转为Excel文件
2017/07/05 Javascript
Vue 表单控件绑定的实现示例
2017/08/11 Javascript
详解vue中使用express+fetch获取本地json文件
2017/10/10 Javascript
javascript按钮禁用和启用的效果实例代码
2017/10/29 Javascript
初探js和简单隐藏效果的实例
2017/11/23 Javascript
详解vuex中mapState,mapGetters,mapMutations,mapActions的作用
2018/04/13 Javascript
vue2.0页面前进刷新回退不刷新的实现方法
2018/07/31 Javascript
JavaScript canvas仿代码流瀑布
2020/02/10 Javascript
解决vue与node模版引擎的渲染标记{{}}(双花括号)冲突问题
2020/09/11 Javascript
Python时间模块datetime、time、calendar的使用方法
2016/01/13 Python
Python实现PS图像调整之对比度调整功能示例
2018/01/26 Python
Python实现的径向基(RBF)神经网络示例
2018/02/06 Python
Python编程在flask中模拟进行Restful的CRUD操作
2018/12/28 Python
Python实现的统计文章单词次数功能示例
2019/07/08 Python
python传到前端的数据,双引号被转义的问题
2020/04/03 Python
python 无损批量压缩图片(支持保留图片信息)的示例
2020/09/22 Python
英国赛车、汽车改装和摩托车零件购物网站:Demon Tweeks
2018/10/29 全球购物
什么是URL
2015/12/13 面试题
介绍一下Linux中的链接
2016/06/05 面试题
在校学生职业规划范文
2014/01/08 职场文书
长安大学毕业生自我鉴定
2014/01/17 职场文书
护理中职生求职信范文
2014/02/24 职场文书
2014年学校后勤工作总结
2014/12/06 职场文书
泰坦尼克号观后感
2015/06/04 职场文书
pyqt5打包成exe可执行文件的方法
2021/05/14 Python