首页 Memcache 正文
272

关于memcache的一些备注

  • yiqingpeng
  • 2016-06-11
  • 0
  •  
1、memcache利用内存存储数据,数据以键值对形式存储,在php中,可以存储数值、字符串、数组、对象等类型的数据,但是资源类型的数据是不可以存储的。存储对象时要注意的是,在获取对象的时候,一定要保证当前运行环境该对象的类是定义完整的
特别注意的是memcache的value大小最大为1MB,而Redis可以达到1GB。

2、主机不允许配置memcache扩展的应对方案:
a)dl函数(php5.3+已经不能使用这个函数了。),这个方案的实现需要php.ini中配置这些配置:enable_dl = On,safe_mode = Off,并且保证disable_functions 的函数列表中没有dl函数。因为这个dl函数对系统来说不安全,所以服务器提供商肯定会不允许使用它。
if(!extension_loaded('memcache') && function_exists('dl')){
    echo 'extension is not loaded!<br>';
    if(strtoupper(substr(PHP_OS,0,3))=='WIN'){
        dl('php_memcache.dll');
    }else{
        dl('memcache.so');
    }
}
b)dl函数不能使用的情况下,可以使用memcached_client.php这个库,它是使用socket机制与memcache服务通信的。

3、关于过期时间的配置:
a)过期时间可以是秒数,但是只能最多设置30天:如$mem->set('key1', 'my value', MEMCACHE_COMPRESSED, 30*24*3600);
b)过期时间可以是时间戳,可以无限制:如$mem->set('key1', 'my value', MEMCACHE_COMPRESSED, time()+60*24*3600);
c)0代表永不过期

4、分布式应用:
$mem = new Memcache();
$mem->addServer('192.168.1.100', 11211);
$mem->addServer('192.168.1.101', 11211);
$mem->set('key1', 'my value');//数据会保存在上面两个服务器中的其中一个,保存和获取对调用者来说都是透明的。注意一点:两个memcache的服务端彼此并不会通信,也就是说服务端没有同步机制,一个key数据只可能出现在一个服务中。

5、数据销毁的情形:
a)过期时间到了;
b)服务重启;
c)主机重启;
d)客户端应用delete/flush命令主动删除数据(delete可以把key删除,而flush只会清除数据,也就是key还存在。)

6、利用memcache保存session:
首先,需要修改php.ini的两个配置,如下
#默认的是session.save_handler = files, 可用的选项有user|files|memcache
session.save_handler = memcache
#修改memcache服务地址,也可支持多个memcache服务器,形如:"tcp://127.0.0.1:11211,tcp://127.0.0.2:11211";
session.save_path = "tcp://127.0.0.1:11211"
ini_set('session.save_handler', 'memcache');
ini_set('session.save_path', 'tcp://127.0.0.1:11211');
session_start();
$_SESSION['name']='yiqingpeng';
$_SESSION['age'] = 40;//session还可以存储数组、对象

$sid = session_id();
$mem = new Memcache();
$mem -> connect('127.0.0.1', 11211);
$val = $mem -> get($sid);//memcache中是以session id为键的
var_dump($val);//array(2) { ["name"]=> string(10) "yiqingpeng" ["age"]=> int(40) }
7、安全性:
由于memcache服务没有用户验证机制,所以如果暴露在公网上将会被任何客户端所连接。要解决此问题,我们需要为服务器配置防火墙。windows系统很简单,开启防火墙,确保11211端口被屏蔽。linux系统也是开启防火墙,并使用iptables命令进行配置,比如:iptables -A INPUT -p tcp -s 127.0.0.1 --dport 11211 -j ACCEPT  //仅允许本机访问11211端口。

正在加载评论...