欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在PHP中使用X-SendFile頭讓文件下載更快

 更新時間:2014年06月01日 22:53:17   作者:  
這篇文章主要介紹了在PHP中讓文件下載更快的一個方法,那就是使用X-SendFile頭實(shí)現(xiàn),主流量的服務(wù)器都支持這個頭文件,的朋友可以參考下

一般來說, 我們可以通過直接讓URL指向一個位于Document Root下面的文件, 來引導(dǎo)用戶下載文件.

但是, 這樣做, 就沒辦法做一些統(tǒng)計, 權(quán)限檢查, 等等的工作. 于是, 很多時候, 我們采用讓PHP來做轉(zhuǎn)發(fā), 為用戶提供文件下載.

復(fù)制代碼 代碼如下:

<?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);

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

于是, 我們做一下修改:

復(fù)制代碼 代碼如下:

<?php
    $file = "/tmp/中文名.tar.gz";

    $filename = basename($file);

    header("Content-type: application/octet-stream");

    //處理中文文件名
    $ua = $_SERVER["HTTP_USER_AGENT"];
    $encoded_filename = rawurlencode($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-Length: ". filesize($file));
    readfile($file);

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

輸出的時候, 如果是Apache + PHP mod, 那么還需要發(fā)送到Apache的輸出緩沖區(qū). 最后才發(fā)送給用戶. 而對于Nginx + fpm如果他們分開部署的話, 那還會帶來額外的網(wǎng)絡(luò)IO.

那么, 能不能不經(jīng)過PHP這層, 直接讓W(xué)ebserver直接把文件發(fā)送給用戶呢?

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

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

復(fù)制代碼 代碼如下:

<?php
    $file = "/tmp/中文名.tar.gz";

    $filename = basename($file);

    header("Content-type: application/octet-stream");

    //處理中文文件名
    $ua = $_SERVER["HTTP_USER_AGENT"];
    $encoded_filename = rawurlencode($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 . '"');
    }

    //讓Xsendfile發(fā)送文件
    header("X-Sendfile: $file");

X-Sendfile頭將被Apache處理, 并且把響應(yīng)的文件直接發(fā)送給Client.

Lighttpd和Nginx也有類似的模塊, 大家有興趣的可以去找找看

  • php 數(shù)組處理函數(shù)extract詳解及實(shí)例代碼

    php 數(shù)組處理函數(shù)extract詳解及實(shí)例代碼

    php extract 函數(shù)使用數(shù)組鍵名作為變量名,使用數(shù)組鍵值作為變量值, 本函數(shù)可以處理表單提交并插入數(shù)據(jù)庫。文章向大家講解extract函數(shù)的基本使用方法及實(shí)例,需要的朋友可以參考下
    2016-11-11
  • 基于Discuz security.inc.php代碼的深入分析

    基于Discuz security.inc.php代碼的深入分析

    本篇文章是對Discuz security.inc.php的代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • php對微信支付回調(diào)處理的方法

    php對微信支付回調(diào)處理的方法

    這篇文章主要介紹了php對微信支付回調(diào)處理的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • 用PHP寫的MySQL數(shù)據(jù)庫用戶認(rèn)證系統(tǒng)代碼

    用PHP寫的MySQL數(shù)據(jù)庫用戶認(rèn)證系統(tǒng)代碼

    用PHP寫的MySQL數(shù)據(jù)庫用戶認(rèn)證系統(tǒng)代碼...
    2007-03-03
  • Yii2框架可逆加密簡單實(shí)現(xiàn)方法

    Yii2框架可逆加密簡單實(shí)現(xiàn)方法

    這篇文章主要介紹了Yii2框架可逆加密簡單實(shí)現(xiàn)方法,涉及Yii框架encryptByPassword()與decryptByPassword()函數(shù)簡單使用方法,需要的朋友可以參考下
    2017-08-08
  • php+ajax導(dǎo)入大數(shù)據(jù)時產(chǎn)生的問題處理

    php+ajax導(dǎo)入大數(shù)據(jù)時產(chǎn)生的問題處理

    介紹:就是想實(shí)現(xiàn)簡單的ajax上傳數(shù)據(jù),但是當(dāng)數(shù)據(jù)量較大的時候,問題就一個一個接著來了,其實(shí)數(shù)據(jù)也不是很大,就是csv格式數(shù)據(jù) 不到5w條數(shù)據(jù)。大小5M,一開始認(rèn)為這個很簡單,就是先上傳一下文件,然后讀取一下,存到數(shù)據(jù)庫就好了,結(jié)果,可能我比較菜,弄了半天做出這個功能。環(huán)境是linux.
    2014-06-06
  • Yii2 中實(shí)現(xiàn)單點(diǎn)登錄的方法

    Yii2 中實(shí)現(xiàn)單點(diǎn)登錄的方法

    這篇文章主要介紹了Yii2 中實(shí)現(xiàn)單點(diǎn)登錄的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • 淺析Yii2 GridView實(shí)現(xiàn)下拉搜索教程

    淺析Yii2 GridView實(shí)現(xiàn)下拉搜索教程

    這篇文章主要介紹了淺析Yii2 GridView實(shí)現(xiàn)下拉搜索教程的相關(guān)資料,需要的朋友可以參考下
    2016-04-04
  • PHP session文件獨(dú)占鎖引起阻塞問題解決方法

    PHP session文件獨(dú)占鎖引起阻塞問題解決方法

    這篇文章主要介紹了PHP session文件獨(dú)占鎖引起阻塞,本文講解PHP使用默認(rèn)文件會話處理器時容易導(dǎo)致的阻塞問題解決方法,需要的朋友可以參考下
    2015-05-05
  • 最新評論