如何在php中解析.conf文件

时间:2012-06-15 20:25:55

标签: php httpd.conf

是否有任何特殊功能来解析php中的.conf文件,如parse_ini_file()函数?如果不是我怎么能实现这一目标?谢谢!

编辑:

Conf就像httpd.conf(Apache)。 (我想阅读和编辑httpd.conf文件)

4 个答案:

答案 0 :(得分:3)

它取决于.conf文件的含义 - 标签是否意味着您指的是Apache httpd.conf文件?在那种情况下,我很确定答案是“不” - 但这取决于你想用它做什么。

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

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

最后,如果您正在寻找解析Apache配置文件作为向其写入数据的前奏,那么我要注意这一点 - 允许Web应用程序修改服务器配置会使您暴露于一类安全漏洞以前没有。

当然,如果你根本不谈论Apache .conf文件,那么问题就更难回答了。如果您要为自定义应用程序定义自己的配置文件格式,则可以按照自己的喜好进行定义。

答案 1 :(得分:3)

不,解析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 ...>和其他块,它会带你几行代码,但它不应该太费力。这真的取决于你想做什么。您可以从$_SERVERgetenv()获取大量信息,因此您可能不需要解析配置文件。

修改

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

答案 2 :(得分:1)

如此处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;

答案 3 :(得分:0)

最好的方法是使用 $conf = parse_ini_file("YOUR_CONF_FILE.conf",1) 解析您的配置文件。