李迎辉

李迎辉的博客

他的个人主页  他的博客

学习drupal(二)

李迎辉  2009年08月04日 星期二 09:51 | 1160次浏览 | 2条评论

在drupal中有关于变量设置的,是通过variable_get()和variable_set()来实现的。具体的体码是在includes/bootstrap.inc中。这个东西很有意思。variable_get()是从$conf中得到的,它是一个全局的对象,这个没什么。但是看variable_set()的实现,代码如下:

function variable_set($name, $value) {
    global $conf;
    $serialized_value = serialize($value);
    db_query("UPDATE {variable} SET value = '%s' WHERE name = '%s'", $serialized_value, $name);
    if (!db_affected_rows()) {
        @db_query("INSERT INTO {variable} (name, value) VALUES ('%s', '%s')", $name, $serialized_value);
    }
    cache_clear_all('variables', 'cache');
    $conf[$name] = $value;
}

它首先要将值进行serialize()的处理,因此它可以存储相对复杂的对象。并且在后面它是将值存储到数据库中去了。然后最近将值再存放到$conf中去。

为什么这样做。在uliweb中目前也有settings.ini配置,但是它基本上是只读的。但是在drupal中,在配置一个模块时,可能需要用户进行配置,那么这些配置项的存储就是一个问题。使用文件问题是不大,但是有一个问题就是当实现集群模式时,放在哪台机器上?信息如何同步。因此GAE为什么让用户来使用它的dbstore来保存文件,原因就是这个。在集群环境下,使用数据库是共享的最简单的方式。

只从代码上看,我不知道variable_get()是不是有问题。因为当用户set了一个变量之后,在同一个进程内,是可以从$conf得到这个变化,但是对于共它的进程如何知道变量集发生了变化。但是又一想,应该不存在这个问题。如果是以模块方式来运行,自然没有问题,因为可以访问同一个$conf对象。如果是以进程方式来运行,自然每次在启动PHP进程时会从数据库中加载这些数据,因此也没有问题。

考虑到Uliweb,那么有必要采用类似的方式,将一些用户的动态设置存放到数据库中。settings.ini中的可以认为是缺省配置。可以考虑在启动时先加载settings.ini,然后再从数据库中进行加载将重名的变量进行替换。不过这块处理有可能会采用添加app的方式,作为一个可选功能。具体细节还没有想好。

评论

我的评论:

发表评论

请 登录 后发表评论。还没有在Zeuux哲思注册吗?现在 注册 !
周琦

回复 周琦  2009年08月20日 星期四 22:23

MT 更加如此,
这是一个系统完备性的体现:
- 如果一个应用的一切都在DB中,就可以实现只要将文件和DB拿来不用配置,立即就恢复

0条回复

夏武

回复 夏武  2009年08月06日 星期四 18:01

印象中,apache的tomcat也有类似的设计,将配置数据序列化。
能否考虑给用户可以选择的配置实现方式,这样适用与更多的应用环境。

0条回复

暂时没有评论

Zeuux © 2024

京ICP备05028076号