使用Illuminate\Cache实现memcached缓存

广告位招租
扫码页面底部二维码联系

在新项目里面,打算写一个服务端的缓存机制【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】,像用户这种被几乎大部分请求都查询的,就本文版权归作者所有,未经授权不得转载。【转载请注明来源】可以放在缓存里面。本来打算用redis,【本文受版权保护】本文作者:唐霜,转载请注明出处。后来想,反正我的项目不会很大,用redi未经授权,禁止复制转载。【版权所有,侵权必究】s还是用memcahced都不是问题,而【本文受版权保护】【本文受版权保护】且目前来说,根本不存在技术选型的问题,都未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。是开发一块琢磨一块。

【作者:唐霜】本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。未经授权,禁止复制转载。

你看我最近的博客就知道,我在用slim开【本文受版权保护】原创内容,盗版必究。发一个投票系统的后端api,所以这篇文章本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。自然是要在slim去讲怎么用。不过其实I【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】lluminate\Cache是一个模块【关注微信公众号:wwwtangshuangnet】【作者:唐霜】,所以任何项目里面都是可以用的,不限框架【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】,自己写一个php都可以引进来用。下面就【未经授权禁止转载】【转载请注明来源】开始详解怎么实现:

【版权所有】唐霜 www.tangshuang.net【转载请注明来源】【关注微信公众号:wwwtangshuangnet】

环境的搭建著作权归作者所有,禁止商业用途转载。

转载请注明出处:www.tangshuang.net【版权所有,侵权必究】原创内容,盗版必究。【作者:唐霜】【原创不易,请尊重版权】

本来我打算一上来就代码,三两下结束的,但转载请注明出处:www.tangshuang.net原创内容,盗版必究。是我发现,这样没多大意义,特别是刚开始接【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】触使用composer的同学,要面临的问【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。题特别多。我一开始也以为可以很快搞定,结【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。果也躺了两个坑。我是在本地的ubuntu转载请注明出处:www.tangshuang.net【未经授权禁止转载】下开发,所以下面的安装、配置相关命令都是转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.netubuntu下的,其他linux版本也有【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】对于的安装,熟悉linux的话,应该不是原创内容,盗版必究。【作者:唐霜】问题。

著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。【原创内容,转载请注明出处】【转载请注明来源】

安装memcached【本文首发于唐霜的博客】

【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】【未经授权禁止转载】

memcached和memcache是两【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net个不同的服务,虽然它们接口都是一样的,但【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。是memcached使用的更多。其实这两著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net者在数据库层面没有什么关系,主要搞混的地【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】方是:它们是两个不同的php扩展。mem【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】cache这个扩展功能比较老,现在更多的未经授权,禁止复制转载。【原创不易,请尊重版权】我们会使用采用了新接口的memeched【原创内容,转载请注明出处】【原创不易,请尊重版权】这个扩展。所以,实际上,安装memcac【本文受版权保护】【原创内容,转载请注明出处】hed是两个过程,一个是安装memcac著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.nethe数据库,另一个是安装php的memc转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】ached扩展。

【转载请注明来源】【本文受版权保护】【作者:唐霜】
sudo apt install memcached

这样就把数据库安装上了,可以使用【原创不易,请尊重版权】service memcached restart来重启服务。原创内容,盗版必究。

【本文受版权保护】本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】

接下来就是安装php的memcached【版权所有,侵权必究】原创内容,盗版必究。扩展。

【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】

安装php扩展【原创不易,请尊重版权】

著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。【本文受版权保护】著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。

从理论上讲,我们只需要去官网把memca转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】ched这个扩展下载下来,启动phpiz转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。e,编译,make install一下就原创内容,盗版必究。【原创不易,请尊重版权】可以了。但是其实并不这么简单。

转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。

当memcache数据库服务器运行起来之【转载请注明来源】【原创内容,转载请注明出处】后,它其实是一个服务端程序,你需要一个客未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。户端去连接它,操作它。按理来说,php的【未经授权禁止转载】未经授权,禁止复制转载。memcached扩展就是个客户端,连上【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。去就好了啊。但是,在这之前,你必须安装m【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。amcache的开发库。在ubuntu上未经授权,禁止复制转载。未经授权,禁止复制转载。安装:

【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】
sudo apt install libmemcache-dev

在其他linux上是不是这个包名不是很清【未经授权禁止转载】转载请注明出处:www.tangshuang.net楚,总之可以尝试libmemcached本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】、devel等这些单词,总会有一个可以安【原创不易,请尊重版权】【原创不易,请尊重版权】装上。安装了lib dev之后,才能编译下载本文作者:唐霜,转载请注明出处。好的memcached。本文作者:唐霜,转载请注明出处。

著作权归作者所有,禁止商业用途转载。【作者:唐霜】【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。

接下来就是编译安装了,进到解压出来的目录【版权所有,侵权必究】【原创不易,请尊重版权】里面:

【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】
phpize./configuremakesudo make install

这样就算编译安装好了,扩展模块会在你的p【作者:唐霜】著作权归作者所有,禁止商业用途转载。hp模块目录下。但是你还需要编辑php.【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】ini,把扩展添加进去:

转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】【原创内容,转载请注明出处】
extension=memcached.so

把这一行加入到php.ini中有很多ex【本文受版权保护】原创内容,盗版必究。tension的地方。保存之后,要重启h【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.netttpd,ubuntu上是apache2【转载请注明来源】本文作者:唐霜,转载请注明出处。。重启之后,就可以在php代码中new Memcached()了。这个类具体怎么用,可以看上面那个链接【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。,阅读官方文档。

本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】原创内容,盗版必究。

使用Illuminate\Cache实现未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。缓存

著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net原创内容,盗版必究。

Illuminate\Cache是Ill【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】uminate开发的一个模块,里面包含了转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】各种类型的cache类,当然了,每一个类著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】的使用,都依赖对应的缓存机制,其中大部分【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。也像上面一样,要么你需要安装,要么需要配【作者:唐霜】【关注微信公众号:wwwtangshuangnet】置,总之,不是说拿来就可以立即用,而需要【未经授权禁止转载】【本文受版权保护】提前将环境搭建好。

原创内容,盗版必究。【作者:唐霜】转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。原创内容,盗版必究。

安装Illuminate\Cache【版权所有】唐霜 www.tangshuang.net

【转载请注明来源】【本文首发于唐霜的博客】【原创不易,请尊重版权】

通过composer进行安装是现在php原创内容,盗版必究。【未经授权禁止转载】开发最流行的模块安装方式,如果你还在处于【本文受版权保护】本文作者:唐霜,转载请注明出处。以前那种下载后把文件require的开发【本文受版权保护】【版权所有】唐霜 www.tangshuang.net模式,那么应该考虑一下升级一下自己的开发著作权归作者所有,禁止商业用途转载。【转载请注明来源】理念。

原创内容,盗版必究。转载请注明出处:www.tangshuang.net【转载请注明来源】【本文首发于唐霜的博客】【本文受版权保护】
composer require illuminate/cache

在你的项目目录下运行上面的安装命令,就可【本文受版权保护】【关注微信公众号:wwwtangshuangnet】以把这个模块安装到vendor目录中,而原创内容,盗版必究。原创内容,盗版必究。且composer实现了自动加载,也就是【本文首发于唐霜的博客】【原创内容,转载请注明出处】说你可以在你的php文件中通过use命令【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。,直接使用这个类。

【版权所有,侵权必究】未经授权,禁止复制转载。【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】

实现代码原创内容,盗版必究。

【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。

作为slim的新粉,必须重度实践slim【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net的开发理念。slim真的是太赞了,虽然它本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。不像其他php框架一样,提供一整套的数据【转载请注明来源】【版权所有,侵权必究】库、缓存、文件上传等等功能。但是它提供了【作者:唐霜】【版权所有,侵权必究】最最最核心的request和respon转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】se的router,这就够了,用rout转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】er以及它的中间件思想,就可以实现任意的【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net服务。现在很少用php开发大型的应用了,转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。特别是web已经被node霸占了,sli【本文受版权保护】【转载请注明来源】m这种微框架拿过来就开始开发,为了一个非【转载请注明来源】未经授权,禁止复制转载。常小的功能开发一个服务,需要的其他功能通原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。过composer安装,这种思想兼职是我著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。迄今为止遇到过的最好的php开发实践了。

未经授权,禁止复制转载。【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】

当然,这篇文章不是为了夸slim,回到主【版权所有】唐霜 www.tangshuang.net【本文受版权保护】题,实现缓存。既然不是为了slim,那么【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】直接用slim的router开始好了。代【作者:唐霜】未经授权,禁止复制转载。码的大致框架:

【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】【作者:唐霜】【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。
require 'vendor/autoload.php';require 'cache.php';
$app = new \Slim\App($app_config);
$app->get('/cache', 'CacheController:cache');
$app->run();

这就是index.php了,你会把它丢到【原创不易,请尊重版权】【原创不易,请尊重版权】网站的根目录下,准备访问/cache这个未经授权,禁止复制转载。【原创不易,请尊重版权】uri来测试代码是否生效,而cache这原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】个路由,会写在cache.php里面。C未经授权,禁止复制转载。【本文首发于唐霜的博客】acheController这个类会在c【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。ache.php中去定义。接下来就来看下【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。cache.php:

【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。
use Illuminate\Cache\MemcachedConnector as Connector;
use Illuminate\Cache\MemcachedStore as Cache;
class CacheController {
  private $cache;
  function __constructor() {
    $config = [   
      'memcached' => [
        'host' => '127.0.0.1',
        'port' => 11211,
        'weight' => 100,   
      ],
    ];
    $connector = new Connector();
    $connect = $connector->connect($config);
    $this->cache = new Cache($connect);
  
    // 你现在已经实例化了一个cache,利用MemcacheStore的api想干嘛干嘛吧
  }
}

上面极其简单的实现了一个$cache,你【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】可以在后面的代码里面保存、获取了。注意,本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。保存使用->put方法,而不是se【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】t方法,这也是个坑。

转载请注明出处:www.tangshuang.net【版权所有,侵权必究】未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。

说到这里,不得不说包括laravel的很未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】多文档都写的很不友好,用文档工具生成一下【作者:唐霜】【本文受版权保护】就ok了,你自己去慢慢研究。在上面con【本文首发于唐霜的博客】【作者:唐霜】nect这个点上我就被坑了一下,一开始以【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net为直接在new的时候把config传进去【转载请注明来源】本文版权归作者所有,未经授权不得转载。就好了,试了几次才去看源码,才知道要调用【未经授权禁止转载】未经授权,禁止复制转载。connect方法,config是传给c【本文首发于唐霜的博客】原创内容,盗版必究。onnect方法的。所以,这里也表达一下【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net我的看法,看文档固然是一件好事,但是有的原创内容,盗版必究。转载请注明出处:www.tangshuang.net时候反不如直接看代码来的清楚,现在的项目【原创内容,转载请注明出处】原创内容,盗版必究。代码写的都比较优雅,读起来很轻松,直接看本文作者:唐霜,转载请注明出处。原创内容,盗版必究。代码不仅知道有哪些接口,而且还可以知道传【本文受版权保护】【本文受版权保护】的参数是什么类型,看源码,不骗你。

本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。【本文受版权保护】【作者:唐霜】

实战案例:输入验证码【版权所有】唐霜 www.tangshuang.net

【作者:唐霜】转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】

上面实现了连接到memcache,接下来转载请注明出处:www.tangshuang.net【版权所有,侵权必究】,我们就直接使用Illuminate\C本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】ache的接口来实现一个缓存的使用场景:【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】输入验证码。之所以使用缓存来实现,是因为【转载请注明来源】【本文首发于唐霜的博客】部分设备不支持session,而且特别是【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。手机客户端和api之间的交互,不携带co本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。okie,只能通过一些明码来实现。验证码【作者:唐霜】【未经授权禁止转载】是两个步骤:产生码,验证码。所以也可以很本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】好的作为一个案例来演示。

未经授权,禁止复制转载。【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net

首先,产生一个码。这个码不会发文本给用户【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net,只会放在服务端,发给用户的,是一个识别【作者:唐霜】未经授权,禁止复制转载。号id,这个识别号id就是缓存号,通过它【版权所有】唐霜 www.tangshuang.net【本文受版权保护】可以从memcache里面取出对应的验证【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】码。现在来产生这个id和码:

【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net
// 在CacheController里面添加一个新方法cache
function cache($req, $res, $args) {
  $id = mt_rand(1000, 9999);
  $code = mt_rand(1000, 9999);
  $this->cache->put($id, $code, 3); // 3是指保留3分钟,这里比较坑,不能以秒来计算
  // 接下来把id告诉用户
  return $res->withJson(['id' => $id]);
}

这样用户就可以在客户端接收到一个id号,本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】这个id号不是验证码的code,而是一张【关注微信公众号:wwwtangshuangnet】【作者:唐霜】票,他得凭票取码,但是他只能取到一张验证【版权所有,侵权必究】【转载请注明来源】码的图片,而不是真的验证码。下面就写一个【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net方法,用来显示一张图片:

本文作者:唐霜,转载请注明出处。【本文受版权保护】著作权归作者所有,禁止商业用途转载。
function img($reg, $res, $args) {
  $id = $args['id']; // 这个需要在路由中配置,下面讲
  $code = $this->cache->get($id);
  // 下面做一些判断,以防验证码过期之类的
  // 用php输出图片就不在这里给代码了,比较复杂,也可以用composer下载包来实现
}

用户要看到这个图片,必须通过url,所以【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。,你得在最前面的index.php里面加【转载请注明来源】【原创内容,转载请注明出处】一个路由:

【本文受版权保护】【转载请注明来源】【原创内容,转载请注明出处】【原创不易,请尊重版权】
$app->get('/img/{id}', 'CacheController:img');

这样用户才能通过一个url得到图片。他看【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net到图片后,就可以输入图片里面包含的验证码【本文受版权保护】本文作者:唐霜,转载请注明出处。,输入后提交到一个新的地址进行验证:

【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。
$app->post('/check', 'CacheController:check');

这里我们改用了post方法提交数据。用户【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net需要提交id和自己输入的验证码。我们在自【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】己的方法里这样写:

【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net
function check($req, $res, $args) {
  $post_data = $req->getParsedBody();
  $id = $post_data['id'];  $code = $post_data['code'];
  $very_code = $this->cache->get($id);
  // 你现在有了$code(用户post过来的)和$very_code(通过用户post的id获取的缓存值),可以用来比较,并做出回应了
}

这样,一个关于验证码的逻辑就实现了,而且【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】正好利用了本文实现的memcache缓存【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。方法。

【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。

如果你有什么不懂的地方,可以在下方留言,【转载请注明来源】【未经授权禁止转载】如果你对slim感兴趣,可以和我一起探讨【未经授权禁止转载】未经授权,禁止复制转载。,如果你想做前端方面的实践,也可以和我一【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】起探讨。

原创内容,盗版必究。【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】

2017-04-27 7196 , , ,

为价值买单,打赏一杯咖啡

本文价值71.96RMB