文档章节

php+uploadprogress实现上传进度功能

行走的螃蟹
 行走的螃蟹
发布于 2016/07/18 18:47
字数 733
阅读 75
收藏 2

「深度学习福利」大神带你进阶工程师,立即查看>>>

文件上传进度反馈, 这个需求在当前是越来越普遍, 比如大附件邮件. 在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] : 更新进度的时间间隔(秒级)

对于如下的上传表单:

 

1

2

3

4

5

6

7

     <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中, 得到类似下面的进度信息:

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

  $_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变得更好.

上一篇: php编译参数
下一篇: Unbuntu Apt-fast
行走的螃蟹

行走的螃蟹

粉丝 32
博文 48
码字总数 23634
作品 0
杭州
程序员
私信 提问

暂无文章

MySQL索引相关

一、索引分类 1、单列索引 1.1、主键索引(不能包含空值) 1.2、唯一索引(可以包含kong'zhi) 1.3、普通索引 2、多列索引 2.1、组合索引 3、全文索引 3.1、全文索引只针对大文本字段有效,比如:...

城里的月光
23分钟前
9
0
二级分销的理解

人人商城分销定义 例如: 分销商:A、B、C、D、E 群体1:A是B的上级分销商,B是C的上级分销商,C是D的上级分销商,则他们分销层级是:A是一级分销商,B是二级分销商,C是三级分销商 群体2:B...

红翼网
26分钟前
6
0
HBase/TiDB都在用的数据结构:LSM Tree,不得了解一下?

LSM Tree(Log-structured merge-tree)广泛应用在HBase,TiDB等诸多数据库和存储引擎上,我们先来看一下它的一些应用: 这么牛X的名单,你不想了解下LSM Tree吗?装X之前,我们先来了解一些...

Monica2333
27分钟前
16
0
Linux下如何高效切换目录?

Linux 下对于目录的切换,大家肯定会想到一个命令:cd 命令。这个是 Linux 下再基本不过的命令,如果这个命令都不知道的话,赶紧剖腹自尽去吧。 cd 命令确实很方便,但如果需要频繁在下面的目...

良许Linux
30分钟前
27
0
限流算法

1 计数算法 2 滑动窗口 (可以解决计数算法 临界线 QPS超过限流问题) 3 漏桶算法 4 令牌桶算法

yzzzzzzzz
34分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部