当前位置:首页 > PHP教程 > php应用 > 列表

PHP使用range协议实现输出文件断点续传代码实例

发布:smiling 来源: PHP粉丝网  添加日期:2021-03-13 19:54:02 浏览: 评论:0 

这篇文章主要介绍了PHP使用range协议实现输出文件断点续传代码实例,需要的朋友可以参考下

range协议用途:一般是用在断点续传的时候,但是实际的用户很大,例如你的web server需要输出一个大文件,那么用range可以分段输出,缓解压力。同时在提供音乐视频等服务时可以缓冲下载,如果用户中途关闭,可以节约网络带宽。

  1. <?php 
  2.  
  3. // 文件名 
  4. $filename = $_GET ['filename']; 
  5.  
  6. // 文件路径 
  7. $location = 'media/' . $filename; 
  8.  
  9. // 后缀 
  10. $extension = substr ( strrchr ( $filename, '.' ), 1 ); 
  11.  
  12. if ($extension == "mp3") { 
  13.     $mimeType = "audio/mpeg"; 
  14. } else if ($extension == "ogg") { 
  15.     $mimeType = "audio/ogg"; 
  16. } 
  17.  
  18. if (! file_exists ( $location )) { 
  19.     header ( "HTTP/1.1 404 Not Found" ); 
  20.     return; 
  21. } 
  22.  
  23. $size = filesize ( $location ); 
  24. $time = date ( 'r', filemtime ( $location ) ); 
  25.  
  26. $fm = @fopen ( $location, 'rb' ); 
  27. if (! $fm) { 
  28.     header ( "HTTP/1.1 505 Internal server error" ); 
  29.     return; 
  30. } 
  31.  
  32. $begin = 0; 
  33. $end = $size - 1; 
  34.  
  35. if (isset ( $_SERVER ['HTTP_RANGE'] )) { 
  36.     if (preg_match ( '/bytes=\h*(\d+)-(\d*)[\D.*]?/i', $_SERVER ['HTTP_RANGE'], $matches )) { 
  37.         // 读取文件,起始节点 
  38.         $begin = intval ( $matches [1] ); 
  39.  
  40.         // 读取文件,结束节点 
  41.         if (! emptyempty ( $matches [2] )) { 
  42.             $end = intval ( $matches [2] ); 
  43.         } 
  44.     } 
  45. } 
  46.  
  47. if (isset ( $_SERVER ['HTTP_RANGE'] )) { 
  48.     header ( 'HTTP/1.1 206 Partial Content' ); 
  49. } else { 
  50.     header ( 'HTTP/1.1 200 OK' ); 
  51. } 
  52.  
  53. header ( "Content-Type: $mimeType" ); 
  54. header ( 'Cache-Control: public, must-revalidate, max-age=0' ); 
  55. header ( 'Pragma: no-cache' ); 
  56. header ( 'Accept-Ranges: bytes' ); 
  57. header ( 'Content-Length:' . (($end - $begin) + 1) ); 
  58.  
  59. if (isset ( $_SERVER ['HTTP_RANGE'] )) { 
  60.     header ( "Content-Range: bytes $begin-$end/$size" ); 
  61. } 
  62.  
  63. header ( "Content-Disposition: inline; filename=$filename" ); 
  64. header ( "Content-Transfer-Encoding: binary" ); 
  65. header ( "Last-Modified: $time" ); 
  66.  
  67. $cur = $begin; 
  68. //www.phpfensi.com 
  69. // 定位指针 
  70. fseek ( $fm, $begin, 0 ); 
  71.  
  72. while ( ! feof ( $fm ) && $cur <= $end && (connection_status () == 0) ) { 
  73.     print fread ( $fm, min ( 1024 * 16, ($end - $cur) + 1 ) ); 
  74.     $cur += 1024 * 16; 
  75. } 
range协议官方文档:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

Tags: range协议 PHP文件断点

分享到: