6

是否有任何特殊功能可以解析 php 中的 .conf 文件之类的parse_ini_file()功能?如果没有,我怎么能做到这一点?谢谢!

编辑 :

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

4

4 回答 4

6

不,解析 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);

如果你想解析 the<Directory ...>和其他块,它会花费你更多的代码行,但它不应该太费力。这真的取决于你想做什么。$_SERVER您可以从和获得大量信息getenv(),因此您可能不需要解析配置文件。

编辑

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

于 2012-06-15T20:40:46.170 回答
3

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

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

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

最后,如果您希望解析 Apache 配置文件作为向其写入数据的前奏,那么我会提醒您不要这样做 - 允许 Web 应用程序修改服务器配置会使您暴露于一整类安全漏洞t 之前可用。

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

于 2012-06-15T20:37:30.447 回答
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;
于 2020-01-25T16:22:27.027 回答
0

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

于 2021-06-18T12:03:53.537 回答