腾讯云网站解决方案帮您轻松应对建站成本高/网络不稳等常见问题
产品框架
  • [目录结构] 目录结构

    下面是Discuz! 的文件目录及对应的描述。日常的开发中主要会涉及到source和template目录。虽然目录和文件都很多,但是实际上结构还是很清晰,大多数情况下通过文件名和目录就能知道某个文件的作用。比如:


    \source\class\discuz\discuz_censor.php  用来处理敏感词过滤的类

    \source\function\function_credit.php  处理积分操作的函数库 

    \source\module\forum\forum_viewthread.php 处理帖子显示页面的模块


    另外,source目录下的class、function、module、include、admincp这几个文件夹下的程序文件命名要遵守如下规则:文件名前缀为所在目录的名字加上下划线(_)目录结构详细:


    /┬── api 外部接口
     │      ├── connect 腾讯互联
     │      ├── db UCenter数据库备份接口
     │      ├── google Google引擎使用
     │      ├── javascript 数据和广告的 JS调用
     │      ├── manyou manyou应用及搜索等相关服务
     │      └── trade 在线支付接口
     ├── archiver 论坛静态化
     ├── config 站点配置文件
     ├── data 数据缓存及附件
     │      ├── attachment 上传的文件目录
     │      │      ├── album 相册专用
     │      │      ├── block DIY专用
     │      │      ├── common 公共上传
     │      │      ├── forum 论坛附件专用
     │      │      ├── group 群组图标和头部图片专用
     │      │      ├── portal 门户上传文件专用
     │      │      ├── profile 个人资料专用
     │      │      └── temp 临时文件
     │      ├── avatar 视频认证专用
     │      ├── backup 站点数据备份
     │      ├── cache 数据缓存
     │      ├── diy DIY模块缓存
     │      ├── ipdata Discuz!IP库
     │      ├── log 站点日志,前/后台管理日志、错误日志等
     │      ├── plugindata 插件缓存数据
     │      ├── template 模板缓存目录
     │      └── threadcache 帖子缓存
     ├── install 安装目录
     ├── source 代码主目录
     │      ├── admincp 后台程序
     │      │      ├── cloud Discuz!云平台
     │      │      ├── menu 菜单
     │      │      └── moderate 审核功能
     │      ├── archiver 论坛静态化功能代码
     │      ├── class 类文件目录
     │      │      ├── adv 站点广告功能
     │      │      ├── block DIY模块功能文件
     │      │      ├── cache 缓存类
     │      │      ├── db 数据库类
     │      │      ├── discuz discuz类
     │      │      ├── forum 论坛
     │      │      ├── helper 存放从function_core分离出来的一部分函数
     │      │      ├── lib 工具类的集合类
     │      │      ├── magic 道具
     │      │      ├── memory 内存类
     │      │      ├── secqaa 验证问答
     │      │      ├── table 数据表操作类
     │      │      └── task 站点任务功能
     │      ├── function 函数文件
     │      │      └── cache 缓存功能拆分目录
     │      ├── include 被包含的文件
     │      │      ├── collection 淘帖
     │      │      ├── cron 计划任务
     │      │      ├── misc 杂项
     │      │      ├── modcp 前台论坛管理
     │      │      ├── portalcp 前台门户管理
     │      │      ├── post 帖子相关
     │      │      ├── search 搜索功能
     │      │      ├── space 家园和个人相关功能
     │      │      ├── spacecp 个人设置相关
     │      │      ├── table 编码转换数据
     │      │      ├── thread 查看主题相关
     │      │      └── topicadmin 前台主题管理
     │      ├── language 站点语言包
     │      │      ├── adv 广告
     │      │      ├── block DIY模块
     │      │      ├── forum 论坛
     │      │      ├── group 群组
     │      │      ├── home 家园
     │      │      ├── magic 道具
     │      │      ├── member 登录注册页面语言
     │      │      ├── mobile 手机访问功能语言
     │      │      ├── portal 门户语言
     │      │      ├── ranklist 排行榜语言
     │      │      ├── search 搜索
     │      │      ├── secqaa 安全问答
     │      │      ├── tag 标签
     │      │      ├── task 任务
     │      │      └── userapp manyou应用
     │      ├── module 功能模块
     │      │      ├── connect 腾讯互联
     │      │      ├── forum 论坛
     │      │      ├── group 群组
     │      │      ├── home 家园
     │      │      ├── member 登录注册
     │      │      ├── misc 杂项
     │      │      ├── portal 门户
     │      │      ├── search 搜索
     │      │      └── userapp 应用
     │      └── plugin 插件目录
     │              ├── cloudstat Discuz!云平台
     │              ├── myapp Manyou应用
     │              ├── myrepeats 马甲功能
     │              ├── qqconnect 腾讯互联
     │              └── soso_smilies 腾讯搜搜表情
     ├── static 非PHP文件
     │      ├── image 界面图片
     │      ├── js 站点JS脚本
     │      ├── space 空间皮肤
     │      └── topic 门户皮肤
     ├── template 模板目录
     │      └── default 默认风格
     ├── uc_client UCenter客户端程序
     └── uc_server UCenter服务端程序
  • [自动加载] 自动加载

    Discuz! X2.5要求PHP版本大于5.1,抛弃了对PHP4的支持,因此支持更多的PHP新特性,自动加载类文件就是其中一个。在class_core.php中有这样一段代码:

    if(function_exists('spl_autoload_register')) {
    spl_autoload_register(array('core', 'autoload'));
    } else {
    function __autoload($class) {
    return core::autoload($class);
    }
    }
  • [用户输入的处理] 用户输入数据的处理

    Discus! X2.5之前版本对$_GET和$_POST的值默认是进行addslashes处理,函数在使用此值时信任外部数据的安全性,但这样处理的弊端是容易生产二次注射的漏洞,为了防止此类漏洞的产生,函数必须不信任任何数据外部数据的安全性,为此我们做了以下的处理增强系统安全:
    $_GET和$_POST的值默认不做addslashes处理
    $_GET为$_GET和$_POST数组的合并,代码中统一使用$_GET取值
    $_G['gp_xx']的写法默认不再支持,config.php中有兼容开关
      $_config['input']['compatible'] = 1;// $_GET|$_POST的兼容处理,0为关闭,
    1为开启;开启后即可使用$_G['gp_xx'](xx为变量名,$_GET和$_POST集合的所有变量 名),值为已经addslashes()处理过,兼容插件;
  • [数据库DB层] 原DB类的改进

    Discuz! X2.5新版对数据库DB层进行了功能和安全方面的加强:

    addslashes的处理
    仅insert(),update(),delete() 方法对传入其的数组形式的参数进行 intval 或 addslashes 安全处理,字符串形式的参数将不处理,请注意

    新添加的方法 fetch_all($sql),order(), limit(),field() 等方法
    其中 fetch_all 方法以数组方式返回查询多条记录数据,且可以设置数据的 KEY 值使用某字段值; order(),limit(),field() 返回 SQL 语句中相应的部分

    SQL 语句 format 的支持
    //例:查询10个用户uid大于100的用户数据,以uid为返回结果数组的key
    $arr = DB::fetch_all('SELECT * FROM %t WHERE uid>%d LIMIT %d', array('common_member', '100', '10'), 'uid');
    支持的fomat有:
     %t
    DB::table()
     %d
    intval()
     %s
    addslashes()
     %n
    in IN (1,2,3)
     %f
    sprintf('%f', $var)
     %i
    直接使用不进行处理

    直接使用不进行处理

    返回值的处理
    在非UNBUFFERED的情况下:INSERT SQL 语句返回 insert_id();UPDATE 和 DELETE SQL 语句返回 affected_rows()
  • [数据库DB层] 新增数据层:数据层的规范和约定

    一个数据表一个class文件,以table_加上不带前缀的表名命名,尽量不操作其它表;
    不能使用$_G、$POST、$GET等全局变量;
    关联查询(JOIN)尽量拆分为单条查询,不能拆分的放入主表的类中;
    方法名以下划线分隔,全部为小写,全部为单数,直接返回结果,保留关键字:on、get、set, 方法参数不能以数组的形式传入,数据可以;
    除数据表文件以外,其它文件禁止出现SQL语句;
    查询结果返回一行记录方法名使用fetch开头,返回多行记录方法名使用fetch_all开头,查询中使用SQL语句count函数返回一个数值的使用count开头;
    方法名中by后面的是以下划线(_)分隔的表字段名,不要使用复数型,例如: fetch_all_by_uid()而不是fetch_all_by_uids();
    方法名需去掉表名,如:common_member表类方法 fetch_member_by_username应命名为fetch_by_username;
    数据表类继承discuz_table基类,基类实现CURD操作,fetch方法实现了根据一个主键 值得到一行记录、fetch_all方法实现了根据一组主键值得到多行记录(二维数据,主 键值为 key)、count方法返回了表的总记录数据;
    如果表是无主键或是关联主键,则基类中的CURD将不能使用,需自己在相应的表类中实现, 同时将$this->_pk设置为空;
    DB层封装的函数实现了addslashes,个别直接写sql语句的需主意addslashes;
    使用C::t('tablename')->method();调用;
    C::t插件调用方式
    表名:mytablename 
    目录:source/plugin/mypluginid/table/table_mytablename.php 
    类名:table_mytablename 
    用法:C::t('#mypluginid#mytablename')->method();

  • [模板机制] 模板机制原理

    Discuz! X2.5 拥有完善的模版机制,支持模版和程序的分离,方便模版风格的扩展开发。Discuz! X2.5 拥有完善的模版机制,支持模版和程序的分离,方便模版风格的扩展开发。
    通常模版文件存放在template目录下,文件格式为 htm。在加载模版的时候通常就是简单的一句:

    include template('dir/filename');

    其中 dir 为目录名称,filename 为文件名称。这个时候 Discuz! 的模版引擎主要进行了如下的行为:
    根据传入的参数计算得到完整的文件路径和名称
    检查文件是否存在以及解析之后的模版缓存是否存在及是否已经过期
    根据上一步判定是否进行模版的解析如过解析的话,将解析后的可执行文件存入 ./data/template/ 下以备调用
    返回解析后的 php 文件地址并加载
    加载成功

  • [模板机制] PHP格式的模版

    从 Discuz! X2.5 开始,模板文件支持 PHP 扩展名的格式,你可以创建例如 ./template/mytext/common/forum/discuz.php 文件,PHP 的模板文件中你只需在原有 HTM 的模板文件开头添加一行代码即可,如:
    <?php exit;?>

    <?php echo '你不能看此模板的内容';exit;?>

    PHP 的模板文件的模板数据内容将从文件的第二行开始解析。PHP 和 HTM 模板文件同时存在时,会优先解析 PHP 模板文件
  • [缓存机制] Discuz! 缓存

    Discuz! X2.5 的 config_global.php 中有这样一行代码

    $_config['cache']['type'] = 'sql';

    这就是 Discuz! 内置的缓存方式,如果填写 'sql' 则为使用数据库缓存,填写 'file' 则为使用文件缓存。

  • [模板机制] 模版语法

    变量输出

    输出一个变量的值,等同于php的 ,花括号可以省略但不建议去掉。

    {$my_var}

    条件判断

    通过if判断流程分支,如果写在HTML表单元素中,可以省去使代码更清晰易读,如{if $my_var}xxx{/if}

    <!--{if $my_var}-->
        任意html语句
    <!--{/if}-->

    带有多条件的if写法,可使用PHP常规判断中的按位运算符等

    <!--{if $my_var && ($my_var2 & 1 || $my_var3 == 3)}-->
        任意html语句
    <!--{/if}-->

    带有分支条件的if写法

    <!--{if $my_var == 1}-->
        变量为1
    <!--{elseif $my_var == 2}-->
        变量为2
    <!--{else}-->
        其他情况
    <!--{/if}-->

    循环输出

    带有数组键的循环写法

    <!--{loop $my_arr $key $val}-->
        循环输出的HTML语句
    <!--{/loop}-->

    没有数组键的循环写法

    <!--{loop $my_arr $val}-->

    模板嵌套

    将被嵌套模板内容解析为PHP语句并合并入本模板中的写法,common/header 对应某个模板套系中的common目录的header.htm模板文件

    <!--{subtemplate common/header}-->
    程序运行时include嵌套模板内容

    <!--{template common/header}-->

    插件钩子

    在模板中设立插件钩子,hook为关键词,意为将index_top定义为钩子

    <!--{hook/index_top}-->
    变量数组嵌套使用
    条件判断或变量输出时用到

    <!--{if $my_arr[$my_var]}-->
    <!--{if $my_arr[0]}-->
    <!--{if $my_arr[$my_arr2[$my_var]]}-->

    PHP解析

    在模板中使用PHP语句可以通过{eval }进行
    <!--{eval $my_var = 1;}-->
    <!--{eval echo $my_var;}-->
    <!--{eval $my_arr = array(1, 2, 3);}-->
    <!--{eval print_r($my_arr);}-->
    <!--{eval output();}-->
    <!--{eval exit();}-->

    语言包使用

    在模板中可以通过下面的代码来使用语言包中的某个值
    {lang index_yesterday}

    其中语言包在 ./source/language/目录下,以PHP数组形式存放
  • [缓存机制] 内存级缓存

    缓存层的引入是为了解决MYSQL自身对高并发处理的性能瓶颈,目前产品缓存层采用主流的Key-Value对形式,内存级的缓存产品很多,支持的内存优化接口有 Memcache、eAccelerator、Alternative PHP Cache(APC)、Xcache、Redis 五种,优化系统将会依据当前服务器环境依次选用接口,单服务器环境中推荐使用APC,多服务器环境中推荐使用Redis或Memcache。

    数据层是以表为单位的类文件,所有表类都继承discuz_table基类,基类实现缓存操 作的相关函数;理论上所有的数据表均可以缓存,目前产品在六个压力大的数据表内置开启了缓存 机制:用户相关表、回帖、主题、主题和专辑关系、淘贴专辑、用户关注关系。

    用户相关表
    缓存表:'common_member', 'count', 'status','profile', 'field_home', 'field_forum'。
    UID为缓存KEY。表数据更新时缓存数据会同步更新。

    回帖
    以TID为单位,缓存第一页的post数据。表数据更新时缓存数据会同步更新。

    主题
    TID为缓存KEY。表数据更新时缓存数据会同步更新。
    版块列表默认参数第一页时以 forumdisplay_FID 为缓存KEY,缓存时间内数据不更新。

    主题和专辑关系
    以TID为单位,此TID的专辑ID集合,表数据更新时缓存数据会同步更新。

    淘贴专辑
    以TID为单位,此TID的专辑集合,缓存时间内数据不更新。

    用户关注关系
    以UID为单位,此UID关注用户的关系数据,缓存时间内数据不更新。

    内存级缓存层实现细节

    discuz_table基类中缓存机制的实现
     /** 
    * @var string 缓存主键名前缀,为空时表示此表不支持缓存 
    */ 
    protected $_pre_cache_key; 

    /** 
    * @var string 缓存时间,以秒为单位,0表示永久或相关配置文件中的默认值 
    */ 
    protected $_cache_ttl; 

    discuz_table基类中缓存机制的方法


    //缓存一个变量到缓存中,如果 KEY已经在则会被覆盖为新值
    store_cache($id, $data, $cache_ttl = null, $pre_cache_key = null)
    //获取指定KEY的缓存数据
    fetch_cache($ids, $pre_cache_key = null)
    //清除指定KEY的缓存
    clear_cache($ids, $pre_cache_key = null)
    //更新一个已经存在的KEY,只更新修改的字段
    update_cache($id, $data, $cache_ttl = null, $pre_cache_key = null)
    //批量更新缓存,只更新已经存在KEY的指定修改的字段
    update_batch_cache($ids, $data, $cache_ttl = null, $pre_cache_key = null)
    //重置已经存在的KEY的值
    reset_cache($ids, $pre_cache_key = null)
    //累加缓存数据中某字段的值
    increase_cache($ids, $data, $cache_ttl = null, $pre_cache_key = null)



123下一页
网站简介

球球发,是一家 Discuz! 商业插件、风格模板、网站源码、 Discuz!运营维护技术等于一体的交流分享网站,全站95%的资源都是免费下载,对于资源我们是每天更新,每个亲测资源最新最全---球球发(如果我们有侵犯了您权益的资源请联系我们删除