您现在的位置是:首页 > cms教程 > Discuz教程Discuz教程
Discuz!NT分析Config实现方法介绍
听寒2025-07-10Discuz教程已有人查阅
导读其实很早的时候就想琢磨下Discuz!NT的一些东西,今天着重吧Discuz的有关于配置的信息研究了下,拿出来与大家共同分享下Discuz!NT在web.config自定义了httpModule
其实很早的时候就想琢磨下Discuz!NT的一些东西,今天着重吧Discuz的有关于配置的信息研究了下,拿出来与大家共同分享下Discuz!NT在web.config自定义了httpModule模块去实现了
OnlineUsers.ResetOnLineList首先将用户信息清零
这是上面的是大方向,今天就说一个地方:ScheduleConfigs.GetConfig()这句话,也就是Discuz!NT 采用的配置文件方式Discuz!NT 将配置文件大部分的放入了web底下的config 目录里了。
介绍下各个类的作用
ScheduleConfigs 是对外部公开的对象,它仅有两个功能,一是读出配置文件,二是存储配置文件信息,均无参数/ScheduleConfigInfo 是一个领域模型,对应相应配置的config,为了统一方便处理,这里实现了仅作规定约束的IConfigInfo接口,此接口没有任何内容。
实现ScheduleConfigs 中的功能主要依赖于ScheduleConfigFileManager,其中用static 存储配置信息,由于是static型的,则只需要存储一次即可供全局共享大概就是这样,后来我把Discuz!NT 的配置单独抽出来了,大概是这样的样子的在这里我只向外部暴露DeclareDatertimeConfigs 这个类,其余的都为internal
部分代码如下
var config = DeclareDateTimeConfigs.GetConfig();即可得到配置信息存储配置信息也很简单DeclareDateTimeConfigs.SaveConfig(config);因为此处是static 所以可以不用考虑缓存的问题。
IHttpModule<httpModules>
<add type="Discuz.Forum.HttpModule, Discuz.Forum" name="HttpModule" />
</httpModules>这样的话,在程序启动的时候,则首先执行此处的HttpModule里的Init方法
public void Init(HttpApplication context)
{
OnlineUsers.ResetOnlineList();
context.BeginRequest += new EventHandler(ReUrl_BeginRequest);
if (eventTimer == null && ScheduleConfigs.GetConfig().Enabled)
{
EventLogs.LogFileName = Utils.GetMapPath(string.Format("{0}cache/scheduleeventfaildlog.config",
BaseConfigs.GetForumPath));
EventManager.RootPath = Utils.GetMapPath(BaseConfigs.GetForumPath);
eventTimer = new Timer(new TimerCallback(ScheduledEventWorkCallback), context.Context,
60000, EventManager.TimerMinutesInterval * 60000);
}
context.Error += new EventHandler(Application_OnError);
}
一行一行的讲解:OnlineUsers.ResetOnLineList首先将用户信息清零
context.BeginRequest += new EventHandler(ReUrl_BeginRequest)
这行代码指定地址请求处理的方法(ReUrl_BeginRequest这个方法是处理URL 地址的)
if(eventTimer == null && ScheduleConfigs.GetConfig().Enabled)
判断是否配置开启了“计划任务”且计时器是否初始化如果开启了“计划任务”且计时器未启动,则启用计划任务信息之后context.Error += new EventHandler(Application_OnError) 为异常处理这是上面的是大方向,今天就说一个地方:ScheduleConfigs.GetConfig()这句话,也就是Discuz!NT 采用的配置文件方式Discuz!NT 将配置文件大部分的放入了web底下的config 目录里了。
介绍下各个类的作用
ScheduleConfigs 是对外部公开的对象,它仅有两个功能,一是读出配置文件,二是存储配置文件信息,均无参数/ScheduleConfigInfo 是一个领域模型,对应相应配置的config,为了统一方便处理,这里实现了仅作规定约束的IConfigInfo接口,此接口没有任何内容。
实现ScheduleConfigs 中的功能主要依赖于ScheduleConfigFileManager,其中用static 存储配置信息,由于是static型的,则只需要存储一次即可供全局共享大概就是这样,后来我把Discuz!NT 的配置单独抽出来了,大概是这样的样子的在这里我只向外部暴露DeclareDatertimeConfigs 这个类,其余的都为internal
部分代码如下
public class DeclareDateTimeConfigs
{
/// <summary>
/// 获取配置类实例
/// </summary>
/// <returns></returns>
public static DeclareDateTimeConfigInfo GetConfig()
{
return DeclareDateTimeConfigFileManager.LoadConfig();
}
/// <summary>
/// 保存配置类实例
/// </summary>
/// <returns></returns>
public static bool SaveConfig(DeclareDateTimeConfigInfo declareDateTimeConfigInfo)
{
DeclareDateTimeConfigFileManager scfm = new DeclareDateTimeConfigFileManager();
DeclareDateTimeConfigFileManager.ConfigInfo = declareDateTimeConfigInfo;
return scfm.SaveConfig();
}
}
internal class DeclareDateTimeConfigFileManager:DefaultConfigFileManager
{
private static DeclareDateTimeConfigInfo m_configinfo;
/// <summary>
/// 锁对象
/// </summary>
private static object m_lockHelper = new object();
/// <summary>
/// 文件修改时间
/// </summary>
private static DateTime m_fileoldchange;
/// <summary>
/// 初始化文件修改时间和对象实例
/// </summary>
static DeclareDateTimeConfigFileManager() {
m_fileoldchange = System.IO.File.GetLastWriteTime(ConfigFilePath);
m_configinfo = (DeclareDateTimeConfigInfo)DefaultConfigFileManager.DeserializeInfo(ConfigFilePath, typeof(DeclareDateTimeConfigInfo));
}
public new static IConfigInfo ConfigInfo
{
get { return m_configinfo; }
set { m_configinfo = (DeclareDateTimeConfigInfo)value; }
}
/// <summary>
/// 配置文件所在路径
/// </summary>
public static string filename = null;
/// <summary>
/// 获取配置文件所在路径
/// </summary>
public new static string ConfigFilePath
{
get
{
if (filename == null)
{
{
filename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Config\\DeclareDateTime.config");
}
if (!File.Exists(filename))
{
throw new Exception("发生错误: 虚拟目录或网站根目录下没有正确的DNT.config文件");
}
}
return filename;
}
}
/// <summary>
/// 加载配置类
/// </summary>
/// <returns></returns>
public static DeclareDateTimeConfigInfo LoadConfig()
{
ConfigInfo = DefaultConfigFileManager.LoadConfig(ref m_fileoldchange, ConfigFilePath, ConfigInfo);
return ConfigInfo as DeclareDateTimeConfigInfo;
}
/// <summary>
/// 加载真正有效的配置类
/// </summary>
/// <returns></returns>
public static DeclareDateTimeConfigInfo LoadRealConfig()
{
ConfigInfo = DefaultConfigFileManager.LoadConfig(ref m_fileoldchange, ConfigFilePath, ConfigInfo, false);
return ConfigInfo as DeclareDateTimeConfigInfo;
}
/// <summary>
/// 保存配置
/// </summary>
/// <returns></returns>
public override bool SaveConfig()
{
return base.SaveConfig(ConfigFilePath, ConfigInfo);
}
}
internal class DefaultConfigFileManager
{
/// <summary>
/// 文件所在路径变量
/// </summary>
private static string m_configfilepath;
/// <summary>
/// 临时配置对象变量
/// </summary>
private static IConfigInfo m_configinfo = null;
/// <summary>
/// 锁对象
/// </summary>
private static object m_lockHelper = new object();
/// <summary>
/// 文件所在路径
/// </summary>
public static string ConfigFilePath
{
get { return m_configfilepath; }
set { m_configfilepath = value; }
}
/// <summary>
/// 临时配置对象
/// </summary>
public static IConfigInfo ConfigInfo
{
get { return m_configinfo; }
set { m_configinfo = value; }
}
/// <summary>
/// 加载(反序列化)指定对象类型的配置对象
/// </summary>
/// <param name="fileoldchange">文件加载时间</param>
/// <param name="configFilePath">配置文件所在路径</param>
/// <param name="configinfo">相应的变量 注:该参数主要用于设置m_configinfo变量 和 获取类型.GetType()</param>
/// <returns></returns>
protected static IConfigInfo LoadConfig(ref DateTime fileoldchange, string configFilePath, IConfigInfo configinfo)
{
return LoadConfig(ref fileoldchange, configFilePath, configinfo, true);
}
/// <summary>
/// 加载(反序列化)指定对象类型的配置对象
/// </summary>
/// <param name="fileoldchange">文件加载时间</param>
/// <param name="configFilePath">配置文件所在路径(包括文件名)</param>
/// <param name="configinfo">相应的变量 注:该参数主要用于设置m_configinfo变量 和 获取类型.GetType()</param>
/// <param name="checkTime">是否检查并更新传递进来的"文件加载时间"变量</param>
/// <returns></returns>
protected static IConfigInfo LoadConfig(ref DateTime fileoldchange, string configFilePath, IConfigInfo configinfo, bool checkTime)
{
lock (m_lockHelper)
{
m_configfilepath = configFilePath;
m_configinfo = configinfo;
if (checkTime)
{
DateTime m_filenewchange = System.IO.File.GetLastWriteTime(configFilePath);
//当程序运行中config文件发生变化时则对config重新赋值
if (fileoldchange != m_filenewchange)
{
fileoldchange = m_filenewchange;
m_configinfo = DeserializeInfo(configFilePath, configinfo.GetType());
}
}
else
m_configinfo = DeserializeInfo(configFilePath, configinfo.GetType());
return m_configinfo;
}
}
/// <summary>
/// 反序列化指定的类
/// </summary>
/// <param name="configfilepath">config 文件的路径</param>
/// <param name="configtype">相应的类型</param>
/// <returns></returns>
public static IConfigInfo DeserializeInfo(string configfilepath, Type configtype)
{
return (IConfigInfo)SerializationHelper.Load(configtype, configfilepath);
}
/// <summary>
/// 保存配置实例(虚方法需继承)
/// </summary>
/// <returns></returns>
public virtual bool SaveConfig()
{
return true;
}
/// <summary>
/// 保存(序列化)指定路径下的配置文件
/// </summary>
/// <param name="configFilePath">指定的配置文件所在的路径(包括文件名)</param>
/// <param name="configinfo">被保存(序列化)的对象</param>
/// <returns></returns>
public bool SaveConfig(string configFilePath, IConfigInfo configinfo)
{
return SerializationHelper.Save(configinfo, configFilePath);
}
}
internal class SerializationHelper
{
private SerializationHelper()
{ }
private static Dictionary<int, XmlSerializer> serializer_dict = new Dictionary<int, XmlSerializer>();
public static XmlSerializer GetSerializer(Type t)
{
int type_hash = t.GetHashCode();
if (!serializer_dict.ContainsKey(type_hash))
serializer_dict.Add(type_hash, new XmlSerializer(t));
return serializer_dict[type_hash];
}
/// <summary>
/// 反序列化
/// </summary>
/// <param name="type">对象类型</param>
/// <param name="filename">文件路径</param>
/// <returns></returns>
public static object Load(Type type, string filename)
{
FileStream fs = null;
try
{
// open the stream...
fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
XmlSerializer serializer = new XmlSerializer(type);
return serializer.Deserialize(fs);
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (fs != null)
fs.Close();
}
}
/// <summary>
/// 序列化
/// </summary>
/// <param name="obj">对象</param>
/// <param name="filename">文件路径</param>
public static bool Save(object obj, string filename)
{
bool success = false;
FileStream fs = null;
// serialize it...
try
{
fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
XmlSerializer serializer = new XmlSerializer(obj.GetType());
serializer.Serialize(fs, obj);
success = true;
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (fs != null)
fs.Close();
}
return success;
}
/// <summary>
/// xml序列化成字符串
/// </summary>
/// <param name="obj">对象</param>
/// <returns>xml字符串</returns>
public static string Serialize(object obj)
{
string returnStr = "";
XmlSerializer serializer = GetSerializer(obj.GetType());
MemoryStream ms = new MemoryStream();
XmlTextWriter xtw = null;
StreamReader sr = null;
try
{
xtw = new System.Xml.XmlTextWriter(ms, Encoding.UTF8);
xtw.Formatting = System.Xml.Formatting.Indented;
serializer.Serialize(xtw, obj);
ms.Seek(0, SeekOrigin.Begin);
sr = new StreamReader(ms);
returnStr = sr.ReadToEnd();
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (xtw != null)
xtw.Close();
if (sr != null)
sr.Close();
ms.Close();
}
return returnStr;
}
public static object DeSerialize(Type type, string s)
{
byte[] b = System.Text.Encoding.UTF8.GetBytes(s);
try
{
XmlSerializer serializer = GetSerializer(type);
return serializer.Deserialize(new MemoryStream(b));
}
catch (Exception ex)
{
throw ex;
}
}
}
使用时候非常方便,使用下列语句var config = DeclareDateTimeConfigs.GetConfig();即可得到配置信息存储配置信息也很简单DeclareDateTimeConfigs.SaveConfig(config);因为此处是static 所以可以不用考虑缓存的问题。
本文标签:
很赞哦! ()
下一篇:Discuz源码调试方法
相关教程
- discuz的config_global.php文件设置说明
- Discuz的NT配置文件类discuz.config说明
- phpcms的config配置文件
- 易优CMS插件config.php配置文件修改说明
- PbootCMS执行SQL发生错误“no such table: ay_config”怎么解决
- PbootCMS执行SQL报错no such table: ay_config的解决方法
- ecshop配置文件config怎么填
- pbootcms打开网站报错:执行SQL发生错误!错误: no such table:ay_config的解决方法
- ecshop出现shop_config错误的解决方法
- 易优插件config.php配置文件参数说明
- wordpress找不到wp config.php怎么办
图文教程
discuz uc_server登录配置教程
新运行uc_server环境,先配置好ucenter链接-----这部很重要,我从新环境中安装下载的discuz代码,这部没配置,密码又不知道,怎么更改调试,都不起作用,在框架中
从数据库直接导入帖子到Discuz论坛的方法
因为我的一个网站需要升级成discuz系统. 所以需要把以前的帖子都导入到discuz中, 当然也包括以前的注册用户也需要导入到discuz中. 导入用户的事情, 待会写另一篇帖子说
E8820s路由器部署Discuz论坛的方法
40包邮e8820s,mt7621a处理器,默频880mhz,这款路由器的breed里好像没有超频选项,不然超到1100 1200可以提升很大闪存和内存在7621里也算可以了
Discuz数据库表参数说明
Discuz的基础架构采用世界上很流行的web编程组合PHP+MySQL实现,是一个经过完善设计,适用于各种服务器环境的高效论坛系统解决方案。作为国内较大的社区软件及服务提供商
相关源码
-
(PC+WAP)绿色产品环保设备垃圾桶厂家公司网站pbootcms模板为垃圾桶生产商、环保设备企业打造的高端响应式门户模板,基于PbootCMS开源内核深度开发。采用HTML5自适应架构,无缝实现PC与手机端数据实时同步与交互优化查看源码 -
(自适应响应式)运动健身瑜伽俱乐部网站pbootcms源码下载为健身瑜伽俱乐部设计的响应式网站模板,采用PbootCMS内核开发,可快速搭建专业级企业官网。模板默认适配运动健身行业视觉风格,用户可通过替换图文内容灵活应用于其他服务行业。查看源码 -
(PC+WAP)蓝色新能源环保太阳能光伏模板pbootcms下载新能源环保行业网站解决方案为太阳能光伏系统企业打造的专业网站模板,助力新能源企业高效展示产品与服务PbootCMS内核开发,源码开放可修改PC与手机端自适应设计查看源码 -
(自适应响应式)蓝色环保机械设备网站pbootcms模板HTML5源码下载基于PbootCMS的生态环境技术展示平台,通过内容调整可应用于新能源设备、污水处理、空气净化等环保相关领域。设备参数采用对比表格展示,技术原理支持图文混排;查看源码 -
(PC+WAP)绿色市政园林建筑设计绿化营销型pbootcms网站模板本模板基于PbootCMS系统开发,为园林绿化、景观设计类企业设计,特别适合市政园林、景观工程、绿化养护等企业使用。采用双端适配技术查看源码 -
(自适应)橙色家政服务清洁保洁服务pbootcms网站模板源码下载模板核心价值:基于PbootCMS内核开发的家政服务类网站模板,通过模块化设计展现服务项目、团队风采、服务案例等核心板块,突出时效预约、服务标准化展示等家政行业特性。查看源码
| 分享笔记 (共有 篇笔记) |
