【问题标题】:How to parse a .conf file in php如何在 php 中解析 .conf 文件
【发布时间】: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。
  • 这里的结局是什么?您是在尝试创建自己的配置文件格式,还是为另一个现有应用程序解析配置文件?

标签: php httpd.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) 解析你的配置文件。

        【讨论】:

          猜你喜欢
          • 2011-12-31
          • 1970-01-01
          • 2014-05-06
          • 1970-01-01
          • 1970-01-01
          • 2019-01-11
          • 1970-01-01
          • 2023-04-02
          • 2012-07-09
          相关资源
          最近更新 更多