2016-04-30 18 views
2

私のウェブサーバーから大量のファイル(1Gb +)をPHPで認証して、一部の顧客のみがファイルをダウンロードできるようにする必要がありました。Linuxでmod_xsendfileを使用して大容量ファイルをダウンロードする

私は直接リンクを使用したくないし、PHPスクリプトを使用してファイルを提供することは、メモリとタイムアウトの制限のためにオプションではなかった。

私のウェブサーバはPleskで管理し、選択したソリューションは、CentOSにサーバー上mod_xsendfileをインストールし、それを設定し、ユーザ認証後にPHPのヘッダにファイルを送信することでしたApache/CentOS 6.

答えて

4

上で実行されています。

Centosにmod_xsendfileをインストールする。あなたはその後、単純な、xsendfile取得するためにEPELリポジトリを有効にする必要があります。その後

yum update 
yum install mod_xsendfile 

モジュールが正しく使用してインストールされているかどうかをチェックすることができます:

apachectl -M | grep xsendfile 

を設定/ Pleskの部分。 Pleskはすべてのhttpd.confファイルを自動的に生成するため、ファイルを手作業で変更することはPlesk UIを介して行われた変更によって上書きされる可能性があるため危険です。 >サーバ設定 - デフォルトではhttp.confファイルはvhost.confとvhost_ssl.conf、インクルードが

/var/www/vhosts/system/[yourvhostname]/conf 

に格納されている仮想ホストのためにあなたがssh経由でそれらを編集するか、または(バーチャルホストをPleskのUIインターフェイスを使用してが含まれます - >追加のApacheディレクティブ)。非Pleskのユーザーは自分のhttpd.confの正しいバーチャルホストセクションの下に次のディレクティブを追加するために

私はいくつかの問題がいくつかのテストは、私が正しいディレクティブを見つけた後、サーバーは、0バイトのファイルを送信していた原因だった

まず時間がされています

<Directory "/"> 

    EnableSendfile on 

    XSendFile on 

    # Absolute path, no trailing slash! 
    XSendFilePath "/var/www/vhosts/[yourvhostname]/storage" 

</Directory> 

「/」とは異なるDirectoryディレクティブを使用すると、空のファイルが生成され、ログには何のエラーも発生しません。ヘッダーに相対パスを渡すことによって何が起こるかをテストしませんでした。これは、誰かがテストの時間を避けることができます

return response(null) 
     ->header('Content-Type' , 'application/octet-stream') 
     ->header('Content-Disposition', 'attachment; '.$filename) 
     ->header('X-Sendfile', $fullfilepath); 

希望:私はPHPのフレームワークとしてLaravelを使用してい

原因は、ファイルがでユーザーに送信することができます。

2

上記のDarioのコメントは本当に役に立ちます。私はちょうど私がファイルが正しく命名されていることを確認するためにはLaravelのreturnステートメントのために使用したものを追加したい:プレーンなPHPのヘッダで

return response(null) 
    ->header('Content-Type' , 'application/octet-stream') 
    ->header('Content-Disposition', 'attachment; filename="' . $filename . "') 
    ->header('X-Sendfile', $fullfilepath); 
+0

は、単純に文字列なので、 'ヘッダ(「X-SENDFILE:」です。$ファイルパス); 'は、使いたいものになります。 – dothebart

関連する問題