6

我正在编写一个针对非极客、非程序员的 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 只是一个很好的解决方案。

4

5 回答 5

5

初始化

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

你可能已经看过相关的 SO:创建 ini 文件,在 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 文档

于 2010-06-21T05:42:51.517 回答
2

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

于 2010-06-21T06:45:41.200 回答
1

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

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

  1. XML
  2. JSON
  3. ini(最后的手段)
于 2010-06-21T04:00:31.323 回答
1

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

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

我只会使用 XML,它在一定程度上是自我记录的<Email>hi@hi.hi</Email>

于 2010-06-21T04:13:18.690 回答
1

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

于 2010-06-21T04:15:27.983 回答