одновременно один пользователь скачивает только один файл с сервера

dj100gr

Новичок
одновременно один пользователь скачивает только один файл с сервера

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

Royal Flash

-=MaestrO=-
1. Инициализировать пользователя сессией.
2. Непосредственно, перед стартом закачки, записать 1 в (базу, файл) напротив его имени.
3. Сразу после успешной закачки записать заместо еденицы - 0
4. Перед стартом закачки любым пользователем, проверять, что у него записано: 1 или 0.

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

dj100gr

Новичок
спасибо за идею, я сам планировал нечто подобное сделать, но можно ламерский вопрос: как я определю закачал пользователь файл или нет, по времени достаточно сложно это сделать, если можно это както определить в скрипте, то есле не трудно скиньте пример...
закачка происходит у меня так: кидаются хидеры а потом readfile...
 

rotoZOOM

ACM maniac
Royal Flash Да, если можно 3 пунктик поподробнее. Определение успешной закачки. Тоже очень узнать хочется.
 

dj100gr

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

-~{}~ 22.02.05 12:00:

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

-~{}~ 24.02.05 05:13:

просто не могу поверить что никто помочь не может....
 

SelenIT

IT-лунатик :)
как определить хотябы формально что пользователь уже скачал файл?
Насколько мне известно - никак, во всяком случае, средствами протокола HTTP (разве что запросить подтверждения у самого пользователя). Эта тема уже неоднократно обсуждалась. Но разве это важно для исходной задачи - ограничить число файлов, закачиваемых одновременно? Имхо,если юзер закачивает один и тот же файл повторно (по ошибке или из-за того, что первый раз файл не докачался) - это его право, главное, чтоб он не мог параллельно закачивать еще один файл...
 

dj100gr

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

если кто знает подскажите как можно у апача запросить данные о сессиях закачки...

-~{}~ 24.02.05 10:04:

должно же быть хотябы какое решение...
 

vitus

мимо проходил
Автор оригинала: dj100gr
закачка происходит у меня так: кидаются хидеры а потом readfile...
если ты и в самом деле делаешь так, то после readfile можно считать что всё получилось, ещё нужно триггер воткнуть на случай обрыва соединения.
Почитай про "Connection handling".
 

dj100gr

Новичок
при попытке сделать изменения в базе данных сразу после функции readfile(), именения почемуто не проходят, то же самое происходит при попытке оборвать закачку самим пользователем... в итоге пользователь качает 1 файл и все больше он ничего сделать не может.. независимо от того скачал он файл или нет...

-~{}~ 25.02.05 07:31:

скрипт такой

header('Content-Description: File Transfer');
header('Content-Type: application/force-download');
header('Content-Length: ' . filesize($file));
header('Content-Disposition: attachment; filename=' . basename($file));
readfile($file);

mysql_query ("DELETE FROM ip_adres WHERE ip='bla-bla");

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

vitus

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

-~{}~ 25.02.05 09:18:

http://www.lic-lab.com/thread/send.php

PHP:
$file="1.html";

header('Content-Description: File Transfer');
header('Content-Type: application/force-download');
header('Content-Length: ' . filesize($file));
header('Content-Disposition: attachment; filename=' . basename($file));

echo "before:<br> reading of ";
echo filesize($file);  
echo " bytes:";

readfile($file);

echo "after reading - do something";
-~{}~ 25.02.05 09:27:

посмотри еще register_shutdown_function ( string func)
 

dj100gr

Новичок
большое спосибо за ответ

все в принципе работает, но остались такие косяки:

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

2. косяк который происходит в тот момент когда пользователь сам отменяет закачку... в этом случае скрипт не выполняется до конца и запись из базы соответственно не удаляется....
 

vitus

мимо проходил
1 - сентенция не ясна - какой сам файл?
2 - смотри мой последний пост
 

dj100gr

Новичок
файл arhiv.cab или arhiv.rar объем не менее 160 мег...

-~{}~ 25.02.05 10:26:

там еще avi или mpg предпологаются...
 

vitus

мимо проходил
:) обломись с readfile - на любом хостинге это не пройдёт, по причине ограничения памяти под скрипт, только на своём сервере такое прокатывает.

и мне всёравно неясно почему 1 - хочешь помощи - разогни грабли
 

dj100gr

Новичок
на свой сервак и надо поставить, там фильмов архив будет...так что прокатит
вот только задачу поставили чтобы только один качался

не могу разобратся только как сделать чтобы скрипт до конца дорабатывал при обрыве закачки пользователем..

а если не через readfile то есть еще варианты?

-~{}~ 25.02.05 11:06:

хочешь помощи - разогни грабли
недопонял тебя...
 

vitus

мимо проходил
недопонял тебя...
разберись и объясни что у тебя происходит конкретно в косяке под номером 1, из того что ты написал - ничего не понятно, даже не понятно - что за косяк!

остальное - register_shutdown_function () и "Connection handling" - весь! - полезная штука в твоём случае.

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

dj100gr

Новичок
Connection handling и register_shutdown_function () читал..
полезная штука но пока применить не получается...

с первой проблемой уже разобрался.... причиной были те самые тормоза из за файла целиком

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

vitus

мимо проходил
ещё читай, - это САМОЕ полезное для твоей задачи.

пиши сам :)
fopen,while, fread, echo
 

dj100gr

Новичок
судя по подсказке вместо readfile нужно просто частями вайл читать до конца....
а потом что? просто прочитал и все или что нужно с каждой частью делать... ? короче не могу понять. может есть кто добрый подскажите, а то сроки поджимают...

-~{}~ 28.02.05 06:26:

$fp=fopen($file, "r");
while (! feof($fp))
{
fread($fp, 10240);
}
fclose ($fp);

чего не хватает чтобы нормально работало? приведенный код читает только маленьуий кусочек файла причем размер совсем не такой какой указан...
 
Сверху