Laravel 5.1 使用 session.upload_progress

5
我希望能够使用session.upload_progress来构建一个显示我的php脚本状态的进度条。我已经了解到可以通过这种方式实现。
我正在使用laravel Homestead,并且在php.ini中所有要求都已启用。
以下是我的html代码:
{!! Form::open(['route' => 'gebruikers_upload', 'class' => 'form-horizontal import', 'enctype' => 'multipart/form-data', 'target' => 'hidden_iframe']) !!}
                            <input type="hidden" value="myForm" name="{{ini_get("session.upload_progress.name")}}">
                            <input type="file" name="file" id="the-file"/>
                            <button class="btn btn-sm btn-info btn_import" type="submit">Importeer</button>
                            <button class="btn btn-sm btn-danger" type="button">Cancel</button>
                        {!! Form::close() !!}
                        {{--End Form--}}

                        <iframe id="hidden_iframe" name="hidden_iframe" src="about:blank"></iframe>

                        <div class="progress">
                            <div class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="25"
                                    aria-valuemin="0" aria-valuemax="100" style="width: 45%">
                                <span class="">45% Complete</span>
                            </div>
                        </div>

提交路线时为:
Route::get('dashboard/gebruikers/upload_status', 'UserController@uploadStatus');

在控制器UserController的uploadStatus方法中,我有以下代码。
public function uploadStatus(Request $request)
{
    session_start();

    echo '<pre>';
        print_r($_SESSION);
    echo '</pre>';
}

但它总是显示一个空数组。当我使用这段代码时
    $data = $request->session()->all();

    echo '<pre>';
    print_r($data);
    echo '</pre>';

它返回这个:

它返回这个

Array
(
    [_token] => jFkleI9kIZJiZP3pEARx0hDrHtsynPmuGkse97nT
    [_previous] => Array
        (
            [url] => http://localhost.dev:8000/dashboard/gebruikers/upload_status
        )

    [flash] => Array
        (
            [old] => Array
                (
                )

            [new] => Array
                (
                )

        )

    [login_82e5d2c56bdd0811318f0cf078b78bfc] => 1
)

但是没有关于进度更新的信息。

我如何在Laravel 5.1中使用这个?

2个回答

5

我在尝试解决一个类似问题时遇到了这个情况:在客户端更新长时间运行进程的进度。

问题归结为:当您向服务器发出请求时,会话值在响应返回客户端之前不会写入会话存储。基本上,该过程如下:

        CLIENT         |        SERVER
                       |             .
send request       ----|----> start processing
                       |             .
                       |             .
                       |             .
                       |     finish processing
                       |     write session values
receive response  <----|---- return response

您正在进行的类似于这样的操作:

您所做的是:

        CLIENT         |        SERVER
                       |             .
send request       ----|----> start processing
                       |             .
                       |      (update session)
                       |             .
                       |      (update session)
                       |             .
                       |      (update session)
                       |             .
                       |     finish processing
                       |     write session values
receive response  <----|---- return response

但是服务器上的那些(update session)调用被忽略了 - 实际上它们没有被写入到会话存储中。因此,当客户端调用您的路由以请求进度的会话值时,它什么也得不到。

解决方案很简单:将进度值写到其他地方。很久以前,我通过使用file_put_contents将值写入文件来解决这个问题。如果我今天要做同样的事情,我可能会考虑使用一个redis服务器以获得更好的效率。

然而,需要注意的一点是:如果您选择将该值写入其他位置,则需要某种方式将该值与会话关联起来。否则,其他用户将覆盖您的值。对于一个简单的项目,我可能会使用用户的ID值(假设他们只会同时处理一件事情)。


如果你在 Laravel 之外使用 illuminate/session 包,那么你需要调用 SessionManager 实例上的 save 方法来保存对 $_SESSION 变量的更新。 - Ozan Kurt

1

Laravel文档拥有所有你需要操作会话的方法。

$request->session()->put('key', 'value');

您可以像这样将任何内容放入会话中。
作为 Laravel 提供的帮助程序速记,它为您提供了 session() 助手函数。该函数接受一个“键值对”数组来设置值,或者只接受一个键来检索会话中的任何值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接