Supervisor 配置 Hyperf 必须使用绝对路径启动、禁用 --daemonize、设置足够 startsecs(建议10秒)、显式声明 environment 变量,并验证环境与日志生效,否则易出现静默失败。

Supervisor 的 program 配置必须用绝对路径启动 php
Hyperf 启动命令如 php bin/hyperf.php start 在 Supervisor 中不能写成相对路径,否则进程会因工作目录不一致而启动失败或静默退出。Supervisor 默认工作目录是 / 或用户 home,不是项目根目录。
实操建议:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- 用
which php查出 PHP 可执行文件的绝对路径(例如/usr/bin/php),不要依赖 PATH 环境变量 - 项目路径也必须写绝对路径,比如
/var/www/my-hyperf-app/bin/hyperf.php - 在
command=中拼接完整命令:/usr/bin/php /var/www/my-hyperf-app/bin/hyperf.php start - 务必设置
directory=为项目根目录(如/var/www/my-hyperf-app),否则 Hyperf 加载配置、扫描注解会出错
日志输出要显式重定向 stdout/stderr,不能只靠 stdout_logfile
Hyperf 默认使用 Swoole 的守护进程模式(--daemonize),一旦开启,所有 echo、var_dump、error_log 都不会输出到终端 —— 这意味着 Supervisor 的 stdout_logfile 和 stderr_logfile 将收不到任何内容,日志文件为空。
实操建议:
- 禁用
--daemonize:确保 Hyperf 运行在前台模式,Supervisor 才能接管其标准流 - 在
command=后追加> /dev/null 2>&1是错误做法,会丢掉全部日志;正确方式是让 Hyperf 自己写日志,并配合 Supervisor 日志做双保险 - 推荐组合:
– Hyperf 配置config/autoload/logger.php把default日志通道写入文件(如runtime/logs/hyperf.log)
– Supervisor 的stdout_logfile仅用于捕获启动阶段错误(如 autoload 失败、端口被占),路径设为/var/log/supervisor/my-hyperf-stdout.log
autostart 和 autorestart 必须配合 startsecs 使用
Hyperf 启动耗时比传统 PHP 脚本长(需加载容器、扫描注解、连接 Redis/DB 等),如果 startsecs 太小(默认 1 秒),Supervisor 会误判进程启动失败并反复拉起,导致 CPU 占用飙升、端口冲突或 Address already in use 错误。
实操建议:
- 将
startsecs=10(至少 8–12 秒),给 Hyperf 充足初始化时间 -
autorestart=true是必须的,但类型建议用unexpected(仅非正常退出才重启),避免健康检查失败后无限循环重启 - 加上
stopwaitsecs=15,因为 Hyperf 接收 SIGTERM 后需优雅关闭协程和连接,硬 kill 容易丢请求 - 若用
numprocs=2多进程,请确认 Hyperf 已配置swoole.server.mode = 3(Process 模式),否则多实例会争抢端口
环境变量丢失是常见 silent failure 根源
Supervisor 不继承系统 shell 的环境变量(如 APP_ENV、DB_HOST),Hyperf 启动后读不到 .env 或环境配置,表现为数据库连不上、Redis 连接超时、配置项为 null —— 但进程仍在运行,日志里却没报错。
实操建议:
- 在 program 段显式声明:
environment=APP_ENV="prod",DB_HOST="127.0.0.1",REDIS_HOST="127.0.0.1" - 避免在 environment 中写敏感值;更安全的做法是把
.env放到项目外(如/etc/hyperf/.env),然后用dotenv_path=/etc/hyperf/.env参数传给 Hyperf(需自定义启动脚本封装) - 验证是否生效:在
command中临时加; env | grep APP_ENV并查看 stdout_logfile,确认变量已注入

















