DiscuzX2.0缓存的用法[调用与更新缓存]系列一
原帖:http://www.discuz.net/thread-2087076-1-1.html
新建文件cache_qinmi.php 到 source/function/cache 目录
<?php
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}
function build_cache_qinmi() {
$data = array();
$data[] = '秦迷空间';
$data[] = 'http://www.rczjp.cn';
save_syscache('qinmi', $data);
}
?>
1.需要生成名字为 qinmi的缓存,那么这个文件的名字需要命名为:cache_ qinmi.php
2.文件中的 build_cache_xxxx 类似的这个函数名应为 build_cache_ qinmi
3.save_syscache('xxxx', $data); 应该为 save_syscache('example', $data);
NOTE:其中 build_cache_qinmi 函数就是主要的对需要缓存的数据做处理的函数,所有的组织数据,都可以放到这个函数里面执行,或者放到多个小函数,然后统一在这个函数中执行。而且结尾必须要以 save_syscache('qinmi', $data); 结尾,才能写入缓存数据
更新缓存的方法
require_once libfile('function/cache');
updatecache('qinmi');
调用缓存的方法
require_once libfile('function/cache');
loadcache('qinmi');
测试:
require_once libfile('function/cache');
require_once('source/class/class_core.php');
$discuz = & discuz_core::instance();
$discuz->init();
require_once libfile('function/cache');
updatecache('qinmi');
loadcache('qinmi');
echo "<pre>";
print_r($_G['cache']['qinmi']);
结果:
Array
(
[0] => 空间
[1] => http://www.abc.com
)
我们查询一下系统缓存表
mysql> select * from pre_common_syscache where cname='qinmi';
+-------+-------+------------+--------------------------------------------------------------+
| cname | ctype | dateline | data|
+-------+-------+------------+--------------------------------------------------------------+
| qinmi | 1 | 1300948462 | a:2:{i:0;s:11:"空间";i:1;s:19:http://www.abc.com;} |
大家可以看到数据都序列化在data字段里面了
当然也可以使用数据表来测试,如下:
drop table if exists cache_msg;
create table cache_msg(id int(6) NOT NULL AUTO_INCREMENT,title VARCHAR(20) NOT NULL,PRIMARY KEY(id));
insert into cache_msg(title) values('hello1');
insert into cache_msg(title) values('hello2');
insert into cache_msg(title) values('hello3');
insert into cache_msg(title) values('hello1');
insert into cache_msg(title) values('hello1');
delete from cache_msg where id=2;
delete from cache_msg where id=4;
function build_cache_qinmi() {
$data = array();
$query = DB::query("SELECT * FROM cache_msg");
while($value = DB::fetch($query)) {
$data[$value['id']] = $value;
}
save_syscache('qinmi', $data);
}
结果:
Array
(
[1] => Array
(
[id] => 1
[title] => hello1
)
[3] => Array
(
[id] => 3
[title] => hello3
)
[5] => Array
(
[id] => 5
[title] => hello1
)
)
以上是官网给出的怎么使用缓存的,在下个系列会给出详细讲解DZX2的缓存机制!
==============================================================================
DiscuzX2.0缓存的用法与缓存机制解析[调用与更新缓存]系列二
重点介绍memcache内存缓存功能以及用法
开启服务器端
下载Memcached.exe 放入D:\Memcached目录
-------------------------------------------------------------
cmd命令提示符
安装:memcached.exe -d install
启动:memcached.exe -d start
安装好了,任务管理器可以看到一个memcached的进程,通过netstat -an命令查看
TCP 127.0.0.1:11212 0.0.0.0:0 LISTENING
11211端口被打开,监听中
停止:memcached.exe -d stop 或 memcached.exe -d shutdown
卸载:memcached.exe -d uninstall
推荐使用下面的命令(可以指定IP地址和端口)
D:\Memcached>sc create memcached binPath= "D:\Memcached\memcached.exe -p 9999 -l 127.0.0.1 -m 128 -d runservice" DisplayName= "memcached server" start= auto depend= TCPIP
其中 -d runservice 为启动Windows服务
启动服务:net start memcached server
安装好了,任务管理器可以看到一个memcached的进程,通过netstat -an命令查看
TCP 127.0.0.1:9999 0.0.0.0:0 LISTENING
---------------------------------------------------------------
开启客户端
下载php_memcache.dll 放入到 \php\ext\ 目录里
在php.ini配置文件中的扩展,加入下面一条
extension=php_memcache.dll
phpinfo() 查看有没有memcache信息
memcache.chunk_size
数据将会被分成指定大小(chunk_size)的块来传输,这个值(chunk_size)越小,写操作的请求就越多,如果发现其他的无法解释的减速,请试着将这个值增大到32768.
测试代码如下
$mem = new Memcache;$mem->connect('127.0.0.1', 9999) or die ("Could not connect"); $obj=new stdClass;$obj->name='秦迷空间';$obj->domain='rczjp.cn';$obj->curtime=time();echo "写入的信息:\n";var_dump($obj); $mem->set('qinmi', $obj, false, 4) or die ("写入失败");//将信息存入Cache中,4秒后过期 sleep(2);echo "2秒后获取Cache中的信息\n";$get_result = $mem->get('qinmi');var_dump($get_result);echo $get_result->name."\n"; sleep(2);echo "4秒后Cache过期,获取不到\n";$get_result = $mem->get('qinmi');var_dump($get_result); 输出结果
写入的信息:
object(stdClass)#5 (3) {
["name"]=>
string(8) "空间"
["domain"]=>
string(8) "rczjp.cn"
["curtime"]=>
int(1301291388)
}
2秒后获取Cache中的信息
object(stdClass)#6 (3) {
["name"]=>
string(8) "空间"
["domain"]=>
string(8) "rczjp.cn"
["curtime"]=>
int(1301291388)
}
秦迷空间
4秒后Cache过期,获取不到
bool(false)
其他
show status like 'qcache%';
SQL缓存
SELECT SQL_CACHE * FROM qinmi_common_syscache;
SELECT /*!40001 SQL_CACHE */ * FROM qinmi_common_syscache;
SQL不缓存
SELECT SQL_NO_CACHE * FROM qinmi_common_syscache;
SELECT /*!40001 SQL_NO_CACHE */ * FROM qinmi_common_syscache;
好了,关键的内存缓存就是这样实现的,好处大家都知道就是提高效率,下个系列就详细介绍Discuz2.0的缓存机制。