您现在的位置是:首页 > cms教程 > Discuz教程Discuz教程
解决Discuz论坛的Discuz.Cache.DNTCache 的AddObject()死循环
易烟2025-07-20Discuz教程已有人查阅
导读在前天,本人刚下了discuzNT的代码,研究了些许时间老是报stackoverflow的error在web.config中发现了这段代码:
在前天,本人刚下了discuzNT的代码,研究了些许时间老是报stackoverflow的error在web.config中发现了这段代码:
不排除是我的反编工具出的错,我的平台是win2003sp2+sqlserver2005EEsp2+vstssp1
<httpModules>
<add type="Discuz.Forum.HttpModule, Discuz.Forum" name="HttpModule"/>
</httpModules>
呵呵,就是HttpModule类,好,找到HttpModule.cs,打开在Line48 有这么一句
if (Utils.InArray(Utils.GetCookie("dnttemplateid"), TemplateFactory.GetValidTemplateIDList()))
在执行TemplateFactory.GetValidTemplateIDList()的时候老实报错,就找到在打开发现在执行
cacheService.AddObject("/Forum/TemplateIDList", str);的时候还是报错
接着进去,这是他的具体的方法体
public virtual void AddObject(string xpath, string str)
{
lock (lockHelper)
{
if ((str != null) && (str != ""))
{
this.AddObject(xpath + "flag", CacheFlag.CacheHaveData);
}
else
{
this.AddObject(xpath + "flag", CacheFlag.CacheNoData);
}
this.AddObject(xpath, str);
}
}
在情况对的时候,首先会进去
this.AddObject(xpath + "flag", CacheFlag.CacheHaveData);
这时候调用的是
public virtual void AddObject(string xpath, object o)
这个方法,这个方法是没问题的,就是将一些数据插入Cache里面调用完成之后就执行的是
this.AddObject(xpath, str);(public virtual void AddObject(string xpath, string str)
)
大家注意,调用的是自身,是递归好,前面的if-else在执行一遍,回到this.AddObject(xpath, str);还是递归我就他的意思应该是首先插入路径,然后插入实际数据,两次缓存数据,但是实际代码就是这样子为了证明我的想法,我把代码加成这个样子
int i=0;
public virtual void AddObject(string xpath, string str)
{
i++;//计数功能
lock (lockHelper)
{
if ((str != null) && (str != ""))
{
this.AddObject(xpath + "flag", CacheFlag.CacheHaveData);
}
else
{
this.AddObject(xpath + "flag", CacheFlag.CacheNoData);
}
this.AddObject(xpath, str);
}
}
再次运行,再次报错,一看i达到了2049,Cache给插入了2000多次,怪不得会overflow考虑了一下,改代码如下:
public virtual void AddObject(string xpath, string str)
{
lock (lockHelper)
{
if ((str != null) && (str != ""))
{
this.AddObject(xpath + "flag", CacheFlag.CacheHaveData);
}
else
{
this.AddObject(xpath + "flag", CacheFlag.CacheNoData);
}
this.AddObject(xpath, (object)str);
}
}
在第二次的时候box一下,就直接进入public virtual void AddObject(string xpath, string str)里了这个DNTCache里好多这样的AddObject方法,都是这样的错误至此,运行暂时没问题了不知道大家遇到了这种情况没?不排除是我的反编工具出的错,我的平台是win2003sp2+sqlserver2005EEsp2+vstssp1
本文标签:
很赞哦! ()
图文教程
Discuz学习include变量和转义字符
include/common.inc.php include/global.func.php 参数$cplog文件名 | $str 日志内容
Discuz!NT中远程附件功能实现方法,FTP协议
大约在去年的12月份,我们开始着手设计和开发这项功能,而该项功能主要是解决类似于一些帖子附件(图片或文件)访问比较频繁,同时附件的体积又比较大
discuz是什么,discuz有什么用
discuz是一种功能强大、灵活性高、安全稳定的开源论坛软件,是一个基于PHP和MySQL的在线社区平台,提供了一个完整的论坛系统,包括帖子、主题、用户管理、权限控制等功能。
DiscuzX3.2版本论坛搬家步骤教程
客户在虚拟主机上 运行着一个DISCUZ论坛, 主机商限制太多,连MP3都不让放,客户准备是在上面放一个FLASH斗地主游戏的(多人联机版),加上MYSQL不让远程连接
相关源码
-
(PC+WAP)企业管理工程造价资产评估财务审计带留言网站模板本模板基于PbootCMS内核开发,为工程造价咨询、财务审计类企业量身打造,同时支持多行业快速适配。采用PC+WAP双端同步设计,数据实时互通,助您高效展示企业形象与服务能力。查看源码 -
(自适应手机端)锁锁芯锁具网站pbootcms模板 智能防盗锁网站源码下载本模板基于PbootCMS系统开发,为智能锁具、防盗锁芯及相关安防产品企业设计。采用响应式布局技术,确保在手机、平板和电脑等不同设备上都能获得良好的浏览体验,数据实时同步更新。查看源码 -
帝国CMS7.5养生生活健康网模板完整带会员中心可封装APP本套模板为生活服务类网站设计,适用于两性健康、减肥瘦身、生活资讯等领域。采用帝国CMS7.5核心开发,结构清晰合理,视觉体验舒适,能够有效满足相关行业的建站需求。查看源码 -
(PC+WAP)蓝色不锈钢簧线金属制品营销型pbootcms网站模板本模板基于PbootCMS内核开发,为不锈钢及金属制品企业量身打造。采用响应式设计,适配PC与移动设备,提供统一后台管理体验,数据实时同步更新。查看源码 -
(自适应响应式)HTML5磁电机械设备蓝色营销型网站pbootcms模板本模板为磁电设备行业设计,采用蓝色营销风格,突出工业设备的专业性和技术感。模板结构清晰,能够有效展示磁电设备的技术参数、应用场景和企业实力,帮助客户快速了解产品特点和公司服务。查看源码 -
(自适应)家政保洁保姆打扫卫生清灰服务pbootcms模板免费下载采用手工编写的DIV+CSS架构,代码结构清晰无冗余,加载速度优异。响应式设计适配各类终端设备,保障手机、平板、电脑端的一致浏览体验。查看源码
| 分享笔记 (共有 篇笔记) |
