PHP连接和使用MemCache

1.PHP安装MemCache扩展

  下载扩展

    PHP默认是不带memcache扩展的,所以要使用首先要去官方网站下载扩展。

    官方网站:http://pecl.php.net/package/memcache/3.0.8/windows

    

    这里有一个问题,我的系统是64位的应该选择X64,X64下载之后却无法成功配置,选择X86却没有问题

    下载完成后解压,将里面的dll文件放入PHP扩展目录下。

  配置PHP

    打开php.ini文件,添加extension=php_memcache.dll。

  重启服务器

  查看安装结果

    可以使用phpinfo()确认是否安装成功,如果找到mencache表示安装成功。

    

2.连接memcache服务器

   这里和接下来的使用部分主要介绍面向对象的方法。  

1 <?php
2     $memca=new Memcache;//实例化一个memcache对象
3     $memca->connect('127.0.0.1',11211);//使用ip地址,和端口号的方式连接
4 
5     $memca->close();//使用完毕记得释放资源
6 ?>

    在连接之前不要忘了开启memchache服务,具体可以参考上一篇博客

 

    

 3.使用memcache

  添加数据

 1 <?php
 2     $memca=new Memcache;
 3     if(!$memca->connect('127.0.0.1',11211)) exit('连接失败');
 4 
 5     $memca->add('v1','this is test',null,0);//添加一条名为v1值为字符串的数据,存储时间为永久
 6 
 7     $arr=array('aaa','bbbb','ccc');
 8     $memca->add('v2',$arr,null,24*60*60);//添加一个数组,同理,对象也可以添加,存储时间为一天
 9 
10 
11     class test
12     {
13         public function a(){}
14     }
15     $ob=new test;
16     $memca->add('v3',$ob,MEMCACHE_COMPRESSED);//存储一个对象,使用第三各参数,当数据过长是会进行压缩
17 
18     $memca->set('v4',123);//如果数据不存在就添加,存在则修改,这里成功添加
19     $memca->set('v1',123);//这里修改v1
20 
21     $memca->close();
22 ?>

   取出数据

 1 <?php
 2     $memca=new Memcache;
 3     if(!$memca->connect('127.0.0.1',11211)) exit('连接失败');
 4 
 5     /*分别获取v1 v2 v3*/
 6     echo $memca->get('v1');echo "<br>";
 7     var_dump($memca->get('v2'));echo "<br>";
 8     var_dump($memca->get('v3'));echo "<br>";
 9 
10     /*一次性获取v1 v2 v3 以关联数组的形式返回*/
11     var_dump($memca->get(array('v1','v2','v3')));echo "<br>";
12 
13     $memca->close();
14 ?>

   删除数据

 1 <?php
 2     $memca=new Memcache;
 3     if(!$memca->connect('127.0.0.1',11211)) exit('连接失败');
 4 
 5     $memca->delete('v1',0);//立即删除v1,0是默认选项,这里可以不加
 6 
 7     $memca->delete('v2',30);//30秒内删除
 8 
 9     $memca->close();
10 ?>

    这里试了一下设置第二个参数为30,但是也是立即就删除,没有发现有什么不同

    如果像删除所有数据可以使用

    $memca->flush();//该方法并不是真的删除所有数据,只是是所有变量过期,内存中的内容改写

 3.实例

  假设有下面一个脚本,访问这个脚本时根据传入的id值,从表account中查找记录并返回。

 1 <?php
 2     try{
 3         $pdo=new PDO('mysql:host=localhost;dbname=example','root','');
 4 
 5         $result=$pdo->query("SELECT * FROM account WHERE id={$_GET['id']}");
 6 
 7         var_dump($result->fetch());
 8     }
 9     catch(PDOException $e){
10         exit('数据库连接或操作失败');
11     };
12 ?>

 

  这个代码没有任何逻辑上的问题,但是在网络上可能有很多客户端在并发的访问这个脚本,它们当中有很多传入的id值都是相同的。

  对于每一个访问,脚本都是无差别处理:从数据库(数据存在硬盘中)中根据SQL语句读取数据-->将结果读入内存中再输出。

  现在使用memcache只要加一条add操作和判断,如下

 1 <?php
 2     $id=$_GET['id'];
 3 
 4     $memca=new Memcache;
 5     $memca->connect('127.0.0.1',11211);
 6 
 7     if($row=$memca->get($id))//判断memcahce中是否存在该id的值,如果存在则直接从内存中返回
 8     {
 9         var_dump($row);
10     }
11     else
12     {
13         try{
14             $pdo=new PDO('mysql:host=localhost;dbname=example','root','');
15             $result=$pdo->query("SELECT * FROM account WHERE id=$id");
16 
17             if($result->rowCount()!=0)
18             {
19                 $row=$result->fetch();
20 
21                 $memca->add($id,$row);//将id为键,查询的结果为值存入memcache中
22 
23                 var_dump($row);echo "第一次查询";
24             }
25             else{
26                 echo "没有记录";
27             }
28         }
29         catch(PDOException $e){
30             exit('数据库连接或操作失败');
31         };
32     }
33     $memca->close();
34 ?>

 

   这样一来,只要之前查询过这个id,那么记录将会直接从内存中获取,就不用连接数据库进行一系列操作了。

 

posted @ 2018-01-14 22:15  帕特菛琦  阅读(283)  评论(0编辑  收藏  举报