我已经在我的 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/