【问题标题】:What would be the best way to store site preferences?存储站点首选项的最佳方式是什么?
【发布时间】:2010-07-20 20:22:33
【问题描述】:

我目前正在对我的 CMS 进行大规模改造,并且想知道存储网站首选项的最佳方式是什么...

目前我的偏好设置在数据库中,充满了结构字段(每个都代表它自己的偏好),但只使用了 id 1。而且......我不知何故不喜欢这个解决方案。现在我正在考虑在 php 文件中设置首选项,但是编辑首选项存在问题。好吧,不是问题,但在我看来,使用文件作为存储很糟糕。

对于网站偏好,我的意思是“网站标题”、“网站标语”、“元关键字”、“元描述”等,而不是数据库信息或其他完全静态的值。

那么...你们还有其他解决方案可以分享吗?

提前致谢!

【问题讨论】:

  • 这些偏好是否经常变化或更多是静态的?
  • 它们会不时更换。但不是开发者(我),而是用户通过网站表单。

标签: php mysql


【解决方案1】:

嗯,这个问题没有简单的答案。正如@Redlab 所问,偏好是否经常变化?如果是这样,那么数据库似乎是“更好”的选择。但它的意义远不止于此……

这些偏好有很多吗?如果是这样,那么将其存储在文件系统中可能对命名空间文件和分层存储有意义。比如:

在site.php中

return array(
    'title' => 'This is my page title',
    'meta' => array(
        'description' => 'My Meta Description',
        'keywords' => 'key1, key2, key3',
    ),
);

基本上,为每个“命名空间”创建一个文件以将事物组合在一起。

这样做的好处是性能和可管理性。您可以根据需要在每个命名空间的基础上延迟加载配置。您可以通过添加一个名为命名空间的字段来模拟数据库中的效果,然后延迟加载这些字段,但由于每次访问都需要查询,因此速度会明显变慢。如果您有很多设置,那么在每个页面点击(甚至一次)时从数据库加载它也不会是最佳的......

我所做的是使用点符号。所以从上面的例子中,获取元关键字将是site.meta.keywords。这实际上很容易做到:

class Config {
    protected $data = array();

    public function get($name, $default = null) {
        $parts = explode('.', $name);
        $ns = array_shift($parts);
        if (!isset($this->data[$ns])) {
            $this->loadNS($ns);
        }
        $search = $this->data[$ns];
        foreach ($parts as $part) {
            if (is_array($search) && isset($search[$part])) {
                $search = $search[$part];
            } else {
                return $default;
            }
        }
        return $search;
    }

    protected loadNS($name) {
        $path = PATH_TO_CONFIG . $name . '.php';
        if (is_file($path)) {
            $this->data[$name] = include($path);
        } else {
            $this->data[$name] = array();
        }
    }
}

您可以同样简单地添加集合和保存方法。

保存文件:

public function saveToFile($ns) {
    if (!isset($this->data[$ns])) {
        $this->loadNS($ns);
    }
    $out = '<?php return '.var_export($this->data[$ns], true).';';
    $path = PATH_TO_CONFIG . $ns . '.php'
    file_put_contents($path, $out);
}

结果是一个非常易于维护(因为它只写入文件系统)和易于手动修改(因为它只是 php 代码)用于存储和检索信息的系统。

最重要的是,由于它可以利用操作码缓存,它非常高效,并且根本不会减慢您的页面速度...

【讨论】:

  • 嗯...这看起来很有趣。对我的语言使用了非常相似的系统。静态值位于文件中并由 var_export 等写入。我想,我会使用你的方法! :) 谢谢!
  • 我做同样的事情。它用于翻译和配置(从数据库连接开始的一切)。如果您的程序是高度模块化的,这是有道理的(恕我直言),您可以在其中“启用”或“禁用”模块(因此不必在每次页面加载时加载语言/配置系统的那一部分)......跨度>
【解决方案2】:

我喜欢 CodeIgniter 的站点配置方法。将所有配置文件存储在一个公共文件夹中,例如 /config 并将每个配置项放置到一个 $config 数组中,如下所示:

<?php

    $config['base_url'] = "http://foo.bar/baz";
    $config['language'] = "english";
    $config['charset']  = "UTF-8";
    // ...

稍后,这些文件可以使用一些全局方法自动加载和引用,例如:

get_config_item("base_url");

【讨论】:

    【解决方案3】:

    在我看来,您当前使用数据库的设置是理想的。看看 WordPress 是如何存储这种网站偏好的——它们是在数据库中存储的。 Config 属于静态配置文件,数据库中的 Preferences。

    【讨论】:

      猜你喜欢
      • 2011-03-05
      • 2019-09-21
      • 1970-01-01
      • 2018-12-20
      • 2013-06-14
      • 1970-01-01
      • 2011-05-09
      • 2015-11-08
      • 2017-12-20
      相关资源
      最近更新 更多