2014-01-29 09:46:19 关键词:memcached缓存技术的操作及安全性,贵阳网站建设 毕业设计 贵阳网站建设

《一步一步跟我学PHP》第69讲:php中memcached缓存技术的操作及安全性

来源: 百优资源网 作者:管理员

核心提示:memcached是一种缓存技术,他可以把数据放入内存以提高访问速度。使用Telnet程序(客户端)对Memcached进行CRUD操作,也可以通过php程序操作Memcached服务。本文对这些内容进行介绍,希望对贵阳网站建设的朋友有所帮助。
已被点击
查看
收藏
  • 开心网
  • 人人网
  • i贴吧
分享
分享

| 服装连锁店ERP管理系统

服装连锁店ERP管理系统可以高效完成物流配送,考勤管理,工资管理,员工管理,报表管理,陈列管理等功能,是服装连锁企业理想的选择。[详细]

手动刷新 更新时间:14:08:37
---------------------------------------------

---------------------------------------------

《一步一步跟我学PHP》第69讲:php中memcached缓存技术的操作及安全性

描述:memcached是一种缓存技术,他可以把数据放入内存以提高访问速度。使用Telnet程序(客户端)对Memcached进行CRUD操作,也可以通过php程序操作Memcached服务。本文对这些内容进行介绍,希望对贵阳网站建设的朋友有所帮助。

一、memcached基本概念
    Memcached是danga的一个项目,最早是LiveJournal 服务的,最初为了加速 LiveJournal访问速度而开发的,后来被很多大型的网站采用。 memcached是一种缓存技术,他可以把数据放入内存以提高访问速度。在memachec 中维护了一张大的hashtable表,该表是在内存中的,表的结构是key和value的键值对,可以存放字串、数值、数组、对象、布尔、二进制数据、null等类型,但不能存放资源类型。
    Memcached安装步骤:
    首先下载好memcached软件,通过开始菜单中的运行,输入cmd命令进入命令行程序,通过命令CD进入到 memcached.exe 文件所在目录,再执行命令memcached.exe –d install 进行安装即可。安装好后,通过我的电脑中的“服务”中启动memcached,也可以通过命令行memcached.exe –m 200MB –d start  【以deamon方式启动,默认64M】。
如果是在Win7系统下,可能会启动不成功,使用memcached.exe –p 端口号的方法进行启动。
    注意在启动过程中不要关闭控制台。
    端口号的范围是在0到65535之间,因为端口号是用两个字节来表示的。
0到1024之间称为公认端口(Well-Known Ports),已经被其它程序使用(比如比如21端口分配给FTP(文件传输协议)服务,25端口分配给SMTP(简单邮件传输协议)服务,80端口分配给HTTP服务,135端口分配给RPC(远程过程调用)服务、mysql 3306、oracle: 1521等等。)。注册端口(Registered Ports):端口号从1025到49151。它们松散地绑定于一些服务。
可以使用netstat –an 如果看到 11211端口在监听,说明启动成功。
     netstat –anb 是哪个程序监听,这个指令还可以看到有哪些用户连接到我们的服务器。
如果Win7下安装不成功的可能原因是:
(1)如果是win7系统,win7对安全性高,必须以adminstartor 身份来安装。切换成adminstrator,去安装成功后再启动。
(2)另一种情况是memcached.exe所在目录有中文或特殊字符,保证目录没有中文和特殊字符。

二、telnet操作Memcached
    许多程序设计语言都实现了连接memcached的客户端,其中以Perl、PHP为最流行的。仅仅memcached网站上列出的语言就有Perl 、PHP、Python、Ruby、C#、C/C++等程序设计语言。
为了让大家快速体验一下Memcached的使用,我们先通过一个现成的程序telnet来说明Memcached 的使用,然后我们在讲解如何通过PHP程序来操作Memcached,请大家注意体会其用法。
使用Telnet程序(客户端)对Memcached进行CRUD操作,这里我们需要使用到Memcached给我们提供的命令。请参考[memcached的基本命令(安装、卸载、启动、配置相关) http://www.by-sj.com/WebRes/Pro820.html]。
(1)连接到memcache服务器
telnet ip 端口. [telnet 127.0.0.1 11211 ]
在操作时,需要使用到memcache给我们提供的命令。通过命令来演示一下crud操作。
(2)添加操作
在命令行输入:add mykey1 0 60 5 回车//--表示添加,0表示标识,60表示保存时间,5表示大小。
再输入:hello回车,屏幕显示“STORED”表示保存成功。
(3)取加键值get mykey1  --通过键获取值
VALUE mykey1 0 5
hello
END
(4)修改键值
set mykey1 0 60 5 --如果mykey1存在,则相当于更新,如果不存在在相当于添加。
abcde
STORED
get mykey1
VALUE mykey1 0 5
abcde
END
replace mykey1 0 60 5 --更新(如果mykey1不存在则会提示not store,如果存在则替换)
11111
STORED
get mykey1
VALUE mykey1 0 5
11111
END
(5)删除键值
delete mykey1 --删除如果mykey1不存在则提示 not found,如果存在则删除。
DELETED
get mykey1
END

三、详细分析
(1)登录到telnet连接
到 memcached服务。
telnet 127.0.0.1  11211
如果不能使用telnet 是因为系统不存在 telnet.exe , 就可以到其它机器上拷贝 telnet.exe 放在 c:\windows\system32 即可。或者在控制面板中和程序里打开telnet客户端这个功能。
(2)增加操作
基本语法是:add 键名 0 存放时间(秒) 数据大小(字符)
举例:
add key1 0 30 5
(2)如何获取保存的键值
基本语法是:get 键值+回车
get key1
(3)修改保存的键值
set 键名 0 存放时间 数据大小。
举例:
set key1 0 40 5
如果key1不存在,则相当于增加新的数据,如果存在则相当有替换操作。
replace 键名 存放时间 数据大小
replace key1 0 40 5
如果key1不存在,则操作失败,这个指令要求键名在内存中必须存在。
(4)删除操作
基本语法是:delete 键名
delete key1
(5)append在已保存的键名串后面添内容
add key1 0 60 5
hello
STORED
get key1
VALUE key1 0 5
hello
END
append key1 0 60 3
abc
STORED
get key1
VALUE key1 0 8
helloabc
END
(6)peopend在已保存的键名串前面添内容
add key1 0 60 5
abcde
STORED
get key1
VALUE key1 6 5
abcde
END
prepend key1 0 60 3
111
STORED
get key1
VALUE key1 6 8
111abcde
END
(7)flush_all 可以统一把数据清空。
(8)Stats命令

软件设计,贵阳网站建设

这里主要大家可以去计算出命中率 cmd_hits/cmd_get,越高越好。

四、php操作Memcached
通过php程序操作Memcached服务几种形式

软件设计,贵阳网站建设

1.安装并配置Memcache扩展库
    在php.ini文件添加:extension=php_memcache.dll
并把对应的dll文件拷贝到 ext目录下
2.使用php对Memcached进行CRUD操作时,要配合php帮助手册进行代码设计。

    先看看目前php是否支持memcache扩展库. <?php phpinfo(); ?>
    安装并配置memcache扩展库, 把**.dll文件拷贝到 ~php/ext/ 目录下,同时在php.ini文件中 增加 extension=**.dll 的设置,看看phpinof()是否更新了。
演示crud操作 /各个函数都可以试试看 【add 和 set的区别 replace. addServer 】
mem1.php 文件程序设计源代码:
<?php
 $memcache = new Memcache;
 $memcache->connect('localhost', 11211);
 //也可以使用addServer来连接某个memcached服务器
 //$memcache->addServer(“127.0.0.1”,11211); //通过查看文档可以看到他们的区别.
         //$memache->addServer(“123.11.89,90”,11211);//加入多个memcache体现出分布式的优势.客户端负责负载均衡.
 //添加(字符)**************
/* $memcache->add("key1","bysj",MEMCACHE_COMPRESSED,60);
 //如果直接存入数值,则会以string形式保存到memcache
 //$memcache->add("key1",300,MEMCACHE_COMPRESSED,60);
 //获取字符串
 $val=$memcache->get("key1");
 echo "val=$val";*/
 //添加(数值)***** 整体使用和字符串相同,可以讲讲  $memcache->increment(  ) $memcache->decrement() [通常用于计数器.]
 /*
 $memcache->add(“counter”,1);//这里不能使用压缩的形式.
 $current_value = $memcache->increment('counter', 3);
 $current_value2=$memcache->increment('counter', 3);
 echo "counter=$current_value";
 echo $memcache->get("counter");
 */
 //添加数组******************
/* $arr=array("beijing","tianjing","nanjing");
 //如果key存在则会返回false,但是代码可以继续执行
 //有时,我们需要对arr进行序列化和json编码然后再存放,我们可以使用下面两个函数
 //1. $val=serialize($arr);  2. $val=json_encode($arr);
 $b=$memcache->add("key1",$arr,MEMCACHE_COMPRESSED,60);
 if(!$b){
  echo "存在";
 }
 $val=$memcache->get("key1");
 var_dump($val);*/
 //*******添加对象
/* class Dog{
  public $age;
  public $color;
  public function __construct($age,$color){
   $this->age=$age;
   $this->color=$color;
  }
 }
 $dog1=new Dog("aaa","red");
 $memcache->add("key_dog1",$dog1,MEMCACHE_COMPRESSED,60);
 $val=$memcache->get("key_dog1");
 var_dump($val);*/
 //*****能不能保存数据库连接资源[不能存入]
/* $conn=mysql_connect("localhost","root","hsp123");
 
 mysql_select_db("test",$conn);
 mysql_query("insert into emp (ename,job,sal) values('ko2','uu',1)");
 $memcache->add("link1",$conn,MEMCACHE_COMPRESSED,60);
 $myconn=$memcache->get("link1");
 mysql_select_db("test",$myconn);
 mysql_query("insert into emp (ename,job,sal) values('ko3','uu',1)");*/
?>
     mem2.php程序设计源代码: 从memcache获取,主要是为了演示在一个页面添加,在另外一个页面是否能够获取-->当然能获取。
<?php
 class Dog{
  public $age;
  public $color;
  public function __construct($age,$color){
   $this->age=$age;
   $this->color=$color;
  }
 }
 $memcache = new Memcache;
 $memcache->connect('localhost', 11211);
 
 $val=$memcache->get("key_dog1");
 echo "从另外一个页面获取<br/>";
 //这个可以取出信息
 var_dump($val);
 //如果这样取,因为该文件没有Dog类信息,因此无法 $val->color
 //需要引入Dog类定义信息(直接写或者require) 才能ok
 echo "<br/>".$val->color;
 
?>

五、memcached-client操作
    疑问:
    如果我们没有memcache.dll文件,我们能不能去操作memcached 内存数据呢?
特点:
1.不需要开启memcache扩展
2.使用fsockopen()套接字连接memcached
3.同样执行执行CRUD
display_errors = Off ,否则会提示错误,但是仍会成功!
<?php
   require_once 'memcached-client.php';
   $mc = new memcached(array(
               // 'servers' => array('127.0.0.1:11211',"192.168.1.56:11211"),//多个服务器
      'servers' => array('127.0.0.1:11211'),
      'debug'   => false,
      'compress_threshold' => 10240,
      'persistant' => true
              )); 
  $mc->set('key', '韩顺平hello');
  $mc->replace('key', 'some random stringy 哈哈!');
  $val = $mc->get('key');
  echo "a=$val";
 //删除
// $mc->delete('key');
?>

六、Memcached细节问题
1. 生命周期
    生命周期在 apache关闭后不影响的,如果 apache没有关闭,但是时间到时会删除。在使用命令进行删除时其生命周期也结束。
2. Memcached数据存在什么地方(内存中)。
3. Memcached最佳实践
① 将从数据库查询的数据放入Memcached (举例说明-伪代码)。
② 将Session数据放入到Memcached(举例说明)
    步骤1:保证memcache扩展开启,memcachd运行。
    步骤2:设置php.ini中session.save_handler=memcache。
    步骤3:设置php.ini中session.save_path=tcp://localhost:11211。
    步骤4:也可以通过php函数 ini_set() 函数在页面设置。
--session数据放入memcached 中案例,这里读者可以将Session中放入对象,在另外一个文件中如何取出进行测试。
session.save_handler = files [user|memcache] 【三种取值.】
--注意: 在windows下,默认路径是 C:\WINDOWS\Temp
<?php
  //除了可以在php.ini文件中设置session保存到memcache外,我们还可以直接在文件中设置,其实这样更好,因为
  //不会影响到别人的使用session的方式. 
  ini_set("session.save_handler","memcache");
  ini_set("session.save_path","tcp://localhost:11211");
  session_start();
  $_SESSION['name']="abc";
  echo 'ok';
  //取出session的方式和放入session不变,对用户是透明的
  echo "session:".$_SESSION['name'];
?>
4.Memcached的数据是无用户状态的。即不会和某个用户绑定。Session是和用户进行绑定的。
5.Memcached访问安全性
    Memcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数据泄露被其他无关人员查看,重则服务器被入侵,因为Mecache是以root权限运行的,况且里面可能存在一些我们未知的bug或者是缓冲区溢出的情况,这些都是我们未知的,所以危险性是可以预见的。为了安全起见,我做两点建议,能够稍微的防止黑客的入侵或者数据的泄露。
(1)内网访问
    把两台服务器之间的访问是内网形态的,一般是Web服务器跟Memcache服务器之间。普遍的服务器都是有两块网卡,一块指向互联网,一块指向内网,那么就让Web服务器通过内网的网卡来访问Memcache服务器,我们Memcache的服务器上启动的时候就监听内网的IP地址和端口,内网间的访问能够有效阻止其他非法的访问。
# memcached -d -m 1024 -u root -l 192.168.0.200 -p 11211 -c 1024 -P /tmp/memcached.pid
    Memcache服务器端设置监听通过内网的192.168.0.200的ip的11211端口,占用1024MB内存,并且允许最大1024个并发连接
(2)设置防火墙
    防火墙是简单有效的方式,如果却是两台服务器都是挂在网的,并且需要通过外网IP来访问Memcache的话,那么可以考虑使用防火墙或者代理程序来过滤非法访问。
    一般我们在Linux下可以使用iptables或者FreeBSD下的ipfw来指定一些规则防止一些非法的访问,比如我们可以设置只允许我们的Web服务器来访问我们Memcache服务器,同时阻止其他的访问。
# iptables -F
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp -s 192.168.0.2 –dport 11211 -j ACCEPT
# iptables -A INPUT -p udp -s 192.168.0.2 –dport 11211 -j ACCEPT
    上面的iptables规则就是只允许192.168.0.2这台Web服务器对Memcache服务器的访问,能够有效的阻止一些非法访问,相应的也可以增加一些其他的规则来加强安全性,这个可以根据自己的需要来做。
    设置防火墙:iptables -a input -p 协议 -s 可以访问ip -dport 端口 -j ACCEPT
访问安全性方面我们还需要考虑内网访问时,在windows下可以通过启用防火墙+例外80端口来实现。如果设置防火墙,在linux下通过iptables -a input -p tcp -s 192.168.1.88 -dport 11211 -j ACCEPT。【iptables -a input -p udp -s 192.168.1.88 -dport 11211 -j ACCEPT】
   
6. 什么样的数据适合放入memcached中?
    放入memcached中的数据往往是变化频繁,具有不稳定性的数据,不需要实时入库 (比如用户在线 状态、在线人数..)等等。
    那些门户网站的新闻等,觉得页面静态化仍不能满足要求,可以放入到memcache中(配合jquey的ajax请求)。
什么样的数据不适合放入memcached中?
  比如银行、股票、证券系统等数据,还有过大的数据不能放入到memcache(优酷网那些视频数据等)。

7. 如何决定是否使用memcached
--如果是一个小网站,PV值不大,就不考虑使用memcache了
--变化频繁,查询频繁,但是不一定写入数据库(适合memcache)
--变化频繁, 一变化就要入库[比如股票,金融.](不适合memcache)

8. Memcached vs session的比较
 (1).存放的介质不同
(2).生命周期方式
(3). 要解决的问题重点不同(session 主要用于追踪用户状态,是http协议关联), (memcache用于保存数据)

【推荐阅读】
 软件设计和网站建设策略分析
 第58讲:PHP smarty模板中内建函数
 第59讲:PHP smarty模板中自定义函数
 第60讲:PHP smarty配置文件、常量、变量
 第61讲:PHP smarty方法、高级特性
 第62讲:PHP中zend framework原理分析
 第63讲:PHP中zend framework和数据库整合 
 第64讲:PHP中zend framework实例——投票系统
 第65讲:PHP中zend framework Zend_Db_Table详解
 第66讲:PHP中zend framework 实例——购物车
 第67讲:php数据库编程陷阱详解
 第68讲:php中memcached缓存技术的原理及安装
 第69讲:php中memcached缓存技术的操作及安全性
 第70讲:php程序操作memcached详细分析

声明:本站内容凡注明"来源:百优资源网"的所有文字、图片等资料,版权均属百优资源网原创,任何媒体、网站或个人不得转载、链接、转贴或以其他方式复制发布/发表。本网站部分资源来源于网络,如果有侵犯你的权利,请联系本站删除。

网友评论
用户名 密码 自动登录 登录
*网友评论仅供其表达个人看法 发表评论
  • 软件设计 196
    使用VC++加载图片技巧

    软件设计 | 使用VC++加载图片技巧

    在界面添加图片,在VB、delphi等软件设计语言中很简单,但是在VC++中是很难实现,这过程不但要对图片进行导入,还要显示,最后要清除内存。下面小编对这个方法进行了整理,直接复制就可以实现使用VC++加载图片技巧了。

    毕业设计 683
    毕业设计论文智能管理系统设计的意义

    毕业设计 | 毕业设计论文智能管理系统设计的意义

    毕业设计(论文)是高等院校人才培养过程中不可或缺的重要环节,一直受到各高等学校的高度重视。毕业论文网上管理是高校信息化的一个重要体现,本文对毕业设计论文智能管理系统设计的意义进行介绍。

    毕业论文 812
    西昊人体工学椅 重新定义“好椅子”的标准

    毕业论文 | 西昊人体工学椅 重新定义“好椅子”的标准

    高端椅业领导者西昊人体工学电脑椅以其极具人性关怀的产品对好椅子的标准进行了重新定义。西昊人体工学椅创办于1999年,一直专注于人体工学椅的研发、制造和销售,最初产品主要销往欧美

860010-1102010400