linux下memcache的运用,和php结合小案例。
由于是采用脚本安装的memache,所以软件的依赖关系我就不操心了,脚本已经帮我装好了和php的关联关系,实在是很省心。后续如果有需要,我会针对windows和linux各写一个安装和配置的说明,一来提高自己的水平,而来也给有需要的朋友们。
因此这次我将关注点放在memcache的配置以及php的操作上。
1.启动Memcache的服务器端:
如果是虚拟机的话,你的写的ip要能用ping 命令ping通。这样才可以使用。我刚开始就在上面浪费了许多时间。
# ./memcached -d -m 10 -u root -l 127.0.0.1 -p 12000 -c 256
-P /tmp/memcached.pid
1 -d选项是启动一个守护进程, 2 -m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB, 3 -u是运行Memcache的用户,我这里是root, 4 -l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址127.0.0.1, 5 -p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口, 6 -c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定, 7 -P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid,
memcache中的常量。
memcache中set(‘key’, ‘value’, 0, 60)
其中的0是MEMCACHE_COMPRESSED ,的值。
MEMCACHE_COMPRESSED (integer) 用于在 Memcache::set(), Memcache::add() 和 Memcache::replace()几个方法中指定是否对写入数据压缩。 MEMCACHE_HAVE_SESSION (integer) 1代表当前Memcache session处理器可用,其他为0
常用的几个方法:
Memcache::add()方法在缓存服务器之前不存在key
时, 以key
作为key存储一个变量var
到缓存服务器。 同样可以使用函数memcache_add()。
bool Memcache::add ( string $key , mixed $var [, int $flag [, int $expire ]] )
key
将要分配给变量的key。
var
将要被存储的变量。字符串和整型被以原文存储,其他类型序列化后存储。
flag
使用MEMCACHE_COMPRESSED标记对数据进行压缩(使用zlib)。
expire
当前写入缓存的数据的失效时间。如果此值设置为0表明此数据永不过期。你可以设置一个UNIX时间戳或 以秒为单位的整数(从当前算起的时间差)来说明此数据的过期时间,但是在后一种设置方式中,不能超过 2592000秒(30天)。
分割线后是我自己写的一个小的demo,简单说明memcache的用法。
关于memcache,用法实在是很简易。网上的资料也很多。下面这个网址可以参考下,写的很不错。
http://www.ccvita.com/259.html
1 <?php 2 header("content-type:text/html;charset=utf-8"); 3 4 //实例化Memcache类.初始化条件 5 $memcache = new Memcache; 6 $memcache -> connect('127.0.0.1', 12000); 7 8 //初始化mysql服务. 9 $link = @mysql_connect('127.0.0.1', 'root', '123456', 'test')or die('数据库连接失败'.mysql_error()); 10 mysql_select_db('test'); 11 mysql_set_charset('utf8'); 12 13 //建立sql语句 14 $sql = 'select * from user'; 15 $key = md5($sql); 16 17 if($memcache -> get($key)){ 18 //memecache缓存区间 19 echo '我是读的memcache缓存'; 20 $result = $memcache -> get($key); 21 }else{ 22 //mysql区间 23 echo '我是读的mysql'; 24 $handle = mysql_query($sql); 25 if($handle){ 26 while($array = mysql_fetch_array($handle)){ 27 $result[] = $array; 28 } 29 } 30 mysql_close(); //关闭mysql资源 31 $memcache -> set($key, $result, MEMCACHE_COMPRESSED, 5); //MEMCACHE_COMPRESSED是常量1. 缓存5秒 32 } 33 34 35 echo '<pre>'; 36 print_r($result); 37 echo '</pre>'; 38 39 40 41 ?>
下面是ThinkPHP里面写的一个小的demo.
首先要配置Common下面的config文件。配置文件如下:
<?php return array( /* 数据库设置 */ 'DB_TYPE' => 'Mysql', // 数据库类型 'DB_HOST' => 'localhost', // 服务器地址 'DB_NAME' => 'datebase', // 数据库名 'DB_USER' => 'root', // 用户名 'DB_PWD' => '123456', // 密码 'DB_PORT' => '3306', // 端口 'DB_PREFIX' => 'smm_', // 数据库表前缀 /* 数据缓存设置 */ 'DATA_CACHE_TIME' => 5, // 数据缓存有效期 0表示永久缓存,我写了5秒,为了测试方便。 'DATA_CACHE_COMPRESS' => true, // 数据缓存是否压缩缓存 'DATA_CACHE_CHECK' => true, // 数据缓存是否校验缓存 'DATA_CACHE_PREFIX' => 'HOME_', // 缓存前缀 'DATA_CACHE_TYPE' => 'Memcache', // 数据缓存类型,支持:File|Db|Apc|Memcache|Shmop|Sqlite|Xcache|Apachenote|Eaccelerator 'DATA_CACHE_PATH' => TEMP_PATH,// 缓存路径设置 (仅对File方式缓存有效) );
例子如下:
1 class IndexController extends Controller { 2 //载入添加数据库 3 private $smm_iron_user; 4 5 //初始化数据库,避免多次实例化。 6 public function __construct(){ 7 parent::__construct(); 8 $this -> smm_iron_user = M('iron_user'); 9 } 10 11 public function index () { 12 $sql = "select * from smm_iron_user"; 13 $md5sql = md5($sql); 14 15 if(S($md5sql)){ 16 echo '我读的是缓存'; 17 $result = S($md5sql); 18 }else{ 19 echo '我读的是mysql'; 20 $result = $this -> smm_iron_user -> query($sql); 21 S($md5sql, $result, 5); 22 } 23 //S($md5sql,null); 24 dump($result);die(); 25 26 27 } 28 29 }