phpEnv需手动配置三层日志隔离:Apache层在httpd-vhosts.conf中为每个VirtualHost显式设置ErrorLog和CustomLog;PHP层通过ini_set()或.htaccess指定per-site error_log;轮转层用rotatelogs.exe实现按时间/大小自动切分,PHP-FPM模式则须在pool配置中设php_admin_value[error_log]。

phpEnv 本身不提供站点级日志隔离功能,所有站点默认共用同一份 Apache 错误日志和 PHP 全局 error_log。要实现“每个站点独立日志 + 自动轮转”,必须在 Apache 虚拟主机层、PHP 运行层(含 .htaccess 或入口文件)、以及(若启用)PHP-FPM 池层分别配置,缺一不可。
Apache 层:为每个站点单独声明日志路径
phpEnv 的 Apache 默认只在主配置中设了全局日志(如 C:/phpEnv/logs/apache_error.log),所有虚拟主机都写入该文件。你需要手动为每个站点指定专属日志文件:
- 打开
C:phpEnvApache24confextrahttpd-vhosts.conf - 在每个
<VirtualHost *:80>块内添加两行(路径必须是绝对路径,目录需提前创建):ErrorLog "C:/phpEnv/logs/site-a-error.log"CustomLog "C:/phpEnv/logs/site-a-access.log" common - Windows 路径用正斜杠
/或双反斜杠\,单反斜杠会解析失败 - 确保
C:phpEnvlogs目录存在,且 Windows 服务运行账户(通常是SYSTEM)对该目录有写权限,否则 Apache 启动失败
PHP 层:避免全局 error_log 复用
phpEnv 的 php.ini 是全局一份,error_log = C:/phpEnv/php_errors.log 会让所有站点的 PHP 错误混在一起。必须 per-site 动态指定:
-
推荐方式(入口文件):在每个站点的
index.php顶部加:ini_set('log_errors', '1');ini_set('error_log', 'C:/phpEnv/logs/site-a-php-error.log');
注意:目标目录同样需 SYSTEM 可写 -
备选方式(.htaccess):仅适用于 Apache 模块模式(非 PHP-FPM)
在站点根目录放.htaccess,内容为:php_flag log_errors onphp_value error_log "C:/phpEnv/logs/site-a-php-error.log"
前提是先在httpd.conf的<Directory "C:/phpEnv/www">块中启用AllowOverride All
轮转层:Windows 下可用的轻量方案
Windows 没有原生 logrotate,但可借助 Apache 自带的 rotatelogs.exe 实现按时间或大小轮转:
立即学习“PHP免费学习笔记(深入)”;
- 修改虚拟主机中的
CustomLog和ErrorLog,改用管道调用:ErrorLog "|C:/phpEnv/Apache24/bin/rotatelogs.exe -l C:/phpEnv/logs/site-a-error-%Y-%m-%d.log 86400"CustomLog "|C:/phpEnv/Apache24/bin/rotatelogs.exe -l C:/phpEnv/logs/site-a-access-%Y-%m-%d.log 86400" common -
-l表示使用本地时区时间命名;86400是秒数(即每天轮转);也可用10M替代,表示达 10MB 就切新文件 - PHP 层无法直接用
rotatelogs,仍需靠应用层轮转(如 Monolog)或定期脚本清理
PHP-FPM 场景补充说明
phpEnv 默认使用 Apache 模块(mod_php),但如果你手动切换为 PHP-FPM 模式,PHP 错误日志将不再受 ini_set() 或 .htaccess 控制:
- 错误日志由 FPM pool 配置决定,需编辑
C:phpEnvphpetcpool.dwww.conf(或对应站点池) - 在 pool 段中设置:
catch_workers_output = yesphp_admin_value[error_log] = C:/phpEnv/logs/site-a-fpm-error.logphp_admin_flag[log_errors] = on - 重启 php-fpm 服务后生效,轮转仍需额外脚本或外部工具配合



















