👤 用户
音乐生成一直报错,参考官方开源源代码 https://github.com/MiniMax-AI/cli,帮我追根溯源修复。
🤖 Hermes Agent · 分析

1. 根因分析

问题根因
🎵 音乐 504 超时 XinCache nginx proxy_read_timeout ~60s,而 MiniMax 音乐生成 API 需要 60–90s。nginx 在 PHP 返回前断开连接 → 浏览器收到 HTML 504 而非 JSON → 前端解析报错
🗣️ TTS 童声问题 Agent 传入无效 voice_id(如"童声"),不在 enum 列表内。现有 handler 已兜底:出错返回 10 种可用音色列表,不需改代码

修复前的请求链路:

浏览器 → proxy.php (XinCache nginx) → PHP-FPM → curl → MiniMax API
                          ↓
                  nginx proxy_read_timeout ~60s
                  返回 504 Gateway Time-out ✗

2. 环境约束(关键发现)

通过向 XinCache 上传 PHP 探测脚本,发现服务器极端受限:

约束项影响
disable_functionsexec, proc_open, shell_exec, system, popen, passthru, pcntl_exec等全部禁用无法启动后台独立进程
open_basedir/webHome/.../www:/vhost/tmp/tmp/ 不可写,只能用 /vhost/tmp/
max_execution_time30s常规 PHP 处理超时,但 curl IO 等待不计入
fastcgi_finish_request可用 ✅可先发响应、再后台处理

3. 修复方案

3.1 技术选型

所有进程执行函数均已禁用,因此无法使用 exec("nohup php worker.php &") 启动独立后台进程。最终采用 fastcgi_finish_request 去前台后处理 方案——利用 curl IO 等待不消耗 CPU 时间(不触发 30s max_execution_time),在同一 PHP-FPM 进程内异步处理:

请求 → proxy.php
         │
         ├─ ① 保存参数到 /vhost/tmp/music_tasks/{taskId}.params
         ├─ ② echo json_encode({task_id, status: "processing"})
         ├─ ③ fastcgi_finish_request()  ← 立即发送响应到 nginx/浏览器
         │
         └─ ④ PHP 继续后台执行
               ├─ curl_setopt_timeout(180s) → MiniMax API
               ├─ curl_exec() ← IO 等待,不消耗 CPU 时间
               ├─ 写入 /vhost/tmp/music_tasks/{taskId}.result
               └─ exit

3.2 前端改动

前端 music_generation handler 改为两步:

  1. 创建任务proxyRequest('minimax','/music_generation', body) → 返回 {task_id}(0.18s)
  2. 轮询结果proxyRequest('minimax','/music_poll', {task_id}),指数退避 3s→10s,最多 180s

3.3 修复的 Bug

#Bug修复
🔴 proxy.php Auth header: 'Authorization: Bearer *** . $key'(本地备份文件中的占位符) 修复为 'Authorization: Bearer ' . $key(正确的 PHP 字符串拼接)
🔴 音乐生成 504→前端解析 HTML 报错 异步模式 + 轮询兜底,不再依赖同步等待
🟡 缺少 output_format:'url'(官方 SDK 需求) 之前已修复:显式传参
🟡 genre/mood 等结构化参数作为扁平字段发送 之前已修复:折叠进 prompt 文本

4. 验证结果

测试项结果耗时
Chat Completions✅ 正常~2s
TTS✅ 音频 URL 返回~5s
Music 创建✅ task_id 立即返回0.18s(不再 504)
Music 后台结果✅ audio_url 有效~86s 轮询完成
fastcgi_finish_request 存活✅ 30s 后台 sleep 成功request_terminate_timeout > 30s

5. 已修改文件

文件改动
proxy.php新增异步 /music_generation + /music_poll 端点;修复 Auth header 占位符;使用 /vhost/tmp/
ui2.htmlmusic_generation handler 改为两步轮询(3s→10s 指数退避,180s 上限)

6. 注意事项

  • 并发限制:每个音乐任务占用一个 PHP-FPM worker 60-90s。如果并发生成多首音乐,可能耗尽 XinCache 的 FPM 连接池。这是托管环境的固有约束。
  • request_terminate_timeout:已验证 >30s,但若音乐生成超过此值时可能导致失败。目前 180s curl timeout 配合合理。
  • 文件清理/vhost/tmp/music_tasks/ 中的 .params.result 文件在 poll 成功后自动删除。
  • 全局站:不支持 PHP。音乐生成功能仅限香港站 cmdcode.cn
  • TTS 无效音色:handler 已有兜底逻辑,出错时返回可用音色列表。

7. 参考链接