天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

讓PHP更快的提供文件下載的代碼

但是, 這樣做, 就沒辦法做一些統計, 權限檢查, 等等的工作. 于是, 很多時候, 我們采用讓php來做轉發, 為用戶提供文件下載.
復制代碼 代碼如下:
<?php
$file = "/tmp/dummy.tar.gz";
header("Content-type: application/octet-stream");
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
header("Content-Length: ". filesize($file));
readfile($file);

但是這個有一個問題, 就是如果文件是中文名的話, 有的用戶可能下載后的文件名是亂碼.

于是, 我們做一下修改(參考: :
復制代碼 代碼如下:
<?php
$file = "/tmp/中文名.tar.gz";
$filename = basename($file);
header("Content-type: application/octet-stream");
//處理中文文件名
$ua = $_SERVER["HTTP_USER_AGENT"];
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace("+", "%20", $encoded_filename);
if (preg_match("/MSIE/", $ua)) {
header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
header("Content-Disposition: attachment; filename*=/"utf8''" . $filename . '"');
} else {
header('Content-Disposition: attachment; filename="' . $filename . '"');
}
header('Content-Disposition: attachment; filename="' . $filename . '"');
header("Content-Length: ". filesize($file));
readfile($file);

恩, 現在看起來好多了, 不過還有一個問題, 那就是readfile, 雖然php的readfile嘗試實現的盡量高效, 不占用php本身的內存, 但是實際上它還是需要采用MMAP(如果支持), 或者是一個固定的buffer去循環讀取文件, 直接輸出.

輸出的時候, 如果是Apache + php mod, 那么還需要發送到Apache的輸出緩沖區. 最后才發送給用戶. 而對于Nginx + fpm如果他們分開部署的話, 那還會帶來額外的網絡IO.

那么, 能不能不經過php這層, 直接讓Webserver直接把文件發送給用戶呢?

今天, 我看到了一個有意思的文章: How I php: X-SendFile.

我們可以使用Apache的module mod_xsendfile, 讓Apache直接發送這個文件給用戶:

復制代碼 代碼如下:
<?php
$file = "/tmp/中文名.tar.gz";
$filename = basename($file);
header("Content-type: application/octet-stream");
//處理中文文件名
$ua = $_SERVER["HTTP_USER_AGENT"];
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace("+", "%20", $encoded_filename);
if (preg_match("/MSIE/", $ua)) {
header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
header("Content-Disposition: attachment; filename*=/"utf8''" . $filename . '"');
} else {
header('Content-Disposition: attachment; filename="' . $filename . '"');
}
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
//讓Xsendfile發送文件
header("X-Sendfile: $file");

X-Sendfile頭將被Apache處理, 并且把響應的文件直接發送給Client.
Lighttpd和Nginx也有類似的模塊, 大家有興趣的可以去找找看

php技術讓PHP更快的提供文件下載的代碼,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 无人影院在线播放 | 中文字幕亚洲欧美日韩2o19 | 快播av网址 | 嫩交18xxxx| 达达兔午夜一级毛片 | 成人在线免费观看 | 青娱乐在线一区 | 野花4在线观看 | 狠狠色狠狠色综合日日32 | jijzzizz中国版 | 老版香蕉版下载 | 99亚洲精品 | 精品国产乱码久久久久久夜深人妻 | 国产偷国产偷亚洲高清app | 国产小视频国产精品 | 亚洲精品蜜夜内射 | 欧美黑人巨大xxxxx | 琪琪色在线播放 | 一攻多受h嗯啊巨肉bl巨污 | 国产露脸150部国语对白 | 国产精品久久久久久人妻精品流 | 伊人热| 动漫美女被到爽了流漫画 | 成人在线免费视频 | 亚洲乱码在线卡一卡二卡新区 | 亚洲午夜久久久无码精品网红A片 | 午夜一区欧美二区高清三区 | 欧美亚洲另类丝袜自拍动漫 | 亚洲午夜久久影院 | 男人扒开添女人屁股 | 久久国产精品免费A片蜜芽 久久国产精品萌白酱免费 久久国产精品麻豆AV影视 | 无套日出白浆在线播放 | 亚洲精品中文字幕制 | 亚洲国产日韩欧美在线a乱码 | 亚洲欧美中文字幕5发布 | 囯产精品久久久久久久久免费蜜桃 | 丰满大屁俄罗斯肥女 | 亚洲黄色在线观看 | 日日摸夜夜添夜夜爽出水 | 亚洲综合小说久久另类区 | 在线亚洲精品福利网址导航 |