我想用我的PHP脚本的状态来构建进度栏。我已经读过,可以使用session.upload_progress来完成。

我正在使用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');

并在 Controller 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中使用它

最佳答案

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

问题归结为:当您向服务器发出请求时, session 值不会写入 session 存储中,直到响应返回给客户端为止。基本上,该过程如下所示:

        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)调用将被忽略-它们实际上并没有被写入 session 存储中。因此,当客户调用您的路由以请求进度的 session 值时,它什么也没得到。

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

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

10-07 19:10
查看更多