Ограничение 1 загрузки за раз в PHP - PullRequest
5 голосов
/ 07 марта 2011

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

То, что я делаю для загрузки, - это отправка запроса с первого сервера на файл на другом сервере.Если запрошенное видео существует, оно загружается.

Теперь я хочу ограничить пользователей, чтобы, если они уже загружают видео, они не могли загрузить другое, пока не завершится текущая загрузка.После завершения текущей загрузки пользователь может загрузить следующее видео.Я не видел ни одной функции, которая позволяла бы разработчику знать, когда загрузка была завершена.

У меня есть несколько соображений относительно хранения информации о времени загрузки в базе данных.Но хранение времени загрузки не является моим требованием.

Каков наилучший способ реализовать это?Есть ли событие, из которого мы можем определить время окончания загрузки?Есть ли какое-то решение этого?Я использую PHP, и вот код, который я использовал для загрузки файла со второго (видео) сервера.Этот файл отправляет запрос с именем файла и полным путем.Переменная $real_file содержит имя файла и полный путь на втором сервере.

if(file_exists($real_file))
{
    header("Pragma: public"); 
    header("Cache-Control: private"); 
    header("Expires: 0"); 
    header('Cache-Control: no-store, no-cache, must-revalidate');
    header('Cache-Control: pre-check=0, post-check=0, max-age=0');
    header('Content-Transfer-Encoding: binary');
    header('Content-Encoding: none');
    header("Content-Disposition: attachment; filename=".urlencode(basename($real_file)));   
    header("Content-Type: application/force-download");
    header("Content-Type: application/octet-stream");
    header("Content-Type: application/download");
    header("Content-Description: File Transfer");            
    header("Content-Length: " . filesize($real_file));
    header("Accept-Length: ".filesize($real_file));

    $fp = @fopen($real_file, "rb");

    while(!feof($fp))
    {
        $buffer= fread($fp, 8192);
        echo $buffer;
    }

    @flush();
    @ob_flush();
    die();
}

1 Ответ

1 голос
/ 07 марта 2011

Если вы транслируете файл через php-скрипт, возможно, он сможет получить блокировку для конкретного пользователя (конечно, вошел в систему), прежде чем вы начнете читать файл и выводить в поток:

(псевдокод)

obtain_lock_somehow();
readfile('yourvideofile.mpg');
release_lock();

Я не знаю, как скрипт будет реагировать на закрытое соединение, и это может привести к преждевременному завершению работы скрипта.

Другим вариантом было бы прочитать файл и передать потоку «чанки», а между каждым чанком вы обновляете статус «блокировки» посетителей, чтобы вы могли определить, на какой последней отметке времени посетитель на самом деле скачал что-то.

(псевдокод)

while(file_is_not_finished) {
    update_lock_status();
    pass_thru_buffer();
}

Но учтите, что потоковая передача огромного количества данных в php-скрипте, как это, вероятно, не лучший способ, и вам может быть лучше использовать собственный серверный модуль для него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...