6

上传进度支持(Upload progress in sessions)

 3 years ago
source link: https://www.laruence.com/2011/10/10/2217.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

上传进度支持(Upload progress in sessions)

文件上传进度反馈, 这个需求在当前是越来越普遍, 比如大附件邮件. 在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. <form action="upload.php" method="POST" enctype="multipart/form-data">
  2.  <input type="hidden"
  3.      name="<?php echo ini_get("session.upload_progress.name"); ?>" value="laruence" />
  4.  <input type="file" name="file1" />
  5.  <input type="file" name="file2" />
  6.  <input type="submit" />
  7. </form>

如果我们上传一个足够大的文件(网速要是足够慢就更好:P), 我们就可以从_SESSION中, 得到类似下面的进度信息:

  1. $_SESSION["upload_progress_laruence"] = array(
  2.  "start_time" => 1234567890, // 请求时间
  3.  "content_length" => 57343257, // 上传文件总大小
  4.  "bytes_processed" => 453489, // 已经处理的大小
  5.  "done" => false, // 当所有上传处理完成后为TRUE
  6.  "files" => array(
  7.   0 => array(
  8.    "field_name" => "file1", // 表单中上传框的名字
  9.    // The following 3 elements equals those in $_FILES
  10.    "name" => "foo.avi",
  11.    "tmp_name" => "/tmp/phpxxxxxx",
  12.    "error" => 0,
  13.    "done" => true, // 当这个文件处理完成后会变成TRUE
  14.    "start_time" => 1234567890, // 这个文件开始处理时间
  15.    "bytes_processed" => 57343250, // 这个文件已经处理的大小
  16.   // An other file, not finished uploading, in the same request
  17.   1 => array(
  18.    "field_name" => "file2",
  19.    "name" => "bar.avi",
  20.    "tmp_name" => NULL,
  21.    "error" => 0,
  22.    "done" => false,
  23.    "start_time" => 1234567899,
  24.    "bytes_processed" => 54554,

这个是不是很方便呢?
但是还是要提醒一下, PHP 5.4还处于开发阶段, 在最终release之前, 任何新特性都可能被调整或者更改. 如果大家有任何建议, 也欢迎反馈, 帮助我们使得PHP变得更好.
谢谢
Johannes的blog也介绍过: http://schlueters.de/blog/archives/151-Upload-Progress-in-PHP-trunk.html
更多更新信息, 请关注: Changelog


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK