4

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

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

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

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

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

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

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

Apache 2.2.16 (Unix) PHP 5.3.3 CentOS release 5.5 (Final)

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

4

2 回答 2

1

这有点骇人听闻,但你可以把

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

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

于 2011-07-05T18:27:23.770 回答
0

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

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

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] == '\0')
            || ((envclause[4] == '!') && (envclause[5] == '\0'))) {
            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(坏主意!)
  • 忘记整件事!;)
于 2011-07-05T18:56:35.260 回答