5

Apache Web サーバーから大きなファイル (> 2GB) を提供する必要があります。ファイルは保護されたダウンロードであるため、ユーザーを承認する何らかの方法が必要です。私が使用している CMS は、MySQL データベースに対してチェックされる Cookie を使用してユーザーを確認します。サーバーでは、max_execution_time を制御できず、memory_limit を制御できません。

私の手法は、小さなファイルに対して機能しています。ユーザーが PHP で (CMS によって) 承認された後、readfile() を使用してファイルを提供します。このファイルは、直接アクセスを防ぐためにドキュメント ルートの上に保存されます。ダウンロードをチャンクする手法や、fpassthru を使用して PHP のメモリ制限を回避する手法について読んだことがあります。しかし、max_execution_time の制限を回避する手法は見つかりませんでした。

PHP を完全にバイパスできるように、ファイルをドキュメント ルート内に格納することを考えました。しかし、私が理解できないのは、htaccessでアクセスを制限する方法です。ファイルを提供する前に、データベースに対してユーザーを確認する必要があります。

ありがとう。

4

3 に答える 3

3

私の意見では、最も優れた解決策は、mod_xsendfileApache にインストールし、PHP スクリプトでユーザーを認証し、成功するとX-Sendfile、保護されたファイルの場所を指すヘッダーを含む応答を送信することです。その時点から、Apache はファイルをクライアントに提供する作業を行います。PHPではありません。

于 2010-07-12T21:49:58.637 に答える
1

http://www.php.net/manual/en/function.set-time-limit.phpをご覧ください。set_time_limit()

およびmax_execution_time http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time

于 2010-07-06T15:18:18.267 に答える
1

シンボリックリンクの使用はどうですか?フォルダの例がある場合:

userfacingfiles/
  md5_of_order_id1 --> protected-file.exe
  md5_of_order_id2 --> protected-file.exe

protectedfiles/
  .htaccess (contains deny from all)
  protected-file.exe

基本的な例:

$salt = 'canttouchthis';

function create_symlink($order_id, $salt, $protected_file) 
{
  $info = pathinfo('protectedfiles/'.$protected_file);

  symlink('protectedfiles/'.$protected_file, 'userfacingfiles/'.md5($order_id.$salt).'.'.$info['extension']);
}


function get_file($order_id, $salt, $extension)
{

  header('Location: userfacingfiles/'.md5($order_id.$salt).'.'.$extension);
  exit();
}

利用方法:

ユーザーが支払う場合:

create_symlink(1, 'secureSALT', 'ebook.pdf');

ユーザーが電子書籍をダウンロードしたい場合

get_file(1, 'secureSALT');

これは最も移植性の高い方法ではないかもしれませんが、ユーザーをリダイレクトしているため、Web サーバーがダウンロードを処理しています。

于 2010-07-12T21:46:07.033 に答える