如何在 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);

如果要解析&lt;Directory ...&gt; 和其他块,需要多写几行代码,但应该不会太费力。这真的取决于你想做什么。您可以从$_SERVERgetenv() 获得大量信息,因此您可能不需要解析配置文件。

编辑

为了响应您的更新,要编辑 httpd.conf,您需要以超级用户权限运行脚本并重新加载 httpd.conf(例如,system("apachectl graceful");)。

【讨论】:

【参考方案2】:

这取决于您所说的 .conf 文件是什么意思 - 标签是否暗示您的意思是 Apache httpd.conf 文件?在这种情况下,我很确定答案是否定的——但这取决于你想用它做什么。

解析 Apache .conf 文件的一般情况是一个相当棘手的问题。 等块都可以更改特定请求的服务器配置更改方式。最关键的是,您需要能够理解 块,如果启用了模块,这些块会添加额外的配置(因此您需要能够确定该特定模块是否已加载到 Apache 进程中)。完成所有这些后,您需要查看使用 Include 指令加载的任何其他配置文件。美中不足的最后一点来自其他模块,这些模块可能会定义自己的配置设置 - 您的代码将需要优雅地处理它不理解的任何配置设置。

如果你限制问题,那么它会变得更容易。您知道(并控制)服务器配置吗?如果是这样,那么您将知道加载了哪些模块、引用了哪些文件以及是否包含任何特殊结构。您可能能够以不同的方式限制问题 - 您是否只想要一个特定的设置,并且该设置是否往往只定义一次?如果是这样,您可以只搜索该字符串。

最后,如果您希望解析 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 文件的主要内容,如果未能解决你的问题,请参考以下文章

$application.home 如何在 play 框架的 conf/logback.xml 中解析?

如何在 php 中解析 .eml 文件?

如何在php中上传和解析CSV文件

如何在 PHP 中解析 CSV 文件

如何通过apache访问本机文件

我如何在 php 中解析这个 json 文件? [复制]