Laravel 部署 AI 功能最坑的不是代码,而是服务器配置。
max_execution_time 或 Nginx 的 504 超时。最糟糕的是,如果没配置好 Queue 的 retry_after,一个慢任务可能被重复执行,直接导致 Token 费用翻倍。从成本和稳定性考虑,我的结论是:禁止在 Web 请求中同步调用 LLM,全部扔进队列。
这样可以避免 PHP-FPM 进程被长时间占用导致全站卡死。为了在 Laravel 中稳健地处理 AI 工作流,我总结了一套实操配置方案:
一、服务器环境调优
max_execution_time,防止长文本生成时进程被强制杀死。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() 方法明确指定超时时间
}
}
三、关键指标对比
对于追求性价比的部署,建议给 Queue Worker 分配独立的资源组,防止 AI 任务把整个服务器的 CPU 跑满影响主站访问。