在了解index.php中的init函数的时候,让我们先看看最开始的几行代码
1-5 第二行, defined('IN_PHPCMS') or exit('Nopermission resources'); 我的这个index.php文件绝对路径是这样 http://localhost/phpcms/phpcms/modules/content/index.php 当我直接打开的时候 ,提示错误, No permission resources. 这是phpcms 单一入口的体现,文件不能直接访问,必须遵守phpcms的规则 3-5行, 分别定义了CACHE_MODEL_PATH 模型缓存路径 加载了 content模块里面的util.func.php文件
接下来就是index类,在这个文件里,我们将初窥phpcms的模板机制 7 先定义了一个私有变量 $db; 8-13 构造函数中 先加载了 content_model模型,这个模型我们先放着,不去了解 接着就是cookie判断,在param类中,其中cookie都是加密的,加密函数在global.func.php函数库中
然后就是init()函数了 从16-27行,大家应该都能看懂,先是站点设置,其中 $siteid=1 为默认站点 然后define('SITEID',$siteid); 这3个变量,前面已经稍稍带过了 这个seo 我也没有注意,朋友可以自行看下。 重点是从28-31行,这4行代码引出了很多东西,因为函数传参的不同,会导致逻辑很大的不同。 所以我们先按照这个默认里面的传参来进行下去。 $sitelist=getcache('sitelist','commons'); 我们进入global.func.php来看下这个函数 /** * 读取缓存,默认为文件缓存,不加载缓存配置。 * @param string $name 缓存名称 * @param $filepath 数据路径(模块名称) * @param string $config 配置名称 getcache('sitelist','commons'); */ function getcache($name, $filepath='', $type='file', $config='') { pc_base::load_sys_class('cache_factory','',0); if($config) { $cacheconfig = pc_base::load_config('cache'); $cache = cache_factory::get_instance($cacheconfig)->get_cache($config); } else { $cache = cache_factory::get_instance()->get_cache($type); } return $cache->get($name, '', '', $filepath); } 先看看原著的解释 读取缓存,默认是文件缓存,不加载缓存配置。 那么说默认是文件缓存,是不是可以为memcache呢?或者其他, 然后加载了memcache的配置信息就可以直接用了呢?只是打开下思路,现在不去深究 我们来看代码吧!! pc_base:load_sys_class('cache_factory','',0); 加载cache_factory(缓存工厂类),参数0代表不实例化, 那么大家想到了什么,对,里面应该有茫茫多的草泥马,茫茫多的静态属性吧! 然后if($config)默认的是空,而且我们也没有传参,直接往下走 $cache=cache_factory::get_instance()->get_cache($type); 没办法,打开cache_factory.class.php,直接找到get_instance() /** * 返回当前终级类对象的实例 * @param $cache_config 缓存配置 * @return object $cache = cache_factory::get_instance()->get_cache($type); */ public static function get_instance($cache_config = '') { if(cache_factory::$cache_factory == '' || $cache_config !='') { cache_factory::$cache_factory = new cache_factory(); if(!empty($cache_config)) { cache_factory::$cache_factory->cache_config = $cache_config; } } return cache_factory::$cache_factory; } 大家看一下代码按照现在我们的逻辑程序走下去,发现这个函数撒也没做,到最后又返回了这个对象 但其实,如果改变下参数就发现,程序就变得大不一样,现在我们不去做改变,先去了解下这个系统, 所以我们按照最开始的步骤走下去,这个函数直接return了这个对象,然后掉用了get_cache方法 /** * 获取缓存操作实例 * @param $cache_name 缓存配置名称 //file */ public function get_cache($cache_name) { if(!isset($this->cache_list[$cache_name]) || !is_object($this->cache_list[$cache_name])) { $this->cache_list[$cache_name] = $this->load($cache_name); } return $this->cache_list[$cache_name]; } 在global.func.php中 $cache=cache_factory::get_instance()->get_cache($type) 其中 $type=file 那么(!isset($this->cache_list[$cache_name])) 这段代码为真,后面的!is_object 是个深深的疑问 $this->cache_list[$cache_name]=$this->load($cache_name);就是 $this->cache_list['file']=$this->load('file') 到这里,我们又不得不进入load()函数里面瞧瞧了 /** * 加载缓存驱动 * @param $cache_name 缓存配置名称 * @return object //file */ public function load($cache_name) { $object = null; if(isset($this->cache_config[$cache_name]['type'])) { switch($this->cache_config[$cache_name]['type']) { case 'file' : $object = pc_base::load_sys_class('cache_file'); break; case 'memcache' : define('MEMCACHE_HOST', $this->cache_config[$cache_name]['hostname']); define('MEMCACHE_PORT', $this->cache_config[$cache_name]['port']); define('MEMCACHE_TIMEOUT', $this->cache_config[$cache_name]['timeout']); define('MEMCACHE_DEBUG', $this->cache_config[$cache_name]['debug']); $object = pc_base::load_sys_class('cache_memcache'); break; case 'apc' : $object = pc_base::load_sys_class('cache_apc'); break; default : $object = pc_base::load_sys_class('cache_file'); } } else { $object = pc_base::load_sys_class('cache_file'); } return $object; } 我们细看这个函数,发现在第一个判断的时候就不能往下执行 , 返回了 $object=pc_bace::load_sys_class('cache_file') 那我们细看下这个判断语句发现 phpcms的缓存机制有很多,memcache,apc 根据这个type类型的不同,可以选择不同的缓存,这里不多讲了,有兴趣的朋友自己研究下了 那么 $cache = cache_factory::get_instance()->get_cache($type); $cache 就是实例化的cache_file.class.php 那么 return $cache->get($name, '', '', $filepath); 就是 $cache->get('sitelist','','','commons'); 我们进入cache_file.class.php 查看get()函数 /** * 获取缓存 * @param string $name 缓存名称 * @param array $setting 缓存配置 * @param string $type 缓存类型 * @param string $module 所属模型 * @return mixed $data 缓存数据 return $cache->get('sitelist', '', '', 'commons'); */ public function get($name, $setting = '', $type = 'data', $module = ROUTE_M) { $this->get_setting($setting); if(empty($type)) $type = 'data'; if(empty($module)) $module = ROUTE_M; $filepath = CACHE_PATH.'caches_'.$module.'/caches_'.$type.'/'; $filename = $name.$this->_setting['suf']; if (!file_exists($filepath.$filename)) { return false; } else { if($this->_setting['type'] == 'array') { $data = @require($filepath.$filename); } elseif($this->_setting['type'] == 'serialize') { $data = unserialize(file_get_contents($filepath.$filename)); } return $data; } } $this->get_setting($setting) 找到get_setting函数,因为$setting为空,所以函数没有执行 接下来的代码比较简单 $type='data' $module='commons'; $filepath=phpcms\caches\caches_commons\caches_data $filename=sitelist.cache.php 下面的是个判断 if(!file_exists($filepath.$filename)){return false;} 在这里文件是存在的,那么程序继续 if($this->_setting['type']=='array'){ $data=@require($filepath.$filename); }elseif($this->_setting['type']=='serialize'){ $data=unserizlize(file_get_contents($filepath.$filename)); }
|
请发表评论