PHP开发 加入小组

298个成员 3006个话题 创建时间:2011-05-30

如何将 DiscuzX2 附件存储目录缓存为相对路径

发表于 2012-02-27 4800 次查看

DiscuzX2 附件存储目录是缓存为绝对路径的,而且缓存存在数据库里,
如果测试环境(预发布环境)和线上环境用同一份数据库数据,
但附件存储目录绝对路径不一致,会给测试造成问题;

所以针对这个问题,可以做如下修改,将附件存储路径缓存为相对路径,方便测试:

1、查找存储该设置的地方

查找"save_syscache('setting'"

cache_setting.php
line 56 //如果是相对目录,改为绝对目录
$setting['svalue'] = str_replace('\\', '/', substr($setting['svalue'], 0, 2) == './' ? DISCUZ_ROOT.$setting['svalue'] : $setting['svalue']);


2、查找使用该设置的地方

查找"attachdir"

该设置有两种使用方式
getglobal('setting/attachdir')
$_G['setting']['attachdir']

而 getglobal() 是用 $_G 实现的,
所以只要保证 $_G['setting']['attachdir'] 设置不变,则不影响原来功能;


3、查找初始化$_G['setting']['attachdir']的地方

查找字符串"$_G ="

class_core.php
line 113
$_G 初始化,'setting' => array()

以上只是初始化key,略过;

查找字符串"$_G['setting'] ="

function_core.php
line 677
$_G['setting'] = $data;


4、修改方案

存储时保存相对路径;
初始化时修改为绝对路径;
使用时无需改动;
(相当于移动“改为绝对路径”这行逻辑代码)

cache_setting.php
line 56
$setting['svalue'] = str_replace('\\', '/', substr($setting['svalue'], 0, 2) == './' ? DISCUZ_ROOT.$setting['svalue'] : $setting['svalue']);
改为
$setting['svalue'] = str_replace('\\', '/', $setting['svalue']);

function_core.php
line 677
$_G['setting'] = $data;
下面加一行
if (isset($_G['setting']['attachdir']) && substr($_G['setting']['attachdir'], 0, 2) == './') $_G['setting']['attachdir'] = DISCUZ_ROOT.$_G['setting']['attachdir'];


既然折腾了,就写下。

3回复
发表回复
功能维护升级中,维护完成完后将再次开放,非常抱歉给您学习造成的不便。