织梦函数ReWriteConfigAuto()重写配置文件的分析

admin2019-12-28776

当我们安装一个全新的dede程序时,到第五步完成安装时,因为我们在前面的第三步会配置一些信息,而在这在第四步程序会把系统基本配置文件common.inc.cache.php生成到data文件夹里面,在第五步如果我们选择了安装模块,则会使用这个配置文件重新增加不少配置项,这时,在即将安装完成后,就要对这个配置文件data/config.cache.inc.php进行重新写入操作,这时就用到了函数ReWriteConfigAuto()了。

函数名:ReWriteConfigAuto()

功能:把新增加的配置项写到配置文件config.cache.inc.php里面,也就是以覆盖方式把新的配置内容写到文件里面。

所在文件:/install/install.inc.php

函数源代码:

function ReWriteConfigAuto()
{
    global $dsql;
    $configfile = DEDEDATA.'/config.cache.inc.php';
    if(!is_writeable($configfile))
    {
        echo "配置文件'{$configfile}'不支持写入,无法修改系统配置参数!";
        //ClearAllLink();
        exit();
    }
    $fp = fopen($configfile,'w');
    flock($fp,3);
    fwrite($fp,"<"."?php\r\n");
    $dsql->SetQuery("Select `varname`,`type`,`value`,`groupid` From `#@__sysconfig` order by aid asc ");
    $dsql->Execute();
    while($row = $dsql->GetArray())
    {
        if($row['type']=='number') fwrite($fp,"\${$row['varname']} = ".$row['value'].";\r\n");
        else fwrite($fp,"\${$row['varname']} = '".str_replace("'",'',$row['value'])."';\r\n");
    }
    fwrite($fp,"?".">");
    fclose($fp);
}

要对一个文件进行写入前,首先要判断这个文件是否可写入,若没有写入权限程序将无法写入操作,同样对配置文件config.cache.inc.php的写操作也是如此,通过php函数is_writeable()(这个函数和is_writable()完全一样,是is_writable的别名)判断配置文件是否可写,若不可写则退出写操作程序。

若是顺利执行到打开文件函数fopen($configfile,'w')这一行代码说明,配置文件是可写的,当打开文件后,通过函数flock($fp,3)给这个文件上一把锁,为什么要上锁?就像门一样上把锁别人进不来了,那我们自己不也进不了这个文件吗?

我们先看一下这个函数flock()是做什么的,手册上介绍说这个函数是一个轻便的咨询文件锁定,如果我们要看手册的话,根本看不懂或非常难理解,其实,它的意思是:只要一个文件上锁了,那么,这个文件就不能随便操作,例如,有三个人一起写入内容到配置文件的话,那么,就会出现错乱,如果我们给这个文件加上一把锁,那么,就不会出现这种情况了。

这个函数有二个参数一个是要锁定的文件,也就是第一个,另一个是操作类型,操作类型有三个:

织梦函数封装的这个函数里面的flock()函数用到的是第三种,释放锁定,这样下现就可以把要写的内容写到配置文件里面了。

接下来的一整个大段代码就是通过查询数据库配置文件#@__sysconfig来把这里面的数据写到配置文件里面。

在从数据库把文件写到配置文件里面时,这里要把单引号替换为空,其它的就简单了,就是从数据库里面查询出数据来写到文件config.cache.inc.php,注意的是这里是以覆盖方式写入,也就是会把系统安装到第四步的配置文件全部覆盖掉重新写入新配置内容,要不这个函数也不会叫重新写入配置文件函数了。

最后,不要忘记要关闭打开的文件。

网友评论