缓存__DiscuzX2.0缓存的用法[调用与更新缓存]系列一




DiscuzX2.0缓存的用法[调用与更新缓存]系列一




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的缓存机制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值