frankenphp 错误日志默认输出到 stderr 而非文件,php 错误需配置 error_log = stderr 且与 log_errors = on 同在一份 php.ini 中生效;自身日志由 frankenphp.yaml 控制,与 php 应用日志分离。

FrankenPHP 的错误日志不固定在某个文件里,它默认根本**不写文件**——所有 PHP 运行时错误(Fatal error、Warning、Parse error)都直接输出到 stderr,也就是你启动 FrankenPHP 时看到的终端画面,或容器/服务管理器捕获的标准错误流。
docker logs -f 看不到 PHP 错误?先确认是否真输出到了 stderr
很多人执行 docker logs -f my-app 却看不到 Fatal error,不是日志没生成,而是容器根本没把 stderr 暴露出来,或 PHP 没配置成往那里写:
-
error_log = stderr必须显式写在生效的php.ini里(不能只开log_errors = On) - 用
frankenphp php-cli -i | grep "error_log"确认当前实际加载的php.ini路径和值 - 如果
error_log指向的是/var/log/php_errors.log,但容器里该路径没挂载或无写权限,错误就“消失”了 - Docker 镜像若用了自定义入口脚本,可能重定向了
stdout/stderr,得检查docker inspect my-app | jq '.[0].Config.Cmd'
systemd 服务下 fatal error 只闪一下就退出?盯住 journalctl -n 50
FrankenPHP 启动失败(比如 panic: runtime error 或 failed to load extension)时,进程常立刻退出,终端来不及看清。此时 journalctl 是唯一可靠来源:
- 别用
journalctl -u frankenphp -f盲等,先查最近 50 行:sudo journalctl -u frankenphp -n 50 - 重点看最后一两行:是
bind: permission denied(端口被占)、no such file or directory(document-root 路径错),还是PHP Parse error(入口文件语法错) - 如果连
INFO Using config file都没打印,说明配置加载失败,可能是frankenphp.yaml语法错误或路径不对
为什么 /var/log/php_errors.log 里空空如也?log_errors 和 error_log 必须同源
开了 log_errors = On 却没日志,90% 是因为 error_log 配置没生效,或指向了不可写位置:
- 两个指令必须出现在**同一份 php.ini 文件**中;如果
log_errors在/etc/php/8.3/cli/php.ini,而error_log在/usr/local/etc/php/conf.d/custom.ini,后者可能被忽略 - 绝对路径要可写:
error_log = /var/log/frankenphp/php_errors.log要求/var/log/frankenphp/存在且 FrankenPHP 进程用户(如www-data)有写权限 - 避免相对路径:
error_log = php_errors.log会尝试写入当前工作目录,而 FrankenPHP 的工作目录不确定(可能是/或/app) - 最省事的验证方式:在
index.php顶部加一行trigger_error("test", E_USER_WARNING);,然后立刻检查目标路径是否多出这一行
真正容易被忽略的点是:FrankenPHP 自身日志(启动、路由、panic)和 PHP 应用日志(trigger_error、error_log())走的是两套完全独立的机制——前者由 frankenphp.yaml 的 logs 块控制,后者只认 php.ini。混在一起配,十有八九查半天发现根本没读对文件。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











