Laravel 4.2 SQS队列使用代码在后台执行监听器

时间:2015-04-02 06:37:20

标签: php laravel queue

我正在使用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的记录。

我不确定为什么会这样,因为必须删除已执行的作业。

任何人都可以有解决方案吗?

最好从代码执行监听器,并在作业完成后停止监听。

1 个答案:

答案 0 :(得分:1)

我不确定我理解你的期望,但是当你执行Queue :: push时,你将把作业发送到队列,它只会由监听器执行。如果您没有队列:listen命令,则不会运行。如果您希望立即执行作业,则不应将其发送到队列。

您不需要停止监听器,您可以在监督程序进程内运行它,它将在超时后自动重启该进程。检查一下:http://posts.danharper.me/laravel-queue-supervisor/

现在关闭队列之后的事实:监听它尝试执行已处理的作业对我来说真的很奇怪,可能是作业没有被删除(尝试将作业删除移动到关闭的开头) ),但我需要更多信息来帮助您调试。

希望这些信息对您有所帮助。