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

时间:2011-10-16 00:38:16

标签: php yaml

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

我的想法

  1. YAML在可读性方面是用户(非技术性)友好
  2. 为了防止我的Framework需要非标准的PHP库,我必须使用Symfony YAML之类的东西来解析文件。
  3. Symfony不是要离开YAML吗?
  4. 我可以使用一个充满变量的PHP文件,但这会使框架的设置对用户的透明度降低。
  5. 更新

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

    我的整体问题

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

6 个答案:

答案 0 :(得分:25)

NO

个人经历。 YAML似乎是一个很好的主意,我很喜欢它和简单。然后我开始在它上面投入时间:能够用一种语言阅读它并在另一种语言中写入的概念非常诱人,但是......缩短它,它变成了仅仅是幻觉,没有事实根据。

YAML的每个实现都与其他实现差异很大

  • 由一个自动序列化的数组有时不能被另一个读取。
  • 支持交叉引用,但它们的实现非常粗略。

    参考文献很有用,但是:

    • 对于某些硬核应用程序,它们非常有限
    • 它们代表了大多数基于YAML的低端项目的 overkill

    因此,大多数解析器经常会忽略和错误

总结一下,标准设置得不好。

有一些核心概念既简单又简单,但实际的标准文档中充满了大多数人不想使用的功能的详细信息,实施起来既困难又昂贵

区别兼容性级别,就像在DOM(DOM级别1,DOM级别2等)中一样,因此每个解析器实现者都实现了什么他觉得,在他能承受的范围内,然后放弃它,并且很难辨别哪些有效,哪些无效

使用替代方案

  • JSON ,如果您重视 跨语言数据交换语言 少量冗余 方面是首要任务

  • INI ,如果您重视 性能和向后兼容性 on PHP ,则为{{1}很快,从那以后......总是)和人类的 可读性/可编辑性 ,而不是。

答案 1 :(得分:5)

我个人偏好是基于PHP的配置文件。

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

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

然后你可以像这样引用配置设置

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

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

答案 2 :(得分:2)

我为配置文件格式挖掘了更多,并为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。

答案 3 :(得分:1)

如果您正在撰写框架,那么是的。您必须最终完成更多工作,但框架的目标是使开发应用程序的人员更容易。

  

Symfony不是要离开YAML吗?

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

答案 4 :(得分:0)

我通常做的是创建一个XML文件,并使非依赖前端修改XML文件中的设置。

答案 5 :(得分:0)

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

"username" : "root" //in json file 

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

用于写配置文件

$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>