php 超大文件下载程序[http 缓存协商,Etag标记,断点续传]
002 $file_path = './download/download_cn.rar';
003
004 //使用方法
005 downFile($file_path);
006
007 // 服务器文件路径,下载文件名字(默认为服务器文件名),是否许可用户下载方式(默认可选),速度限制(默认自动),文件类型(默认所有)
008 function downFile($fileName, $fancyName = '', $forceDownload = true, $speedLimit = 0, $contentType = '') {
009 if (!is_readable($fileName))
010 {
011 header("HTTP/1.1 404 Not Found");
012 return false;
013 }
014
015 $fileStat = stat($fileName);
016 $lastModified = $fileStat['mtime'];
017
018 $md5 = md5($fileStat['mtime'] .'='. $fileStat['ino'] .'='. $fileStat['size']);
019 $etag = '"' . $md5 . '-' . crc32($md5) . '"';
020
021 header('Last-Modified: ' . gmdate("D, d M Y H:i:s", $lastModified) . ' GMT');
022 header("ETag: $etag");
023
024 if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lastModified)
025 {
026 header("HTTP/1.1 304 Not Modified");
027 return true;
028 }
029
030 if (isset($_SERVER['HTTP_IF_UNMODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_UNMODIFIED_SINCE'])
031 {
032 header("HTTP/1.1 304 Not Modified");
033 return true;
034 }
035
036 if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $etag)
037 {
038 header("HTTP/1.1 304 Not Modified");
039 return true;
040 }
041
042 if ($fancyName == '')
043 {
044 $fancyName = basename($fileName);
045 }
046
047 if ($contentType == '')
048 {
049 $contentType = 'application/octet-stream';
050 }
051
052 $fileSize = $fileStat['size'];
053
054 $contentLength = $fileSize;
055 $isPartial = false;
056
057 if (isset($_SERVER['HTTP_RANGE']))
058 {
059 if (preg_match('/^bytes=(d*)-(d*)$/', $_SERVER['HTTP_RANGE'], $matches))
060 {
061 $startPos = $matches[1];
062 $endPos = $matches[2];
063
064 if ($startPos == '' && $endPos == '')
065 {
066 return false;
067 }
068
069 if ($startPos == '')
070 {
071 $startPos = $fileSize - $endPos;
072 $endPos = $fileSize - 1;
073 }
074 else if ($endPos == '')
075 {
076 $endPos = $fileSize - 1;
077 }
078
079 $startPos = $startPos
080 $endPos = $endPos > $fileSize - 1 ? $fileSize - 1 : $endPos;
081
082 $length = $endPos - $startPos + 1;
083
084 if ($length
085 {
086 return false;
087 }
088
089 $contentLength = $length;
090 $isPartial = true;
091 }
092 }
093
094 // send headers
095 if ($isPartial)
096 {
097 header('HTTP/1.1 206 Partial Content');
098 header("Content-Range: bytes $startPos-$endPos/$fileSize");
099
100 }
101 else
102 {
103 header("HTTP/1.1 200 OK");
104 $startPos = 0;
105 $endPos = $contentLength - 1;
106 }
107
108 header('Pragma: cache');
109 header('Cache-Control: public, must-revalidate, max-age=0');
110 header('Accept-Ranges: bytes');
111 header('Content-type: ' . $contentType);
112 header('Content-Length: ' . $contentLength);
113
114 if ($forceDownload)
115 {
116 header('Content-Disposition: attachment; filename="' . rawurlencode($fancyName). '"');
117 }
118
119 header("Content-Transfer-Encoding: binary");
120
121 $bufferSize = 2048;
122
123 if ($speedLimit != 0)
124 {
125 $packetTime = floor($bufferSize * 1000000 / $speedLimit);
126 }
127
128 $bytesSent = 0;
129 $fp = fopen($fileName, "rb");
130 fseek($fp, $startPos);
131 while ($bytesSent
132 {
133 if ($speedLimit != 0)
134 {
135 list($usec, $sec) = explode(" ", microtime());
136 $outputTimeStart = ((float)$usec + (float)$sec);
137 }
138
139 $readBufferSize = $contentLength - $bytesSent
140 $buffer = fread($fp, $readBufferSize);
141
142 echo $buffer;
143
144 ob_flush();
145 flush();
146
147 $bytesSent += $readBufferSize;
148
149 if ($speedLimit != 0)
150 {
151 list($usec, $sec) = explode(" ", microtime());
152 $outputTimeEnd = ((float)$usec + (float)$sec);
153
154 $useTime = ((float) $outputTimeEnd - (float) $outputTimeStart) * 1000000;
155 $sleepTime = round($packetTime - $useTime);
156 if ($sleepTime > 0)
157 {
158 usleep($sleepTime);
159 }
160 }
161 }
162 return true;
163 }
164 ?>

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP在數據庫操作和服務器端邏輯處理中使用MySQLi和PDO擴展進行數據庫交互,並通過會話管理等功能處理服務器端邏輯。 1)使用MySQLi或PDO連接數據庫,執行SQL查詢。 2)通過會話管理等功能處理HTTP請求和用戶狀態。 3)使用事務確保數據庫操作的原子性。 4)防止SQL注入,使用異常處理和關閉連接來調試。 5)通過索引和緩存優化性能,編寫可讀性高的代碼並進行錯誤處理。
