PHP中的range header通常用于請求指定范圍內的文件內容,這一功能在Internet上的文件下載和視頻播放等方面得到了廣泛的應用。
以下載文件為例,假設我們有一個10MB的文件需要下載,如果用戶每次下載都要下載整個文件,那么不僅會浪費大量的帶寬和時間,而且還會給服務器帶來較大的負擔。此時,我們可以使用range header來實現文件的斷點續傳。
if(isset($_SERVER['HTTP_RANGE'])){ $range = $_SERVER['HTTP_RANGE']; $file = 'example.mp4'; $size = filesize($file); $start = 0; $end = $size - 1; header('Content-type: video/mp4'); header('Accept-Ranges: bytes'); list(, $range) = explode('=', $range); if(strpos($range, ',')!==false){ header('HTTP/1.1 416 Requested Range Not Satisfiable'); header("Content-Range: bytes $start-$end/$size"); exit; } if($range == '-'){ $cstart = $size - substr($range, 1); }else{ $range = explode('-', $range); $cstart = $range[0]; $cend = (isset($range[1]) && is_numeric($range[1])) ? $range[1] : $size - 1; } $cend = ($cend > $end) ? $end : $cend; if($cstart > $cend || $cstart > $size - 1 || $cend >= $size){ header('HTTP/1.1 416 Requested Range Not Satisfiable'); header("Content-Range: bytes $start-$end/$size"); exit; } $start = $cstart; $end = $cend; $length = $end - $start + 1; header('HTTP/1.1 206 Partial Content'); header("Content-Range: bytes $start-$end/$size"); header("Content-Length: ".$length); $fp = fopen($file, 'rb'); fseek($fp, $start); while(!feof($fp) && ($p = ftell($fp)) <= $end){ if($p + 1024 > $end){ $data = fread($fp, $end - $p + 1); }else{ $data = fread($fp, 1024); } echo $data; } fclose($fp); }else{ header('Content-type: video/mp4'); header('Accept-Ranges: bytes'); header('Content-Length: '.filesize('example.mp4')); readfile('example.mp4'); }
上述代碼中,首先判斷是否存在range header信息,如果存在,則進行文件的分塊讀取,然后輸出到客戶端。如果不存在,則直接輸出文件內容到客戶端。其中,HTTP/1.1 206 Partial Content表示部分內容,HTTP/1.1 416 Requested Range Not Satisfiable表示所請求的range header不合法。
總的來說,PHP中的range header功能十分實用,可以有效降低服務器和客戶端的帶寬和時間消耗,提高用戶體驗。在實際開發中,我們需要根據具體需求來靈活運用range header功能,以達到更好的效果。
上一篇php recever
下一篇css實現雪花飄落效果