我在我的项目中使用 Beanstalkd 消息队列来处理 ffmpeg 视频。我将pheanstalk PHP 客户端用于 beanstalkd 队列。我的工人看起来像:
...
// get latest job
$job = $this->pheanstalk->reserve();
// get the data from the job
$jobData = unserialize($job->getData());
// process job, giving a result
$result = $this->task($jobData);
if ($result) {
// success = delete
$this->pheanstalk->delete($job);
} else {
// failed = bury
$this->pheanstalk->bury($job, 1024);
}
...
在 task() 方法中,我使用 smth,例如:
// video processing
$processVideo = 'ffmpeg -vpre libx264-max -y -i inputfile ...';
shell_exec($processVideo);
// taking screenshots from video
...
如您所知,视频处理可能需要很长时间,有时它会超过预定义的作业ttr(运行时间)。这样,作业就会收到超时事件并再次返回排队。我同时运行我的工人数次以进行异步处理。因此,下一个空闲的工人试图接受未完成的工作。最后,我在一个视频文件下有两个或多个进程。我想,我可以定义很长的ttr,但这不是一个好的设计。我注意到,beantalkd 有 DEADLINE_SOON 事件。但我不知道,如何在我的工人身上捕捉到它。我需要它能够使用“触摸”命令。
你有什么建议吗?