我已经在我的 Laravel 4 应用程序中集成了 ironMQ 推送队列,以便运行更长时间的进程。我有一些执行 $.get 的 View 可能需要 30 秒。我想看看其他人正在做什么,以便在 ironMQ 完成推回端点时轻松获得通知。

我将主要使用推送队列做的一个例子:

public function getCompletedTasks() {

    $user = User::find(Auth::user()->id);

    Queue::push(function($job) use ($user) {
        $recent = new Recent;
        $tasks  = $recent->getCompletedTasks($user);
        // append data from $tasks to DOM
        // here's where I want to receive my notification
    });
}

在这里,我只是从匹配用户数据的 API 中获取任务。

我知道我可以将响应数据存储到数据库并使用 AJAX 长轮询来不断检查数据,但在大多数情况下,我需要这样做似乎工作量太大。我对 websockets 不太了解。在这些情况下,你们做了什么类型的事情?如果您有任何示例,那将非常有帮助。谢谢。

更新 :使用 Pusher 解决了该问题。看我的回答。

最佳答案

我能够在 Pusher 的帮助下解决我的问题。这是我所做的:

像往常一样设置我的 Iron MQ 推送队列。在 routes.php 中:

Route::post('queue/push', function() {
    return Queue::marshal();
});

安装 pusher laravel package

在我的 Controller 中,我 Queue::push 我的数据。在闭包内,我触发了一个新的 Pusher channel 。这显然只会在数据从 IronMQ 返回时触发。
public function getCompletedTasks() {

    $user = User::find(Auth::user()->id);

    Queue::push(function($job) use ($user) {

        $recent = new Recent;
        $tasks  = $recent->getCompletedTasks($user);

        $pusher = new Pusher('xxx', 'xxx', 'xxx');
        $pusher->trigger('reports', 'get_completed_tasks', array('tasks' => $tasks));

        $job->delete();
    });
});

在我看来,接下来我将不带回调调用我的 AJAX 函数,因为我还不会做任何其他事情:
$.get('account/tasks/completed');

接下来在我看来,我初始化 Pusher,订阅事件并将 get_completed_tasks 绑定(bind)到 Pusher channel 。现在我们只需等待 Pusher 的响应,然后我就可以执行原始 AJAX 请求的后半部分:
{{ HTML::script('//js.pusher.com/2.1/pusher.min.js') }}
<script>
var pusher  = new Pusher('xxx');
var channel = pusher.subscribe('reports');
    channel.bind('get_completed_tasks', function(data) {
        // do something with the data returned
    });
</script>

一旦我在我的应用程序中使用了 Pusher,剩下的就变得轻而易举了。希望这可以帮助某人!

关于ajax - 如何使用 : Get real-time notifications in Laravel 4 using Iron. io MQ、推送队列和 AJAX,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20129033/

10-12 00:48