我正在使用Laravel 4.2
。
我正在开展一个用户上传视频的项目。要将上传的视频提供给所有类型的设备,我使用php-ffmpeg
包来transcode
。转码过程非常耗时,我决定将其转移到后台,为此我使用Amazon SQS
实现了队列机制。
我已在SQS
文件中配置了queue.php
驱动程序和密钥,密钥,URL以及区域。
仅出于测试目的,我在Routes.php
中添加了以下代码。
Route::get('/testasync/{id}', function($id){
Queue::push(function($job) use ($id) {
try{
$video_rel = VideoRel::find($id);
$video_rel->delete();
} catch(Exception $ex){
}
$job->delete();
});
return "hello 1234 world " . $id;
});
因此,每当我向http://mydomainname/testasync/{id}
发出get请求时,它都会将消息推送到队列以从特定模型中删除该特定记录。
令人惊讶的是,我发现队列将 NOT 执行,直到我在服务器上执行queue listener
。
如果我需要在服务器上执行某些操作(例如部署新代码等),该怎么办?在那种情况下,我必须要停止听众。
另外,我发现的另一个困难是每当我重新执行监听器时,它就会尝试执行所有的工作。
例如,我为Id 1和2发出了两个Get请求。因此删除了两个记录。现在我因某种原因停止了监听,然后再次请求Id 3.现在,在我使用php artisan queue:listen
执行列表器之前,记录3将不会被删除,如果我执行它,则会抛出{{1}的2错误};并删除Id 3的记录。
我不确定为什么会这样,因为必须删除已执行的作业。
任何人都可以有解决方案吗?
最好从代码执行监听器,并在作业完成后停止监听。
答案 0 :(得分:1)
我不确定我理解你的期望,但是当你执行Queue :: push时,你将把作业发送到队列,它只会由监听器执行。如果您没有队列:listen命令,则不会运行。如果您希望立即执行作业,则不应将其发送到队列。
您不需要停止监听器,您可以在监督程序进程内运行它,它将在超时后自动重启该进程。检查一下:http://posts.danharper.me/laravel-queue-supervisor/
现在关闭队列之后的事实:监听它尝试执行已处理的作业对我来说真的很奇怪,可能是作业没有被删除(尝试将作业删除移动到关闭的开头) ),但我需要更多信息来帮助您调试。
希望这些信息对您有所帮助。