必须显式配置 php.ini 中的 log_errors = on,frankenphp 不默认开启错误日志;需先通过 frankenphp php-cli -i | grep "loaded configuration file" 确认实际加载的 php.ini 路径,再确保 log_errors 和 error_log 同在该文件中设置,且 error_log 指向有写权限的绝对路径、syslog 或 stderr。

必须显式配置 php.ini 中的 log_errors = On,FrankenPHP 不会默认开启 PHP 错误日志 —— 它只运行 PHP,不接管错误日志开关。
确认 FrankenPHP 实际加载的 php.ini 路径
FrankenPHP 启动时可能 fallback 到内置默认配置,而非你预期的自定义 php.ini。不验证路径就改配置,大概率无效。
- 运行
frankenphp php-cli -i | grep "Loaded Configuration File"查看真实加载的 ini 文件路径 - 若输出为
none或空,说明用的是编译内建配置,需通过--php-config指定或挂载自定义 ini - Docker 用户注意:/usr/local/etc/php/php.ini 未必被读取,要检查容器内实际路径(常为 /etc/php/8.3/cli/php.ini 或 /usr/local/etc/php/conf.d/xxx.ini)
log_errors 开启后,error_log 写到哪?
log_errors = On 只是“允许记录”,真正写入位置由 error_log 配置决定。两者必须同时生效才会有日志文件。
- 设为绝对路径(推荐):
error_log = /var/log/php_errors.log—— 确保 FrankenPHP 进程有写权限 - 设为
syslog:error_log = syslog—— 错误发给系统日志服务(journalctl -u frankenphp可查) - 设为
stderr:error_log = stderr—— 错误直接输出到终端或容器 stdout,docker logs -f即可见 - 避免相对路径(如
error_log = php_errors.log),工作目录不确定,极易写入失败
为什么开了 log_errors 还没日志?常见卡点
不是配置没生效,就是日志被“吞”或“丢”了。优先排查这几点:
-
log_errors和error_log必须在同一份 php.ini 里设置;分属不同 ini 文件(如一个在 main,一个在 conf.d/xxx.ini)可能因加载顺序覆盖 - PHP 运行时权限不足:检查
error_log目标路径的父目录是否可写,尤其 Docker 挂载卷时宿主机目录权限是否映射正确 - FrankenPHP 以 worker 模式运行时,某些异常(如入口脚本 parse error)发生在 SAPI 初始化前,此时
log_errors尚未起效,只能靠终端 stderr 输出 - 框架(如 Laravel)或中间件提前捕获并静默了异常 —— 临时注释掉
App\Exceptions\Handler::render()或等效逻辑再试
最可靠的验证方式:在入口 PHP 文件顶部加一行 trigger_error('test log_errors', E_USER_WARNING);,然后看对应 error_log 路径是否立刻出现该条日志。没出现,说明配置或权限仍有问题;出现了,说明基础链路通了,后续问题出在应用层或异常触发时机上。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











