You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel Scheduler中对任务进行限流处理?

Laravel调度器任务实现限流的方案

针对你的Laravel 5.5调度任务触发API速率限制(每分钟90次)且任务被提前终止的问题,完全可以在任务里实现限流机制,以下是几种可行方案:

方案一:基于Laravel缓存手动实现限流

Laravel 5.5自带的缓存系统可以用来做简单的请求计数和时间窗口控制,核心思路是记录单位时间内的请求次数,达到上限时等待一段时间再继续。

示例代码:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Cache;

class YourLongRunningTask extends Command
{
    protected $signature = 'task:long-running';
    protected $description = '长时间运行的API请求任务';

    // 限流配置
    const MAX_REQUESTS_PER_MINUTE = 90;
    const TIME_WINDOW_SECONDS = 60;

    public function handle()
    {
        // 假设这是你要循环处理的API请求列表
        $apiRequests = [...];

        foreach ($apiRequests as $requestData) {
            // 检查当前窗口内的请求次数
            $cacheKey = 'api_request_count_' . date('YmdHi');
            $requestCount = Cache::get($cacheKey, 0);

            if ($requestCount >= self::MAX_REQUESTS_PER_MINUTE) {
                // 计算需要等待的时间,直到下一分钟窗口刷新
                $waitSeconds = self::TIME_WINDOW_SECONDS - (time() % self::TIME_WINDOW_SECONDS);
                $this->info("已达请求上限,等待{$waitSeconds}秒后继续...");
                sleep($waitSeconds);
                // 重置计数(因为窗口已更新)
                Cache::put($cacheKey, 0, self::TIME_WINDOW_SECONDS);
            }

            // 执行API请求
            $this->makeApiRequest($requestData);

            // 更新请求计数
            Cache::increment($cacheKey, 1);
            Cache::put($cacheKey, Cache::get($cacheKey), self::TIME_WINDOW_SECONDS);
        }
    }

    private function makeApiRequest($data)
    {
        // 你的API请求逻辑
    }
}

这个方案无需额外依赖,完全用Laravel自带功能实现,适配你的5.5版本。

方案二:使用第三方限流包

可以选择兼容Laravel 5.5的限流包,比如graham-campbell/throttle(对应版本5.3.*适配Laravel5.5),通过Composer安装后直接调用限流逻辑:

  1. 安装包:
composer require graham-campbell/throttle:5.3.*
  1. 在任务中使用:
use GrahamCampbell\Throttle\Facades\Throttle;

// ...

public function handle()
{
    $apiRequests = [...];

    foreach ($apiRequests as $requestData) {
        // 检查是否允许请求(每分钟90次)
        $throttle = Throttle::get('api_task', 90, 60);
        if (!$throttle->check()) {
            // 等待到窗口重置
            sleep($throttle->getDelay());
        }

        // 执行API请求
        $this->makeApiRequest($requestData);

        // 记录请求
        $throttle->hit();
    }
}

额外提示:解决任务被'killed'的问题

任务被提前终止除了API限流触发的可能,还可能是以下原因:

  • PHP的max_execution_time设置过小,可在任务开头添加set_time_limit(0);关闭执行时间限制
  • Nginx的fastcgi_read_timeout或proxy_read_timeout设置过短,需要调整Nginx配置延长超时时间
  • 服务器进程管理工具(如Supervisor)如果有进程超时限制,也需要对应调整

内容的提问来源于stack exchange,提问作者Yeo Bryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 08:45:48