Я должен подать большие файлы (> 2 ГБ) от веб-сервера Apache. Файлы защищены загрузки, таким образом, мне нужен некоторый способ для авторизации пользователя. CMS я использую cookie использования, проверенные по базе данных MySQL для проверки пользователя. На сервере я не имею никакого контроля над max_execution_time и ограниченного управления memory_limit.
Моя техника работала на маленькие файлы. После того, как пользователь был авторизован в PHP (CMS), я использую readfile () для обслуживания файла, который хранится выше корня документа для предотвращения прямого доступа. Я читал о методах, чтобы разделить загрузку на блоки или использовать fpassthru для обхождения предела памяти PHP. Но я не нашел, что техника обходит предел max_execution_time.
Я думал о том, чтобы хранить файл в корне документа, таким образом, мы могли обойти PHP полностью. Но то, что я не могу выяснить, - то, как ограничить доступ с htaccess. Я должен проверить пользователя против базы данных, прежде чем я смогу служить им файл.
Спасибо.
Самое хорошее решение, на мой взгляд: установите mod_xsendfile
в ваш Apache, пусть PHP скрипт авторизует пользователя, и при успехе посылает ответ с заголовком X-Sendfile
, указывающим на местоположение защищенного файла. С этого момента Apache выполняет работу по передаче файла клиенту, а не PHP.
Take a look at set_time_limit()
http://www.php.net/manual/en/function.set-time-limit.php
and max_execution_time
http://www.php.net/manual/en/info.configuration.php#ini. max-execution-time
А как насчет использования символических ссылок? Если у вас есть пример папки:
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');
Это может быть не самый переносимый метод, но поскольку вы перенаправляете пользователя, веб-сервер обрабатывает загрузки.