frankenphp 的 slow log 配置需在 php.ini 或 frankenphp.ini 中显式设置 request_slowlog_timeout = 2s 和 slowlog = /var/log/php-slow.log,且仅 v0.19+ 版本在 embed sapi 下支持;必须通过环境变量指定 php_ini_path 并确保进程对日志路径有写权限。

FrankenPHP 的 slow log 配置在哪儿
FrankenPHP 本身不内置类似 PHP-FPM 的 slowlog 机制,它依赖底层 PHP 的运行时配置。也就是说,慢请求日志得靠 PHP 自身的 request_slowlog_timeout 和 slowlog ini 设置生效,但前提是 FrankenPHP 启动时加载了这些配置——而默认它只读 php.ini,不会自动继承 PHP-FPM 的 pool 配置。
- 必须在 PHP 配置文件(通常是
php.ini或frankenphp.ini)里显式设置:request_slowlog_timeout = 2s slowlog = /var/log/php-slow.log
-
slowlog路径需确保 FrankenPHP 进程有写权限(比如用www-data用户启动时,目录属主得匹配) -
request_slowlog_timeout值必须带单位(s或ms),写成2不生效
为什么开了 slowlog 却没日志输出
常见原因不是配置漏了,而是 PHP 运行模式不支持:FrankenPHP 使用的是 embed SAPI,而 request_slowlog_timeout 在 embed 模式下默认被禁用,即使 ini 里写了也不会触发。
- 解决办法是启动 FrankenPHP 时加环境变量强制启用:
PHP_INI_SCAN_DIR="" PHP_INI_PATH="/etc/php/8.3/cli/php.ini" frankenphp
并确保该php.ini文件中同时存在:enable_dl = Off variables_order = "GPCSE" request_slowlog_timeout = 2s slowlog = /var/log/php-slow.log
- 注意:FrankenPHP v0.19+ 才完整支持 embed 下的 slowlog;旧版本即使配了也静默忽略
- 日志内容格式和 PHP-FPM 一致,包含时间、PID、执行耗时、脚本路径、堆栈片段
如何验证 slowlog 是否真在工作
别只看文件是否存在,得触发一次慢请求并检查输出是否符合预期。
- 写个测试脚本
sleep.php:<?php usleep(3_000_000); // 睡 3 秒,超过 2s 阈值 ?>
- 用 curl 请求:
curl @#@#@#@#@#@#@#@#@#@0 - 然后立刻检查
slowlog文件末尾是否有类似内容:[12-Oct-2024 15:22:33] [pool www] pid 12345 script_filename = /var/www/sleep.php [0x00007f8b1c0a1234] usleep() /var/www/sleep.php:1
- 如果没输出,优先检查
ps aux | grep frankenphp看实际加载的 php.ini 路径是否和你修改的一致
慢请求日志真正起效的关键点就两个:一是 PHP embed SAPI 的兼容性版本,二是 slowlog 文件路径的进程级写权限——这两处出问题,其他配置全对也没用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











