UCHome中缓存处理文件(function_cache.php)的代码分析
UCHome处理缓存的方式是通过文件的形式来存储文件,然后前台读取的是在服务器上的,这一文件写的就是一些关于uchome要缓存的一些信息,很多的内容都有重复,所以就删除了一小部分
01.<?php 02./* 03. [UCenter Home] (C) 2007-2008 Comsenz Inc. 04. $Id: function_cache.php 2009-10-22 21:48:00 05. @author ymaozi 06. @copyright http://www.codedesign.cn/ 07. @uchome源码交流QQ群:83400263 08.*/09. 10.if(!defined('IN_UCHOME')) { 11. exit('Access Denied'); 12.} 13. 14./** 15. * 更新配置文件 16. * @param bool $updatedata 17. */18.function config_cache($updatedata=true) { 19. global $_SGLOBAL; 20. 21. $_SCONFIG = array(); 22. $query = $_SGLOBAL['db']->query('SELECT * FROM '.tname('config')); //获取数据库中的配置文件信息 23. while ($value = $_SGLOBAL['db']->fetch_array($query)) { 24. if($value['var'] == 'privacy') { 25. $value['datavalue'] = empty($value['datavalue'])?array():unserialize($value['datavalue']); 26. } 27. $_SCONFIG[$value['var']] = $value['datavalue']; //将数据库中配置数据存放到全局变量$_SCONFIG中 28. } 29. cache_write('config', '_SCONFIG', $_SCONFIG); //将缓存数据写入到缓存文件中 30. 31. if($updatedata) { 32. $setting = data_get('setting'); //获取setting的配置数据 33. $_SGLOBAL['setting'] = empty($setting)?array():unserialize($setting); 34. //unserialize(),将序列化的字符串转换成数组 35. cache_write('setting', "_SGLOBAL['setting']", $_SGLOBAL['setting']); 36. //将设置文件写入到缓存文件 37. 38. $mail = data_get('mail'); 39. $_SGLOBAL['mail'] = empty($mail)?array():unserialize($mail); 40. cache_write('mail', "_SGLOBAL['mail']", $_SGLOBAL['mail']); 41. 42. $spam = data_get('spam'); 43. $_SGLOBAL['spam'] = empty($spam)?array():unserialize($spam); 44. cache_write('spam', "_SGLOBAL['spam']", $_SGLOBAL['spam']); 45. } 46.}
001./** 002. * 更新network配置文件 003. * @param bool $updatedata 004. */005.function network_cache() { 006. global $_SGLOBAL, $_SCONFIG; 007. 008. $setting = data_get('network'); 009. $_SGLOBAL['network'] = empty($setting)?array():unserialize($setting); 010. cache_write('network', "_SGLOBAL['network']", $_SGLOBAL['network']); 011. //写入缓存文件 012.} 013. 014./** 015. * 更新活动分类 016. */017.function eventclass_cache(){ 018. global $_SGLOBAL; 019. 020. $_SGLOBAL['eventclass'] = array(); 021. // 从数据库获取活动的分类 022. $query = $_SGLOBAL['db']->query("SELECT * FROM " . tname("eventclass") . " ORDER BY displayorder"); 023. while($value = $_SGLOBAL['db']->fetch_array($query)){ 024. if($value['poster']) {//如果存在发布人 025. $value['poster'] = "data/event/".$value['classid'].".jpg"; 026. } else {//使用默认的图片 027. $value['poster'] = "image/event/default.jpg"; 028. } 029. $_SGLOBAL['eventclass'][$value['classid']] = $value; 030. } 031. cache_write('eventclass', "_SGLOBAL['eventclass']", $_SGLOBAL['eventclass']); 032. //写入缓存文件 033.} 034. 035./** 036. * 更新道具信息 037. */038.function magic_cache(){ 039. global $_SGLOBAL; 040. 041. $_SGLOBAL['magic'] = array(); 042. // 从数据库获取 043. $query = $_SGLOBAL['db']->query("SELECT mid, name FROM ".tname('magic')." WHERE close='0'"); 044. while($value = $_SGLOBAL['db']->fetch_array($query)){ 045. $_SGLOBAL['magic'][$value['mid']] = $value['name']; 046. } 047. //写入道具缓存文件 048. cache_write('magic', "_SGLOBAL['magic']", $_SGLOBAL['magic']); 049.} 050. 051./** 052. * 递归清空目录 053. * @param string $dir 要清空的目录名 054. */055.function deltreedir($dir) { 056. $files = sreaddir($dir);//获取目录内的文件 057. foreach ($files as $file) { 058. if(is_dir("$dir/$file")) {//如果返回的存在目录,则再进行一次递归 059. deltreedir("$dir/$file"); 060. } else { 061. @unlink("$dir/$file");//删除文件 062. } 063. } 064.} 065. 066./** 067. * 数组转换成字串 068. * @param array $array 要转换的数组 069. * @param int $level 数组的层次 070. * @return string 返回转换后的字符串 071. */072.function arrayeval($array, $level = 0) { 073. $space = ''; 074. for($i = 0; $i <= $level; $i++) { 075. $space .= "\t"; 076. } 077. $evaluate = "Array\n$space(\n"; 078. $comma = $space; 079. foreach($array as $key => $val) { 080. //addcslashes($key, '\'\\');只对'与\进行转义 081. $key = is_string($key) ? '\''.addcslashes($key, '\'\\').'\'' : $key; 082. //如果$key不是数字,则设置为字符串,如果是数字,则直接取数字 083. $val = !is_array($val) && (!preg_match("/^\-?\d+$/", $val) || strlen($val) > 12 || substr($val, 0, 1)=='0') ? '\''.addcslashes($val, '\'\\').'\'' : $val; 084. //如果$val不是数字,则设置为字符串,如果是数字,则直接取数字 085. if(is_array($val)) { 086. //如果是数组,则再一次进行转换 087. $evaluate .= "$comma$key => ".arrayeval($val, $level + 1); 088. } else { 089. $evaluate .= "$comma$key => $val"; 090. } 091. $comma = ",\n$space"; 092. } 093. $evaluate .= "\n$space)"; 094. return $evaluate; 095.} 096. 097./** 098. * 099. * @param string $name 100. * @param <type> $var 101. * @param <type> $values 102. * 103. */104.function cache_write($name, $var, $values) { 105. $cachefile = S_ROOT.'./data/data_'.$name.'.php';//设置缓存文件地址 106. $cachetext = "<?php\r\n". 107. "if(!defined('IN_UCHOME')) exit('Access Denied');\r\n". 108. '$'.$var.'='.arrayeval($values).//将数组转换成字符串 109. "\r\n?>"; 110. if(!swritefile($cachefile, $cachetext)) { 111. exit("File: $cachefile write error."); 112. } 113.} 114. 115.?>
浙公网安备 33010602011771号