我想用我的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值(假设他们一次只处理一件事情)。