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

同一服务器下从一个Laravel实例向另一个推送Redis队列任务

跨Laravel项目直接推送Redis队列任务的实现方案

完全可以跳过HTTP调用,直接让第一个项目向第二个项目的Redis队列推送任务,这能减少网络开销,提升流程效率。以下是具体实现步骤和注意事项:

核心前提

两个项目需能访问同一Redis服务(同一服务器自然满足),且需明确第二个项目的Redis连接参数、队列名称,以及目标任务类的完整命名空间和参数结构。

实现步骤

1. 配置第一个项目的Redis连接

在第一个项目的config/database.php中,添加指向第二个项目的Redis连接配置:

'redis' => [
    // 原有项目的Redis连接...
    'project2' => [
        'host' => env('REDIS_PROJECT2_HOST', '127.0.0.1'),
        'password' => env('REDIS_PROJECT2_PASSWORD', null),
        'port' => env('REDIS_PROJECT2_PORT', '6379'),
        'database' => env('REDIS_PROJECT2_DB', '1'), // 确保和第二个项目的Redis数据库一致
    ],
]

2. 配置第一个项目的队列连接

在config/queue.php中,新增指向第二个项目Redis队列的连接:

'connections' => [
    // 原有队列连接...
    'project2_queue' => [
        'driver' => 'redis',
        'connection' => 'project2', // 对应上面配置的Redis连接名
        'queue' => env('PROJECT2_QUEUE_NAME', 'notifications'), // 第二个项目的目标队列名
        'retry_after' => 90,
    ],
]

3. 推送任务至第二个项目队列

方式一:直接使用Queue门面(推荐)

如果第一个项目能获取到第二个项目的任务类(可复制任务类文件到第一个项目,或确保类结构一致),直接调用推送:

use Illuminate\Support\Facades\Queue;
// 这里的任务类需和第二个项目的SendNotification类结构完全一致
use App\Jobs\SendNotification;

// 构造任务参数,和第二个项目任务类的构造函数匹配
$userId = 123;
$message = '测试通知';

// 指定连接推送任务
Queue::connection('project2_queue')->push(new SendNotification($userId, $message));

方式二:手动构造任务数据推送

若不想复制任务类,可手动构造符合Laravel Redis队列格式的任务数据:

use Illuminate\Support\Facades\Redis;

$jobPayload = [
    'displayName' => 'App\Jobs\SendNotification', // 第二个项目任务类的完整命名空间
    'job' => 'Illuminate\Queue\CallQueuedHandler@call',
    'maxTries' => null,
    'timeout' => null,
    'data' => [
        'commandName' => 'App\Jobs\SendNotification',
        'command' => serialize((object)[
            '__CLASS__' => 'App\Jobs\SendNotification',
            'userId' => 123,
            'message' => '测试通知'
        ]),
    ],
];

// 推送至第二个项目的队列Key,格式为queues:队列名
Redis::connection('project2')->rpush('queues:notifications', json_encode($jobPayload));

关键注意事项

  • 版本兼容性:确保两个Laravel版本的队列序列化逻辑一致,避免第二个项目的worker无法反序列化任务。
  • 权限控制:限制第一个项目的Redis连接仅能访问目标队列所在的数据库,避免误操作其他数据。
  • 测试验证:推送后启动第二个项目的队列worker(php artisan queue:work redis),确认任务能正常执行并发送通知。

内容的提问来源于stack exchange,提问作者Adham shafik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:20:27