我正在编写自己的PHP框架(用于踢,而不是用于关键任务的东西),我正在尝试添加功能,用户可以在其中设置框架应该使用的数据库(一个主数据库,然后可能一个或两个回退 - 比如sqlite),某些文件所在的位置等等。我应该使用YAML吗?是否有更好的方法或标准做法?
我的想法
更新
我正在清理这个问题,使其更具建设性,并纳入我得到的一些答案。
我的整体问题
答案 0 :(得分:25)
个人经历。 YAML似乎是一个很好的主意,我很喜欢它和简单。然后我开始在它上面投入时间:能够用一种语言阅读它并在另一种语言中写入的概念非常诱人,但是......缩短它,它变成了仅仅是幻觉强烈的>,没有事实根据。
YAML的每个实现都与其他实现差异很大。
支持交叉引用,但它们的实现非常粗略。
参考文献很有用,但是:
因此,大多数解析器经常会忽略和错误。
总结一下,标准设置得不好。
有一些核心概念既简单又简单,但实际的标准文档中充满了大多数人不想使用的功能的详细信息,实施起来既困难又昂贵。
区别兼容性级别,就像在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>