プロジェクトでffmpeg処理ビデオにBeanstalkdメッセージキューを使用しています。私はbeanstalkdキューにpheanstalkPHPクライアントを使用しています。私の労働者は次のようになります:
...
// 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(実行時間)を超える場合があります。このようにして、ジョブはタイムアウトイベントとカムバックを受け取り、再びキューに入れます。非同期処理のために、ワーカーを同時に複数回実行します。したがって、次の無料の労働者は未完成の仕事を引き受けようとします。最後に、1つのビデオファイルの下に2つ以上のプロセスがあります。私は非常に長いttrを定義できると思いますが、それは良い設計ではありません。気付いたのですが、beanstalkdにはDEADLINE_SOONイベントがあります。しかし、どうやってそれを労働者に捕まえるのか、私にはわかりません。「touch」コマンドを使用できるようにする必要があります。
何かアドバイスはありますか?