小编典典

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

ajax

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) )
    );
}

由于我上传的密钥组数以千计,因此有时可能需要花费30秒钟的时间,在此期间,管理面板自然不会显示任何内容。

现在,我不在乎这段时间。我不需要优化上传就可以使用一个查询,等等,但是我想获得一些实际反馈,因此我知道上传已经进行了多长时间。


问题

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

有没有简便的方法可以轻松地处理此问题,最好将其集成在Laravel 4中?我以为这会涉及ajax,但是有人可以指出我正确的方向吗?


阅读 496

收藏
2020-07-26

共1个答案

小编典典

使用PHP,实际上有两个选择,而无需进行Web套接字或推挽式设置。这并不是Laravel真正的事情,它更像是一个请求JSON“事物”的AJAX循环。

短轮询

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

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

长时间轮询

Java脚本

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

控制器逻辑

当我有用户上载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,
));
2020-07-26