【问题标题】:Creating a "two way" configuration file创建“双向”配置文件
【发布时间】:2011-03-06 03:39:16
【问题描述】:

我正在编写一个针对非极客、非程序员的 PHP 应用程序。我需要创建一个带有一堆“选项”的选项页面,然后将这些选项存储在某个地方。使用数据库应用程序(MySQL/PostgreSQL/SQLite)是不可能的,因为它需要比用户需要做的更多的配置(如果他不想,我不希望用户做任何类型的配置) .所以剩下的唯一解决方案就是将配置写入配置文件。另一方面,如果用户是极客并且他想直接编辑配置文件(或者如果他想通过 SSH 或任何原因远程编辑文件,我也希望该配置文件是人类可读的。 ..)

以下是我发现的几个潜在解决方案:

使用 JSON 文件...

...从文件中检索数据,使用 json_decode 转换数据,将其输出为 HTML,检索任何更改,使用 json_encode 进行编码等。你得到了图片。我不喜欢这种方法有几件事,主要是使用 PHP 编码的 JSON 数据将不会被很好地格式化,并且如果不事先重​​新格式化就很难编辑。

使用 XML 文件

我不会描述那个解决方案,因为我也不是很喜欢它......而且我不知道如何使用 XSLT,也不想学习......而且因为它是一个非常重量级的解决方案,至少与 JSON 解决方案相比。如果我错了,请纠正我。

使用 INI 文件

我喜欢 INI 文件,我真的很喜欢它们!我认为它们确实是最易读的,而且很难搞砸(即:语法错误)。该解决方案的问题在于没有本地方式来编写/编辑 ini 文件。我发现了一个主题,显示了一个自定义方法来编写一个......如果我没有找到更好的解决方案,这可能是我会采用的解决方案......

使用两个文件

最后一个解决方案似乎与 INI 解决方案一样合理。事实上,我可以使用一个 INI 文件作为“输入”(用户可以根据需要编辑的文件)和一个 XML/JSON 文件作为输出(每次用户使用更改选项时 PHP 将编辑的文件)网络前端)。此时,最好的解决方案是,如果用户直接编辑配置文件,则要求用户手动重新加载配置,以便“输​​出”文件始终是最新的。


我知道上述解决方案都不是完美的,这就是我创建这个主题来寻求建议的原因。什么是最好的解决方案?也许(可能)我错过了另一个解决方案。

最后一件事:YAML 不是一个有效的解决方案,因为如果您不习惯它,它会更容易弄乱语法。 PHP 也不是一个解决方案,因为用 PHP 编辑 PHP 很痛苦。如果我想检索一些配置但不直接通过 Web 前端编辑它,PHP 只是一个很好的解决方案。

【问题讨论】:

  • 我认为如果您能告诉我们您的“选项”的外观会更好。例如,它们主要是一堆布尔值吗?任意文本值?单行文本值?多值值(数组)?
  • 我认为从两个来源编译配置数据是不必要的复杂。但是,您应该可能会在某处保存配置的“最后一个正确的副本”,以防用户做出破坏事情的更改。此外,请注意,即使用户以后使用 GUI,他/他对配置文件所做的手动更改也可能会被保留。

标签: php xml json configuration-files ini


【解决方案1】:

我会选择 ini。他们真的不难写。我个人讨厌 XML。它太臃肿了......即使文件大小无关紧要,它仍然让我对它的冗长和我必须做的打字量感到畏缩。此外,人是愚蠢的。他们不会关闭标签。

【讨论】:

    【解决方案2】:

    ini

    我自己会编写 ini 文件。正如您所说,语法非常简单,这就是您想要的配置文件。 ini 格式的“键+值”配对正是您在没有数据库的情况下使用数据库所获得的。

    您可能已经看过相关的 SO:create ini file, write values in PHP

    另外,您可以使用parse_ini_file() 阅读。

    XML

    XML 并不是那么糟糕。编写它可能需要更多的工作(并且对于用户来说可能不像 ini 文件那样清晰),但是阅读它真的很容易。

    创建它:

    
    <?php
    // Create file
    $xml = new SimpleXMLElement( '<?xml version="1.0" ?><config></config>' );
    
    // Add stuff to it
    $xml->addChild( 'option1' );
    $xml->option1->addAttribute( 'first_name', 'billy' );
    $xml->option1->addAttribute( 'middle_name', 'bob' );
    $xml->option1->addAttribute( 'last_name', 'thornton' );
    $xml->addChild( 'option2' );
    $xml->option2->addAttribute( 'fav_dessert', 'cookies' );
    
    // Save
    $xml->asXML( 'config.xml' );
    ?>

    阅读:

    
    <?php
    // Load
    $config = new SimpleXMLElement( file_get_contents( 'config.xml' ) );
    
    // Grab parts of option1
    foreach( $config->option1->attributes() as $var )
    {
        echo $var.' ';
    }
    
    // Grab option2
    echo 'likes '.$config->option2['fav_dessert'];
    ?>
    

    这给了你:

    比利鲍勃桑顿喜欢饼干

    SimpleXML 文档

    【讨论】:

      【解决方案3】:

      好吧,您可以使用 PHP 的 serialize(),虽然它是人类可读的,但它并不是人类可读性最强的东西。它与 JSON 在同一级别上实现。

      【讨论】:

        【解决方案4】:

        除非您有 1000 多个选项,否则您真的不应该担心 XML 文件的大小。这里的目标是让用户的事情变得简单。这意味着无论您选择哪种方法(我认为 JSON 不应该是其中之一),都应该在每个配置行中大量记录。

        你的两个文件解决方案让我回到了 sendmail 配置的日子,让我不寒而栗。

        我只会使用 XML,它可以自我记录到某个点 &lt;Email&gt;hi@hi.hi&lt;/Email&gt;

        【讨论】:

        • 我认为它不需要大量的内联文档。维护内联文档将产生不必要的开销。新手将使用 GUI,高级用户应该对设置的作用有所了解,而详细信息可以在外部文档/帮助文件中提供。一个简单的“查看 readme.txt > 配置文件”就足够了。
        • 我同意这一点。请改用单独的 doc 文件。
        【解决方案5】:

        标准方式是 XML 文件。它们不会产生那么多开销并且很容易扩展。然而,JSON 文件在编程端是最简单的。

        我会对我的偏好进行排名:

        1. XML
        2. JSON
        3. ini(最后的手段)

        【讨论】:

          猜你喜欢
          • 2020-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-22
          • 2011-08-09
          • 2011-03-24
          • 2015-06-24
          • 2016-04-04
          相关资源
          最近更新 更多