PHP 是否可以读取/解析当前虚拟主机的 Apache VirtualHost 配置块,以检索错误日志和自定义日志设置?



PHP 是否可以读取/解析当前虚拟主机的 Apache VirtualHost 配置块,特别是检索 ErrorLog 和 CustomLog 设置?

需要明确的是,我们不需要PHP错误日志路径,这很容易检索。

我在phpinfo_SERVER/getenv()或PHP Apache函数(apache_module()apache_note()apache_getenv()(中找不到任何方法。

代码库用于多个服务器上的多个虚拟主机,因此我们无法在 PHP(或 .htaccess SetEnv 或某些 ini/csv/任何文件等(中对 Apache 访问和错误日志路径进行硬编码,因为它可能并不总是与 <VirtualHost> 中设置的内容匹配 - 操作人员可能会更新 VirtualHost,但开发人员可能不会更新代码或任何代码正在使用的内容找到相同的路径。我们不能在 CustomLog 行下方或上方设置具有相同值的 SetEnv,因为仍然有可能在没有另一个的情况下更新一个(人为错误等(。

我最大的希望是apache_getenv()但我试过apache_getenv('CustomLog'),它没有返回任何东西。

运行一系列system()/exec()调用来运行 cli 函数来查找它们是可以的,但并不理想。

ServerName可能与当前调用的虚拟主机不匹配,因为ServerAlias可能具有包含正则表达式的不同虚拟主机,因此一旦找到 Apache conf 的路径,手动浏览文件并不理想/可靠。

Apache 2.2.16 (Unix(PHP 5.3.3CentOS 版本 5.5 (最终版(

请告诉我我错过了一些明显的东西;)

这有点黑客,但你可以把

ErrorLog /path/to/logfile
SetEnv ErrorLog /path/to/logfile

在你的httpd.conf中,所以你可以使用apache_getenv((函数。 getenv(( 不检索配置指令,只检索实际的环境变量。 所以.. 将日志路径放入环境变量中。

请告诉我我错过了一些东西 明显的;)

不,你没有。Apache根本不会把这个字符串存储在任何你可以得到它的地方。From, mod_log_config.c(请注意存储在config_log_state结构中的fmt参数(:

static const char *add_custom_log(cmd_parms *cmd, void *dummy, const char *fn,
                                  const char *fmt, const char *envclause)
{
    const char *err_string = NULL;
    multi_log_state *mls = ap_get_module_config(cmd->server->module_config,
                                                &log_config_module);
    config_log_state *cls;
    cls = (config_log_state *) apr_array_push(mls->config_logs);
    cls->condition_var = NULL;
    if (envclause != NULL) {
        if (strncasecmp(envclause, "env=", 4) != 0) {
            return "error in condition clause";
        }
        if ((envclause[4] == '')
            || ((envclause[4] == '!') && (envclause[5] == ''))) {
            return "missing environment variable name";
        }
        cls->condition_var = apr_pstrdup(cmd->pool, &envclause[4]);
    }
    cls->fname = fn;
    cls->format_string = fmt;
    if (fmt == NULL) {
        cls->format = NULL;
    }
    else {
        cls->format = parse_log_string(cmd->pool, fmt, &err_string);
    }
    cls->log_writer = NULL;
    return err_string;
}

您必须(无论您之前是否说过不能(:

  • 说服开发人员保持SetEnv和CustomLog相同
  • 自己解析 conf 文件并保持手指交叉
  • 修改mod_log_config.c(坏主意!
  • 忘记整件事! ;)

最新更新