phpcms v9缓存文件是怎样生成的

来源:undefined 2024-12-28 12:17:33 0

phpcms v9缓存文件是怎样生成的?

这篇文章介绍phpcms的缓存结构

我并没有做深入的学习,但是phpcms的想法上却是有他的过人之处,太令人折服了,这里分享phpcms缓存的一中实现方案

/include/cache.func.php

这里最先主要是定义了一些phpcms的缓存函数,phpcms的缓存分为,表缓存,模型缓存,模型字段缓存,还有模块缓存,首先这些都是基于表的缓存的。

立即学习PHP免费学习笔记(深入)”;

最开始有一个函数

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

function cache_all()

{

@set_time_limit(600);

cache_common();

cache_module();

cache_model();

cache_category();

cache_area();

cache_type();

cache_member_group();

cache_role();

cache_author();

cache_keyword();

cache_copyfrom();

cache_pos();

cache_status();

cache_workflow();

tags_update();

return TRUE;

}

登录后复制

这个函数就调用一大堆的缓存函数来生成缓存的。

首先第一个函数 cache_common

大家可以看下面的注释,是将 前缀名_model,前缀名_category ,前缀名_ module,前缀名,前缀名_type,前缀名_area,等等写入到$CACHE数组的对应下表之中 (比如model 表的数据$CACHE["model"]=$arr,$arr为phpcms_model表的数据)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

function cache_common()

{

global $db;

$data = array();

$result = $db->query("SELECT `module`,`name`,`path`,`url`,`iscore`,`version` FROM `".DB_PRE."module` WHERE `disabled`=0");

while($r = $db->fetch_array($result))

{

if(!$r[path]) $r[path] = $r[module] == phpcms ?  : $r[module]./;

if(!$r[url]) $r[url] = $r[module] == phpcms ?  : $r[module]./;

$data[$r[module]] = $r;

}

$db->free_result($result);

$CACHE[MODULE] = $data;

//以上是将对应的模块写入$CACHE;

$data = array();

$result = $db->query("SELECT * FROM `".DB_PRE."model` WHERE `disabled`=0");

while($r = $db->fetch_array($result))

{

$data[$r[modelid]] = $r;

}

$db->free_result($result);

$CACHE[MODEL] = $data;

$data = array();

//以上是对应的 model表里的内容写入数组$CACHE;

$result = $db->query("SELECT `catid`,`module`,`type`,`modelid`,`catname`,`style`,`image`,`catdir`,`url`,`parentid`,`arrparentid`,`parentdir`,`child`,`arrchildid`,`items`,`citems`,`pitems`,`ismenu`,`letter` FROM `".DB_PRE."category` WHERE 1 ORDER BY `listorder`,`catid`");

while($r = $db->fetch_array($result))

{

$r[url] = url($r[url]);

$data[$r[catid]] = $r;

}

$db->free_result($result);

$CACHE[CATEGORY] = $data;

//以上是将所有的栏目写入$CACHE数组

$data = array();

$result = $db->query("SELECT `typeid`,`modelid`,`module`,`name`,`style`,`typedir`,`url` FROM `".DB_PRE."type` WHERE 1 ORDER BY `listorder`,`typeid`");

while($r = $db->fetch_array($result))

{

$data[$r[typeid]] = $r;

}

$db->free_result($result);

$CACHE[TYPE] = $data;

//以上是将所有的 类别表里的数据写入$CACHE

$data = array();

$result = $db->query("SELECT `areaid`,`name`,`style`,`parentid`,`arrparentid`,`child`,`arrchildid` FROM `".DB_PRE."area` WHERE 1 ORDER BY `listorder`,`areaid`");

while($r = $db->fetch_array($result))

{

$data[$r[areaid]] = $r;

}

$db->free_result($result);

$CACHE[AREA] = $data;

//所有的地区表写入$CACHE;

$data = array();

$result = $db->query("SELECT `urlruleid`,`urlrule` FROM `".DB_PRE."urlrule` WHERE 1 ORDER BY `urlruleid`");

while($r = $db->fetch_array($result))

{

$data[$r[urlruleid]] = $r[urlrule];

}

$db->free_result($result);

$CACHE[URLRULE] = $data;

//将所有的url规则写入缓存

$data = array();

$r = $db->get_one("SELECT `setting` FROM `".DB_PRE."module` WHERE `module`=phpcms");

$setting = $r[setting];

eval("$PHPCMS = $setting;");

if($PHPCMS[siteurl] ==) $PHPCMS[siteurl] = SITE_URL;

$CACHE[PHPCMS] = $PHPCMS;

//最后调用cache_write方法将所有的数组写入common.php 位置/date/cache/common.php根据系统变量慧有所改动

cache_write(common.php, $CACHE);

return $CACHE;

}

登录后复制

phpcms表缓存的实现方式主要是:利用一个叫cache_table函数$table是要缓存的表名,$fileds 是查询的字段名字,默认为 * ,$where sql语句中的where 子句,$order 排序, $isline是否开启字段缓存默认为不开启,如果开启表字段缓存和表缓存将同时进行

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

function cache_table($table, $fields = *, $valfield = , $where = , $order = , $iscacheline = 0, $number = 0)

{

global $db;

$keyfield = $db->get_primary($table);

$data = array();

if($where) $where = " WHERE $where";

if(!$order) $order = $keyfield;

$limit = $number ? "LIMIT 0,$number" : ;

$result = $db->query("SELECT $fields FROM `$table` $where ORDER BY $order $limit");

$table = preg_replace("/^".DB_PRE."(.*)$/", "", $table);

while($r = $db->fetch_array($result))

{

if(isset($r[setting]) && !empty($r[setting]))

{

$setting = $r[setting];

eval("$setting = $setting;");

unset($r[setting]);

if(is_array($setting)) $r = array_merge($r, $setting);

}

$key = $r[$keyfield];

$value = $valfield ? $r[$valfield] : $r;

$data[$key] = $value;

if($iscacheline) cache_write($table._.$key..php, $value); //表字段缓存

}

$db->free_result($result);

cache_write($table..php, $data) ;// 表缓存

}

登录后复制

1

2

3

4

5

6

7

8

9

10

11

function cache_write($file, $array, $path = )

{

if(!is_array($array)) return false;

$array = "<?php

return ".var_export($array, true).";

?>";

$cachefile = ($path ? $path : CACHE_PATH).$file;

$strlen = file_put_contents($cachefile, $array);

@chmod($cachefile, 0777);

return $strlen;

}

登录后复制

至于其他的可以参照以上的方法进行添加,大家可以查查看对应的cache.func.php

1

2

3

4

5

6

7

8

9

10

//缓存模型表

function cache_model()

{

cache_table(DB_PRE.model, *, , , modelid, 1);

}

//缓存分类表生成文件路径是../data/cachecategory_catid.php

function cache_category()

{

cache_table(DB_PRE.category, *, , , listorder,catid, 1);

}

登录后复制

缓存类别表生成路径

1

2

3

4

5

6

../data/cache/type_typeid.php

function cache_type()

{

cache_table(DB_PRE.type, *, , , listorder,typeid, 1);

}

//缓存地区列表

登录后复制

生成路径:../data/cache/area_areaid.php

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

function cache_area()

{

cache_table(DB_PRE.area, *, , , listorder,areaid, 1);

}

//缓存用户组表

//生成路径:../data/cache member_grounp_group_id.php

function cache_member_group()

{

cache_table(DB_PRE.member_group, *, , , groupid, 1);

cache_table(DB_PRE.member_group, *, name, , groupid, 0);

}

//缓存角色表

//生成路径:../data/cache/role_roleid.php

function cache_role()

{

cache_table(DB_PRE.role, *, name, , listorder,roleid);

}

//缓存作者表

//生成路径:../data/cache/author_authorid.php

function cache_author()

{

cache_table(DB_PRE.author, *, name, , listorder,authorid, 0, 100);

}

function cache_keyword()

{

cache_table(DB_PRE.keyword, *, tag, , listorder,usetimes, 0, 100);

}

function cache_copyfrom()

{

cache_table(DB_PRE.copyfrom, *, , , listorder,usetimes, 0, 100);

}

function cache_pos()

{

cache_table(DB_PRE.position, *, name, , listorder,posid, 0);

}

登录后复制

PHP中文网,大量的免费PHPCMS教程,欢迎在线学习!

以上就是phpcms v9缓存文件是怎样生成的的详细内容,更多请关注php中文网其它相关文章!

最新文章