Обслуживание больших защищенных файлов в PHP/Apache

Я должен подать большие файлы (> 2 ГБ) от веб-сервера Apache. Файлы защищены загрузки, таким образом, мне нужен некоторый способ для авторизации пользователя. CMS я использую cookie использования, проверенные по базе данных MySQL для проверки пользователя. На сервере я не имею никакого контроля над max_execution_time и ограниченного управления memory_limit.

Моя техника работала на маленькие файлы. После того, как пользователь был авторизован в PHP (CMS), я использую readfile () для обслуживания файла, который хранится выше корня документа для предотвращения прямого доступа. Я читал о методах, чтобы разделить загрузку на блоки или использовать fpassthru для обхождения предела памяти PHP. Но я не нашел, что техника обходит предел max_execution_time.

Я думал о том, чтобы хранить файл в корне документа, таким образом, мы могли обойти PHP полностью. Но то, что я не могу выяснить, - то, как ограничить доступ с htaccess. Я должен проверить пользователя против базы данных, прежде чем я смогу служить им файл.

Спасибо.

5
задан Rob 6 July 2010 в 15:07
поделиться

3 ответа

Самое хорошее решение, на мой взгляд: установите mod_xsendfile в ваш Apache, пусть PHP скрипт авторизует пользователя, и при успехе посылает ответ с заголовком X-Sendfile, указывающим на местоположение защищенного файла. С этого момента Apache выполняет работу по передаче файла клиенту, а не PHP.

3
ответ дан 14 December 2019 в 18:55
поделиться
1
ответ дан 14 December 2019 в 18:55
поделиться

А как насчет использования символических ссылок? Если у вас есть пример папки:

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

Это может быть не самый переносимый метод, но поскольку вы перенаправляете пользователя, веб-сервер обрабатывает загрузки.

1
ответ дан 14 December 2019 в 18:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: