同一服务器下从一个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
相关产品推荐
相关产品推荐

