Я использую очередь сообщений Beanstalkd для обработки видео ffmpeg в моем проекте. Я использую PHP-клиент pheanstalk для очереди 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 () я использую что-то вроде:
// video processing
$processVideo = 'ffmpeg -vpre libx264-max -y -i inputfile ...';
shell_exec($processVideo);
// taking screenshots from video
...
Как вы знаете, обработка видео может занимать много времени, а иногда и превышает предварительно заданное задание ttr (время запуска). Таким образом, задание получает событие истечения времени ожидания и возвращается в очередь снова. Я запускаю своего работника одновременно несколько раз для асинхронной обработки. Поэтому следующий свободный работник пытается устроиться на незаконченную работу. Наконец, у меня есть два или более процессов в одном видеофайле.
Я думаю, я могу определить очень длинный ttr , но это не очень хорошее решение. Я заметил, что у beanstalkd есть событие DEADLINE_SOON. Но я не знаю, как поймать это в моем работнике. Мне нужно чтобы у меня была возможность использовать команду "touch" .
У вас есть какие-нибудь советы?