我应该在PHP应用程序中使用YAML配置文件吗?


Should I use YAML for Config Files in a PHP Application?

我目前正在编写我自己的PHP框架(踢,而不是关键任务的东西),我试图添加的功能,用户可以设置什么数据库框架应该使用(主数据库,然后可能一个或两个回退-如sqlite),在某些文件的位置,等等。我应该使用YAML吗?是否有更好的方法或标准实践?

<

我的想法/strong>

  1. YAML在可读性方面是用户(非技术)友好的
  2. 为了让我的框架不需要非标准的PHP库,我不得不使用类似Symfony YAML的东西来解析文件。
  3. Symfony是不是正在远离YAML?
  4. 我可以使用一个充满变量的PHP文件,但这会使框架的设置对用户不太透明。

我正在整理这个问题,使它更有建设性,并纳入我得到的一些答案。

    与其他方法(如XML甚至INI文件设置)相比,YAML有什么优势?
  1. 关于何时使用YAML而不是其他方法,或者反之亦然,什么是好的经验法则?

NO

个人经验。YAML似乎是一个很棒的想法,我喜欢它和它的简单性。然后我开始投入时间:能够用一种语言阅读和用另一种语言写作的概念非常诱人,但是……简而言之,只是一种幻觉,没有事实根据。

每一个YAML的实现都与其他的有很大的不同

  • 数组,由一个自动序列化,有时不能被另一个读取。

  • 支持交叉引用,但是它们的实现非常粗略。

    引用很强大,但是:

    • 对于一些硬核应用程序,它们是相当有限的
    • 对于大多数低端的基于yaml的项目来说,它们代表了的过度杀伤


    因此,它们经常被大多数解析器忽略,并在上出错。

总而言之,标准设定得不太好。

有一些很好很简单的核心概念,但是实际的标准文档中充满了关于特性的细节,大多数人都不想使用这些特性,而且实现非常困难和昂贵。

没有 兼容性级别的区别,就像DOM (DOM级别1,DOM级别2,等等)一样,所以每个解析器实施者在他能承受的范围内实现他想要的,然后放弃它,很难辨别哪些有效,哪些无效

使用替代

  • JSON如果您将跨语言数据交换语言少冗余方面作为重中之重

  • INI如果你重视性能和向后兼容性 (在PHP上,因为parse_ini_file()是快速的,并且自从…always)和 readable/editability by human ,而不是

我个人倾向于使用基于PHP的配置文件

我知道PHP,所以对我来说学习yaml只是为了配置文件是额外的工作当你可以有一个像这样简单的配置文件时,它本质上并不比yaml更难,也不需要特殊的解释器库,只需要包含('config.php'),你就可以了

$config = array(
  'database' => array(
      'default' => array(
         'name' => 'dbname',
         'host' => 'localhost',
         'user' => 'username',
         'pass' => 'password'
      )
   )
);

那么你可以像这样引用配置设置

$host = $config['database']['default']['host'];

下一步是保持配置文件简单,存储所需的最少量配置数据,然后使用数据库存储其余的配置数据,并为最终用户提供管理屏幕以更改应用程序中的设置。

我对配置文件格式进行了更多的挖掘,并发现了YAML格式的有趣事实。

主要缺点很少

1)它涉及安装和配置额外的PHP库,因为YAML模块不是默认的,或者必须从symphony框架解耦并使用它。

2)与INI, XML, JSON相比,读写性能是所有配置技术中最差的。与INI文件相比,读取需要更多的时间http://konrness.com/php5/zend_config-benchmark-json-array-ini-xml-yaml/

3)与INI和XML格式相比,可读性不是很好。当它变得很大时,用人类的眼睛就很难阅读和管理了。

4)比特比INI和JSON大

所以最好使用INI格式,而不是YAML。

如果你正在编写一个框架,那么是的。您最终将不得不做更多的工作,但是框架的目标是使开发应用程序的人更容易。

Symfony是不是正在远离YAML?

不,Symony2几乎完全由YAML配置。

使用json 好主意
加载配置文件

"username" : "root" //in json file 
 $json = file_get_contents('path/to/file');
 $data = json_decode($json);
 $data->username; //print root

for write配置文件

$data['username'] = 'root'; 

if (file_put_contents('path/to/file', json_encode($dat))) { echo "<h4 class='alert alert-success'>config updated</h4>"; }

如果你在web根目录下使用。htaccess

<IfModule authz_core_module>
Require all denied
</IfModule>
<IfModule !authz_core_module>
Deny from all
</IfModule>

我通常做的是制作一个XML文件,并制作一个非依赖的前端来修改XML文件中的设置