如何在Laravel队列Job的handle方法中获取Worker进程唯一标识
方案1:直接获取当前进程PID(最简单无额外依赖)
PHP内置了getmypid()函数可以直接获取当前执行进程的唯一PID,同时可以通过$this->job->getJobId()获取当前任务的队列ID,直接在Job类中调用即可:
class ProcessLocationJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected $fetchLocation; /** * Execute the job. * * @return void */ public function handle() { // 获取当前Worker进程PID和任务ID $workerPid = getmypid(); $jobId = $this->job->getJobId(); Log::info("[worker:{$workerPid}] started processing JOB id {$jobId}"); $this->fetchLocation->execute(); } /** * Handle a job failure. * * @param \Throwable $exception * @return void */ public function failed(Throwable $exception) { $workerPid = getmypid(); $jobId = $this->job->getJobId(); Log::error("[worker:{$workerPid}] job id {$jobId} failed: {$exception->getMessage()}" ); } }
该方案不需要修改任何额外配置,直接就能使用,完全符合你要求的日志输出格式。
方案2:全局日志自动添加工位标识(一劳永逸)
如果不想每个Job都重复写获取PID的代码,可以直接给日志系统全局添加工位标识上下文,所有日志都会自动带上该信息:
- 首先修改Supervisor配置,给每个Worker进程注入编号环境变量:
[program:laravel-worker] ... user=admin numprocs=8 environment=PROCESS_NUM=%(process_num)02d ...
- 修改Laravel日志配置
config/logging.php,给你使用的日志通道添加进程ID处理器:
'daily' => [ 'driver' => 'daily', 'path' => storage_path('logs/laravel.log'), 'level' => env('LOG_LEVEL', 'debug'), 'days' => 14, // 新增下面这行,自动注入PID到所有日志上下文 'processors' => [Monolog\Processor\ProcessIdProcessor::class], ],
配置完成后所有日志都会自动带上PID信息,同时你可以在任意位置通过getenv('PROCESS_NUM')获取当前是第几个Worker进程。
方案3:监听队列事件全局记录任务日志
如果你需要所有任务的启动日志统一处理,不用每个Job都手动写记录代码,可以监听Laravel自带的JobProcessing事件:
在app/Providers/EventServiceProvider.php中注册事件监听:
protected $listen = [ 'Illuminate\Queue\Events\JobProcessing' => [ 'App\Listeners\LogJobProcessing', ], ];
然后创建对应的监听类,在里面统一记录所有任务的启动日志,自动带上Worker PID和任务ID即可。
内容的提问来源于stack exchange,提问作者Skywarth
相关产品推荐
相关产品推荐

