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

phpcms v9 源码解析(4)content模块下的index.php文件的init()方法解析的更多相关文章

  1. phpcms v9 源码解析(3)pc_base::creat_app()

    69     return self::load_sys_classs('application');          在前面我们已经知道了,这个load_sys_classs 静态方法,它加载了P ...

  2. phpcms v9 源码解析-1 index.php

    这个是phpcms V9 的入口文件index.php. V9程序的执行绝大多数是从这个文件开始的,但不绝对,在项目下面的api.php和plugin.php是另外的入口文件,这里我们先不做深究. 在 ...

  3. phpcms v9 源码解析- 2 base.php

    base.php在上文已经说过,是在PC中重要的一个文件,基本常量.核心类文件的加载都由它来完成. 9行,定义了一个常量 IN_PHPCMS,在系统的入口定义一个常量,在其他文件就判断是否这个常量被定 ...

  4. Jquery源码中的Javascript基础知识(四)— jQuery.fn.init方法

    $() 即调用了jQuery.fn.init方法 jQuery = function( selector, context ) { return new jQuery.fn.init( selecto ...

  5. 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入

    使用react全家桶制作博客后台管理系统   前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...

  6. elasticsearch源码分析之search模块(client端)

    elasticsearch源码分析之search模块(client端) 注意,我这里所说的都是通过rest api来做的搜索,所以对于接收到请求的节点,我姑且将之称之为client端,其主要的功能我们 ...

  7. 【转】Spark源码分析之-deploy模块

    原文地址:http://jerryshao.me/architecture/2013/04/30/Spark%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8B- ...

  8. ADB 源码分析(一) ——ADB模块简述【转】

    ADB源码分析(一)——ADB模块简述 1.Adb 源码路径(system/core/adb). 2.要想很快的了解一个模块的基本情况,最直接的就是查看该模块的Android.mk文件,下面就来看看a ...

  9. Locust源码目录结构及模块作用

    Locust源码目录结构及模块作用如下: 参考文章:https://blog.csdn.net/biheyu828/article/details/84031942

随机推荐

  1. mybaits 学习

    mybaits  学习(一) 注意:如果建的是web项目,run as java application 参考http://www.cnblogs.com/xdp-gacl/p/4261895.htm ...

  2. linux记录登录ip方法

    PS:Linux用户操作记录一般通过命令history来查看历史记录,但是如果因为某人误操作了删除了重要的数据,这种情况下history命令就不会有什么作用了.以下方法可以实现通过记录登陆IP地址和所 ...

  3. 1.6.7 Detecting Languages During Indexing

    1. Detecting Languages During Indexing 在索引的时候,solr可以使用langid UpdateRequestProcessor来识别语言,然后映射文本到特定语言 ...

  4. android 布局之滑动探究 scrollTo 和 scrollBy 方法使用说明

    涉及到滑动,就涉及到VIEW,大家都知道,Android的UI界面都是由一个一个的View以及View的派生类组成,View作为基类,而常用的布局里面的各种布局就是它派生出来的ViewGroup的子类 ...

  5. 【阿里云产品公测】离线归档OAS,再也不用担心备份空间了

    [阿里云产品公测]离线归档OAS,再也不用担心备份空间了 作者:阿里云用户莫须有3i 1 起步  1.1 初识OAS  啥是OAS,请看官方说明: 引用: 开放归档服务(Open Archive Se ...

  6. 【Android 界面效果24】Intent和PendingIntent的区别

    intent英文意思是意图,pending表示即将发生或来临的事情.  PendingIntent这个类用于处理即将发生的事情.比如在通知Notification中用于跳转页面,但不是马上跳转. In ...

  7. IOS设计模式六大法则

    设计模式的六大原则 单一职责原则 定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而需要修改类 ...

  8. Learn Vim

    Vim Note 很早就知道vim是一个很强大的编辑器,也用了很久.不过没有系统的总结过,这次就写个笔记方便以后看看(本文在vim下编辑完成) 第一印象 打开vim第一感觉就是无从下手,相信大多数人和 ...

  9. 系统磁盘空间/dev/xvda1占满原因分析

    由于项目原因需要定期检查磁盘空间占用情况,常用检查命令如下: 1.查看磁盘空间大小 df -lh 2.查看对应文件大小 du --max-depth=1 -h / 于一日发现在使用Flume + Ka ...

  10. 常用的Linux系统调用命令

    常用的Linux系统调用命令   下面一些函数已经过时,被新的更好的函数所代替了(gcc在链接这些函数时会发出警告),但因为兼容的原因还保留着,这些函数将在前面标上“*”号以示区别.   一.进程控制 ...