什么是最适合配置文件的文件格式?

15

我正在用PHP创建一个框架,并需要几个配置文件。其中一些文件将不可避免地有大量的条目。

哪种格式对于这些配置文件最好?

以下是我的最佳量化标准:

  1. 由PHP轻松解析。如果我不必编写任何解析代码,那将很好,但这不是必须的。
  2. 即使有大量的条目,人们仍然可以轻松地阅读
  3. 是广泛使用的标准格式,没有自定义格式
  4. 简洁性被赞赏

我最初使用XML,但很快放弃了明显的原因。我考虑过JSON和YAML,但想看看还有什么其他选择。


1
“我需要一种类似于树形结构的东西”,这是另一个评论的一部分。请使用这个额外的信息更新问题。人们可能会根据您提供的附加信息更改他们的答案。 - S.Lott
5个回答

19

INI文件格式怎么样?它是事实上的配置文件标准,并且PHP内置了解析该格式的解析器:

parse_ini_file


此外,编写自己的INI解析器非常简单。 - Ates Goral
5
为了实现类似树形结构的层次,INI 文件可以使用点分隔的名称来定义不同的部分,例如 [persistence.connection]、[persistence.cache]、[users.admin]、[users.security] 等。 - Ates Goral
太好了,我会在我的下一个项目中使用它 :) - user58163

14

YAML是个不错的选择: http://www.yaml.org/

它非常简单而且功能强大

Ruby项目经常用它来进行配置。


与PHP数组、INI文件、XML相比,它的速度也非常慢。我读过一份包括YAML在内的基准测试报告。当这三种文件类型能够每秒处理大约3,500个请求时,使用相同测试数据和系统的YAML只能处理大约850个请求。 - JasonDavis

12

为什么不使用PHP文件来配置?

好处很明显:

  • 可能出现的错误会自动被捕获
  • 无需使用/创建自定义解析器
  • PHP程序员普遍都理解它
  • 您可以有一些自定义逻辑,例如在开发过程中使用自定义配置,在生产中使用其他配置等

其他框架(如Django和Rails)使用脚本形式的配置文件。


配置文件中的实际数据不适合这个解决方案。配置文件将包含不同类型数据的定义,每种类型可能会有20多个条目。我需要一种类似于树形结构的结构,而将所有内容键入到PHP数组中的想法似乎令人生畏。 - joshwbrick
5
我不明白你如何使用 .ini 文件来创建一个美观的树形结构。 - Tiago

4
另一个选择是使用JSON并使用json_encodejson_decode。您将能够在配置参数中使用更丰富的数据结构。

10
JSON 不擅长注释。配置文件需要注释。 - Gary Richardson

1

个人而言,我喜欢在类中处理配置数据。

class appNameConfig {
    var $dbHost = 'localhost';
    var $dbUser = 'root';
    //...
 }

然后使用它们的所有操作只需要做到

$config = new appNameConfig;
mysql_connect($config->dbHost, $config->dbUser, $config->dbPassword) or die(/*...*/);

要更改配置,您只需使用包含类的文件读取该文件即可。我使用以下函数:

function updateConfig($parameter, $value) {
    $fh = fopen('config.php', 'w+');
    while(!feof($fh)) {
        $file .= fgets($fh);
     }
    $fileLines = explode("\n", $file);
    for($i=0;$i<count($fileLines);$i++) {
        if(strstr($fileLines[$i], $parameter)) {
            $fileLines[$i] = "$" . $parameter . " = '" . $value . "'";
         }
     }
    $file = implode("\n", $fileLines);
    fwrite($fh, $file);
    fclose($fh);
 }

你需要在 $value 周围加上 addslashes。这假设您的配置永远不会附加复杂数据到参数。 - jmucchiello
1
我省略了我认为显而易见的净化代码。 - UnkwnTech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接