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版(最终版)
请告诉我,我错过了一些明显的东西;)
答案 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;
}
你必须要么(无论你以前曾说过你不能):
mod_log_config.c
(糟糕的主意!)