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,那么记录将会直接从内存中获取,就不用连接数据库进行一系列操作了。