Laravel 部署 AI 功能最坑的不是代码,而是服务器配置。

智能体养殖户 新手 4小时前 455 浏览 13 点赞 约 1 分钟

绝大多数 VPS 的默认配置是为 200ms 级别的请求设计的,但 LLM 调用动辄 30-120 秒。如果你直接在控制器里写 API 调用,很容易触发 PHP max_execution_time 或 Nginx 的 504 超时。最糟糕的是,如果没配置好 Queue 的 retry_after,一个慢任务可能被重复执行,直接导致 Token 费用翻倍。

从成本和稳定性考虑,我的结论是:禁止在 Web 请求中同步调用 LLM,全部扔进队列。

这样可以避免 PHP-FPM 进程被长时间占用导致全站卡死。为了在 Laravel 中稳健地处理 AI 工作流,我总结了一套实操配置方案:

一、服务器环境调优

  • PHP 配置: 调高 max_execution_time,防止长文本生成时进程被强制杀死。

  • Nginx 配置: 必须关闭 fastcgi_buffering。否则 Stream 流式输出会被缓存,用户得等全部生成完才一次性跳出来,完全失去了 Streaming 的意义。

  • 超时设置:fastcgi_read_timeout 增加到 120s 以上。
  • 二、队列任务实战
    处理 LLM 任务的 Job 必须严格控制重试机制,避免昂贵的重复计费。

    namespace App\Jobs;

    use Illuminate\Bus\Queueable;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Illuminate\Foundation\Bus\Dispatchable;
    use Illuminate\Queue\InteractsWithQueue;
    use Illuminate\Queue\SerializesModels;

    class ProcessAiCompletion implements ShouldQueue
    {
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    // 关键:必须大于 LLM 可能的最长响应时间,防止任务被重复分发导致多扣钱
    public $retry_after = 300;

    // 限制重试次数,防止 API 挂了之后死循环刷钱
    public $tries = 3;

    public function handle()
    {
    // 调用 AI 接口的逻辑
    // 建议配合 Laravel HTTP Client 的 timeout() 方法明确指定超时时间
    }
    }

    三、关键指标对比

  • 同步调用: 占用 FPM 进程 → 易触发 504 → 响应体阻塞 → 用户体验极差。

  • 异步队列: 毫秒级响应 → 独立 Worker 处理 → 支持状态轮询/广播 → 成本可控。
  • 对于追求性价比的部署,建议给 Queue Worker 分配独立的资源组,防止 AI 任务把整个服务器的 CPU 跑满影响主站访问。

    提示词LLMPromptailaravel

    全部回复 (3)

    B
    beam search走 新手 4小时前
    得把超时时间设在 API 响应上限之上,不然队列重试会把额度跑光。
    0 回复
    R
    RAG用起来 新手 4小时前
    没提 Webhook 吧?同步等响应太 risk 了,不改异步怎么 scale?
    0 回复
    E
    embedding查750 新手 4小时前
    我也踩过这个坑,没调好超时直接导致重复扣费,这成本谁受得了?
    0 回复

    发表回复

    支持 Markdown 格式