PHP使用range協(xié)議實(shí)現(xiàn)輸出文件斷點(diǎn)續(xù)傳代碼實(shí)例
range協(xié)議用途:一般是用在斷點(diǎn)續(xù)傳的時(shí)候,但是實(shí)際的用戶很大,例如你的web server需要輸出一個(gè)大文件,那么用range可以分段輸出,緩解壓力。同時(shí)在提供音樂視頻等服務(wù)時(shí)可以緩沖下載,如果用戶中途關(guān)閉,可以節(jié)約網(wǎng)絡(luò)帶寬。
<?php
// 文件名
$filename = $_GET ['filename'];
// 文件路徑
$location = 'media/' . $filename;
// 后綴
$extension = substr ( strrchr ( $filename, '.' ), 1 );
if ($extension == "mp3") {
$mimeType = "audio/mpeg";
} else if ($extension == "ogg") {
$mimeType = "audio/ogg";
}
if (! file_exists ( $location )) {
header ( "HTTP/1.1 404 Not Found" );
return;
}
$size = filesize ( $location );
$time = date ( 'r', filemtime ( $location ) );
$fm = @fopen ( $location, 'rb' );
if (! $fm) {
header ( "HTTP/1.1 505 Internal server error" );
return;
}
$begin = 0;
$end = $size - 1;
if (isset ( $_SERVER ['HTTP_RANGE'] )) {
if (preg_match ( '/bytes=\h*(\d+)-(\d*)[\D.*]?/i', $_SERVER ['HTTP_RANGE'], $matches )) {
// 讀取文件,起始節(jié)點(diǎn)
$begin = intval ( $matches [1] );
// 讀取文件,結(jié)束節(jié)點(diǎn)
if (! empty ( $matches [2] )) {
$end = intval ( $matches [2] );
}
}
}
if (isset ( $_SERVER ['HTTP_RANGE'] )) {
header ( 'HTTP/1.1 206 Partial Content' );
} else {
header ( 'HTTP/1.1 200 OK' );
}
header ( "Content-Type: $mimeType" );
header ( 'Cache-Control: public, must-revalidate, max-age=0' );
header ( 'Pragma: no-cache' );
header ( 'Accept-Ranges: bytes' );
header ( 'Content-Length:' . (($end - $begin) + 1) );
if (isset ( $_SERVER ['HTTP_RANGE'] )) {
header ( "Content-Range: bytes $begin-$end/$size" );
}
header ( "Content-Disposition: inline; filename=$filename" );
header ( "Content-Transfer-Encoding: binary" );
header ( "Last-Modified: $time" );
$cur = $begin;
// 定位指針
fseek ( $fm, $begin, 0 );
while ( ! feof ( $fm ) && $cur <= $end && (connection_status () == 0) ) {
print fread ( $fm, min ( 1024 * 16, ($end - $cur) + 1 ) );
$cur += 1024 * 16;
}
range協(xié)議官方文檔:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
相關(guān)文章
ThinkPHP框架實(shí)現(xiàn)用戶信息查詢更新及刪除功能示例
這篇文章主要介紹了ThinkPHP框架實(shí)現(xiàn)用戶信息查詢更新及刪除功能,結(jié)合實(shí)例形式分析了thinkPHP框架數(shù)據(jù)庫配置、控制與模板調(diào)用實(shí)現(xiàn)信息查詢、更新、刪除等功能相關(guān)操作技巧,需要的朋友可以參考下2018-03-03
PHP基于SMTP協(xié)議實(shí)現(xiàn)郵件發(fā)送實(shí)例代碼
本篇文章主要介紹了PHP基于SMTP協(xié)議實(shí)現(xiàn)郵件發(fā)送實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
動(dòng)態(tài)表單驗(yàn)證的操作方法和TP框架里面的ajax表單驗(yàn)證
這篇文章主要介紹了動(dòng)態(tài)表單驗(yàn)證的操作方法和TP框架里面的ajax表單驗(yàn)證問題,需要的朋友可以參考下2017-07-07
PHP加Nginx實(shí)現(xiàn)動(dòng)態(tài)裁剪圖片方案
這篇文章主要介紹了PHP加Nginx實(shí)現(xiàn)動(dòng)態(tài)裁剪圖片的方案,使用Imagick組件實(shí)現(xiàn),需要的朋友可以參考下2014-03-03
php實(shí)現(xiàn)斷點(diǎn)續(xù)傳大文件示例代碼
這篇文章主要介紹了如何用php實(shí)現(xiàn)斷點(diǎn)續(xù)傳大文件,文中代碼非常細(xì)致,幫助大家學(xué)習(xí)和參考,感興趣的朋友可以了解下2020-06-06
Thinkphp中volist標(biāo)簽mod控制一定記錄的換行BUG解決方法
這篇文章主要介紹了Thinkphp中volist標(biāo)簽mod控制一定記錄的換行BUG解決方法,涉及針對(duì)標(biāo)簽執(zhí)行語句順序的修改,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-11-11

