• phpcms v9 源码解析(4)content模块下的index.php文件的init()方法解析


    在了解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=phpcmscachescaches_commonscaches_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));
        }
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
       

  • 相关阅读:
    Jenkins配置钉钉通知
    Jenkins 学习笔记
    2020年10月26日Britain suggests it may overturn parts of the EU withdrawal agreement
    【火爆抢答中】HarmonyOS有奖问答,更多惊喜等你来拿!
    三七互娱《斗罗大陆:魂师对决》上线,Network Kit助力玩家即刻畅玩
    运动健康南向设备接入服务传输数据解析举例
    华为商品管理系统批量更新商品时提示:请至少输入一组国家码和价格
    云空间服务,助力用户数据存储与协同
    Input组件无点击效果
    华为视频编辑服务(Video Editor Kit),助力开发者高效构建应用视频编辑能力
  • 原文地址:https://www.cnblogs.com/Hebe0115/p/3491234.html
Copyright © 2020-2023  润新知