PHP可以读取/解析当前vhosts的Apache VirtualHost配置块,以检索ErrorLog和CustomLog设置吗?

时间:2011-07-05 18:20:56

标签: php apache virtualhost error-log

PHP是否可以读取/解析当前vhosts的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可能与当前调用的vhost不匹配,因为ServerAlias可能有一个包含正则表达式的不同虚拟主机,所以一旦找到Apache conf的路径,手动浏览文件就是不理想/可靠。

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

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

2 个答案:

答案 0 :(得分:1)

有点hackish,但你可以把

ErrorLog /path/to/logfile
SetEnv ErrorLog /path/to/logfile
在你的httpd.conf中

,所以你可以使用apache_getenv()函数。 getenv()不检索配置指令,只检索实际的环境变量。所以..把日志路径放到一个环境变量中。

答案 1 :(得分: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(糟糕的主意!)
  • 忘记整件事! ;)