如何在 php 中解析 .conf 文件
Posted
技术标签:
【中文标题】如何在 php 中解析 .conf 文件【英文标题】:How to parse a .conf file in php 【发布时间】:2012-06-18 22:34:06 【问题描述】:有什么特殊的函数可以像parse_ini_file()
函数那样在php中解析.conf文件吗?如果没有,我怎么能做到这一点?谢谢!
编辑:
Conf 类似于 httpd.conf(Apache)。 (我想阅读和编辑 httpd.conf 文件)
【问题讨论】:
像 Apache .conf 文件,还是别的什么?没有固定的格式,.conf 可以是任何东西。 @Brad 是的。 # 评论配置。 我们需要明确知道您要解析哪个应用程序的 .conf 文件,因为正如@Brad 所说,没有通用定义的格式。这些文件中的大多数使用与Directive argument [argument...]
大致相似的基本语法,但例如 Apache 有各种复杂的结构,如可嵌套的<VirtualHost>
、<Directory>
等部分,这些部分更难解析成有意义的数据结构。
@DaveRandom 是的,就像 apache conf。
这里的结局是什么?您是在尝试创建自己的配置文件格式,还是为另一个现有应用程序解析配置文件?
【参考方案1】:
不,解析 httpd.conf 没有特殊的功能,但是解析器应该很容易编写。例如,如果您只对键值设置感兴趣,例如 ServerRoot /var/www
,那么这将解决问题:
<?php
define('HTTPD_CONF', '/tmp/httpd.conf');
$lines = file(HTTPD_CONF);
$config = array();
foreach ($lines as $l)
preg_match("/^(?P<key>\w+)\s+(?P<value>.*)/", $l, $matches);
if (isset($matches['key']))
$config[$matches['key']] = $matches['value'];
var_dump($config);
如果要解析<Directory ...>
和其他块,需要多写几行代码,但应该不会太费力。这真的取决于你想做什么。您可以从$_SERVER
和getenv()
获得大量信息,因此您可能不需要解析配置文件。
编辑
为了响应您的更新,要编辑 httpd.conf,您需要以超级用户权限运行脚本并重新加载 httpd.conf(例如,system("apachectl graceful");
)。
【讨论】:
【参考方案2】:这取决于您所说的 .conf 文件是什么意思 - 标签是否暗示您的意思是 Apache httpd.conf 文件?在这种情况下,我很确定答案是否定的——但这取决于你想用它做什么。
解析 Apache .conf 文件的一般情况是一个相当棘手的问题。
如果你限制问题,那么它会变得更容易。您知道(并控制)服务器配置吗?如果是这样,那么您将知道加载了哪些模块、引用了哪些文件以及是否包含任何特殊结构。您可能能够以不同的方式限制问题 - 您是否只想要一个特定的设置,并且该设置是否往往只定义一次?如果是这样,您可以只搜索该字符串。
最后,如果您希望解析 Apache 配置文件作为向其写入数据的前奏,那么我会提醒您不要这样做 - 允许 Web 应用程序修改服务器配置会使您面临一整类安全漏洞以前没有的。
当然,如果您根本不是在谈论 Apache .conf 文件,那么这个问题就更难回答了。如果您要为自定义应用程序定义自己的配置文件格式,您可以按照自己的喜好进行定义。
【讨论】:
【参考方案3】:正如这里提到的Apache config parser for PHP,pear/config 收集了一些工具来解析不同类型的配置文件:https://github.com/pear/Config
例子:
$conf = new Config();
$root = $conf->parseConfig("/etc/apache2/httpd.conf", "apache");
print current($root->getItem('directive', 'Listen'))->content;
【讨论】:
【参考方案4】:最好的方法是使用
$conf = parse_ini_file("YOUR_CONF_FILE.conf",1)
解析你的配置文件。
【讨论】:
以上是关于如何在 php 中解析 .conf 文件的主要内容,如果未能解决你的问题,请参考以下文章