php+uploadprogress实现上传进度功能 向右看齐 2022-01-16 23:15 278阅读 0赞 [为什么80%的码农都做不了架构师?>>> ][80_] ![hot3.png][] 文件上传进度反馈, 这个需求在当前是越来越普遍, 比如大附件邮件. 在PHP5.4以前, 我们可以通过 [APC][]提供的功能来实现. 或者使用PECL扩展 [uploadprogress][]来实现. 虽然说, 它们能很好的解决现在的问题, 但是也有很明显的不足: * 1. 他们都需要额外安装(我们并没有打算把APC加入PHP5.4) * 2. 它们都使用本地机制来存储这些信息, APC使用共享内存, 而uploadprogress使用文件系统(不考虑NFS), 这在多台前端机的时候会造成麻烦. 从PHP的角度来说, 最好的储存这些信息的地方应该是SESSION, 首先它是PHP原生支持的机制. 其次, 它可以被配置到存放到任何地方(支持多机共享). 正因为此, Arnaud Le Blanc提出了针对Session报告上传进度的 [RFC][], 并且现在实现也已经包含在了PHP5.4的主干中. 这个新特性, 提供了一些新的INI配置, 他们和APC的相关配置很类似: * session.upload\_progress.enabled\[=1\] : 是否启用上传进度报告(默认开启) * session.upload\_progress.cleanup\[=1\] : 是否在上传完成后及时删除进度数据(默认开启, 推荐开启). * session.upload\_progress.prefix\[=upload\_progress\_\] : 进度数据将存储在\_SESSION\[session.upload\_progress.prefix . \_POST\[session.upload\_progress.name\]\] * session.upload\_progress.name\[=PHP\_SESSION\_UPLOAD\_PROGRESS\] : 如果\_POST\[session.upload\_progress.name\]没有被设置, 则不会报告进度. * session.upload\_progress.freq\[=1%\] : 更新进度的频率(已经处理的字节数), 也支持百分比表示’%’. * session.upload\_progress.min\_freq\[=1.0\] : 更新进度的时间间隔(秒级) 对于如下的上传表单: <form action="upload.php" method="POST" enctype="multipart/form-data"> <input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="laruence" /> <input type="file" name="file1" /> <input type="file" name="file2" /> <input type="submit" /> </form> 如果我们上传一个足够大的文件(网速要是足够慢就更好:P), 我们就可以从\_SESSION中, 得到类似下面的进度信息: $_SESSION["upload_progress_laruence"] = array( "start_time" => 1234567890, // 请求时间 "content_length" => 57343257, // 上传文件总大小 "bytes_processed" => 453489, // 已经处理的大小 "done" => false, // 当所有上传处理完成后为TRUE "files" => array( 0 => array( "field_name" => "file1", // 表单中上传框的名字 // The following 3 elements equals those in $_FILES "name" => "foo.avi", "tmp_name" => "/tmp/phpxxxxxx", "error" => 0, "done" => true, // 当这个文件处理完成后会变成TRUE "start_time" => 1234567890, // 这个文件开始处理时间 "bytes_processed" => 57343250, // 这个文件已经处理的大小 ), // An other file, not finished uploading, in the same request 1 => array( "field_name" => "file2", "name" => "bar.avi", "tmp_name" => NULL, "error" => 0, "done" => false, "start_time" => 1234567899, "bytes_processed" => 54554, ), ) ); 这个是不是很方便呢? 但是还是要提醒一下, PHP 5.4还处于开发阶段, 在最终release之前, 任何新特性都可能被调整或者更改. 如果大家有任何建议, 也欢迎反馈, 帮助我们使得PHP变得更好. 本文转自: [http://www.laruence.com/2011/10/10/2217.html][http_www.laruence.com_2011_10_10_2217.html] 本文地址:http://www.ttlsa.com/html/2716.html 转载于:https://my.oschina.net/766/blog/211030 [80_]: https://my.oschina.net/u/2663968/blog/3051541 [hot3.png]: /images/20220117/05269c036f1b4a6dbf39e000b225c071.png [APC]: http://www.php.net/manual/zh/apc.configuration.php#ini.apc.rfc1867 [uploadprogress]: http://pecl.php.net/package/uploadprogress [RFC]: http://wiki.php.net/rfc/session_upload_progress [http_www.laruence.com_2011_10_10_2217.html]: http://www.laruence.com/2011/10/10/2217.html
还没有评论,来说两句吧...