使用Laravel 4更新视图中的实时数据(如进度条)

Joh*_*nes 2 php ajax laravel laravel-4

TL; DR

我想发送数据以在视图中实时更新,例如显示操作状态的进度条.在laravel 4中最好的方法是什么?


安装程序

我正在开发一个基于Laravel 4的项目,每个用户都可以兑换一个串行密钥.

我已经创建了一个管理员后端,我可以轻松地粘贴到一个键列表中,或者上传它们的文件.

假设$key_string是我上传的换行符的字符串,并且想要解析然后上传所包含的键字符串 - 这里是添加键的简化代码:

$key_string = rtrim($key_string);
$key_string = str_replace("\n\r", "\n", $key_string);
$keys = explode( "\n", $key_string);

foreach($keys as $index => $key) {
    Key::create(
        array( "serial" => trim($key) )
    );
}
Run Code Online (Sandbox Code Playgroud)

由于我上传的数字组成千上万,这有时需要30秒,在此期间管理面板自然不会显示任何内容.

现在,我不介意花这个时间.我不需要优化上传以使用一个查询等,但我想有一些实际的反馈,所以我知道上传已经走了多远.


问题

当我上传密钥时,我希望能够每隔几秒或百分比滴答在我的视图中更新进度条或计数器(使用当前$index)

有没有一种简单的方法可以轻松地处理这种情况,最好是集成在Laravel 4中?我假设这会涉及ajax,但是有人能指出我正确的方向吗?

Mic*_*ins 7

使用PHP,实际上有两种选择,无需使用Web套接字或推送设置.这不是Laravel的事情,它更像是一个请求JSON"事物"的AJAX循环.

短轮询

Olark将这种方法用于他们的聊天脚本.

setInterval(function() {
    $.getJSON("/path", function(data) {
        // update the view with your fresh data
    });
}, 5000);
Run Code Online (Sandbox Code Playgroud)

长期民意调查

使用Javascript

var eventName = function() {
    $.getJSON("/path", function(data) {
        // update the view with your fresh data
        if (data.progress < 100)
            eventName();
    });
};
Run Code Online (Sandbox Code Playgroud)

控制器逻辑

当用户上传CSV并等待它完成上传和处理时,我会使用此功能.

// in your controller
$check = true;
while ($check) {
    // search database
    // compare values
    if ($newDataWasFound)
        $check = false;

    $progressFromAbove = 90;
}

return Response::json(array(
    'newData' => $array,
    'progress' => $progressFromAbove,
));
Run Code Online (Sandbox Code Playgroud)

我使用Laravel 3对此进行了截屏,但Long Polling与PHP相关而非Laravel. https://www.youtube.com/watch?v=LDgJF77jELo

例子