国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > Nginx > 正文

在Nginx中使用X-Sendfile頭提升PHP文件下載的性能(針對大文件下載

2024-08-30 12:27:00
字體:
來源:轉載
供稿:網友

很多時候用戶需要從網站下載文件,如果文件是可以通過一個固定鏈接公開獲取的,那么我們只需將文件存放到 webroot下的目錄里就好。但大多數情況下,我們需要做權限控制,例如下載 PDF 賬單,又例如下載網盤里的檔案。這時,我們通常借助于腳本代碼來實現,而這無疑會增加服務器的負擔。

例如下面的代碼:

<?php  // 用戶身份認證,若驗證失敗跳轉  authenticate();  // 獲取需要下載的文件,若文件不存在跳轉  $file = determine_file();  // 讀取文件內容  $content=file_get_contents($file);  // 發送合適的 HTTP 頭  header("Content-type: application/octet-stream");  header('Content-Disposition: attachment; filename="' . basename($file) . '"');  header("Content-Length: ". filesize($file));  echo $content; // 或者 readfile($file);?>

一、這樣做有什么問題?

這樣做意味著我們的程序需要將文件內容從磁盤經過一個固定的 buffer 去循環讀取到內存,再發送給前端 web 服務器,最后才到達用戶。當需要下載的文件很大的時候,這種方式將消耗大量內存,甚至引發 php 進程超時或崩潰。Cache 也很頭疼,更不用說中斷重連的情況了。
一個理想的解決方式應該是,由 php 程序進行權限檢查等邏輯判斷,一切通過后,讓前臺的 web 服務器直接將文件發送給用戶——像 Nginx 這樣的前臺更善于處理靜態文件。這樣一來 php 腳本就不會被 I/O 阻塞了。

二、什么是 X-Sendfile?

X-Sendfile 是一種將文件下載請求由后端應用轉交給前端 web 服務器處理的機制,它可以消除后端程序既要讀文件又要處理發送的壓力,從而顯著提高服務器效率,特別是處理大文件下載的情形下。

X-Sendfile 通過一個特定的 HTTP header 來實現:在 X-Sendfile 頭中指定一個文件的地址來通告前端 web 服務器。當 web 服務器檢測到后端發送的這個 header 后,它將忽略后端的其他輸出,而使用自身的組件(包括 緩存頭 和 斷點重連 等優化)機制將文件發送給用戶。

不過,在使用 X-Sendfile 之前,我們必須明白這并不是一個標準特性,在默認情況下它是被大多數 web 服務器禁用的。而不同的 web 服務器的實現也不一樣,包括規定了不同的 X-Sendfile 頭格式。如果配置失當,用戶可能下載到 0 字節的文件。

使用 X-Sendfile 將允許下載非 web 目錄中的文件(例如/root/),即使文件在 .htaccess 保護下禁止訪問,也會被下載。

不同的 web 服務器實現了不同的 HTTP 頭

SENDFILE 頭 使用的 WEB 器
X-Sendfile Apache, Lighttpd v1.5, Cherokee
X-LIGHTTPD-send-file Lighttpd v1.4
X-Accel-Redirect Nginx, Cherokee
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 托克逊县| 华宁县| 平塘县| 桃江县| 吴旗县| 德保县| 河南省| 安吉县| 玉林市| 淳化县| 定南县| 云龙县| 泰兴市| 黄冈市| 织金县| 荔浦县| 龙海市| 青海省| 平潭县| 福泉市| 永兴县| 龙山县| 吉安市| 怀柔区| 潮州市| 崇阳县| 鹿泉市| 花垣县| 朝阳市| 宜昌市| 措美县| 探索| 温州市| 西乌珠穆沁旗| 讷河市| 阜平县| 贡嘎县| 柳林县| 蒲江县| 紫云| 虹口区|