matid
2.05.2004, 19:30:59
Czy ma ktoś pomysł jak rozwiązać kolejkowanie download'u w php? Chodzi mi o ograniczenie pobierania np. przez 10 osób jednocześnie i kolejkowanie użytkowników oczekujących na pobranie pliku. Takiej osobie będzie się wyswietlał komunikat w oknie popup: Jesteś 15/100 w kolejce, proszę czekać. I ta strona się będzie odświeżać, dopóki nie zwolni się miejsce dla wszystkich użytkowników zakolejkowanych przed nim i dopiero jak będzie mniejsce dla tej osoby to rozpocznie się transfer pliku.
Czy wogóle takie coś jest wykonalne w php bez ingerowania w ustawienia serwera www ?
cichy
2.05.2004, 19:34:47
W samym php nie aczkolwiek mozesz zrobić coś takiego:
Przewidywany czas na ściagniecie pliku: 5 minut
ktoś klika na ściągnij.
sprawdzasz ile osób aktualnie ściaga plik (czyli data wieksza od obecnej minus 5 minut) jesli mniej osób niz limit to pozwalasz mu ściągać..
jeśli mniej to wrzucasz go do kolejki... i odświerzasz np za 10 sekund.
Pozdro
matid
2.05.2004, 20:40:20
No i tutaj będzie problem, bo łącza są bardzo zróżnicowane i trzeba by było jakaś średnią przyjać. Chyba żeby ograniczyć to do jakiegoś transferu jaki strona może maksymalnie generować, np. 10 GB miesięcznie. Wtedy skrypt sprawdzał jaki byłby czas pobrania jakiegoś pliku np. aby nie przekroczyć limitu transferu plik 1 MB musiałby być pobierany 4 min 12 s. Po przeroczeniu tego czasu skrypt wpuszcza kolejną osobę. To chyba będzie najlepsze rozwiązanie. Jeśli ma ktoś jakieś inne pomysły to proszę się wypowiedzieć.
djpeterek
2.05.2004, 21:58:02
założenia takiego skryptu to:
1 - ktoś klika w link np : download.php?plik=plik.zip
2 - skrypt sprawdza w bazie ile jest wpisów z czasem ( mktime() ) który jest niewiększy niż aktualny + 300 powiedzmy ( mktime()+300 ) , jeżeil jest ich mniej niż X to przechodzi dalej, jak więcej to wywala error, przechodzi do 4 i kończy ( bez 5 sie znaczy )
3 - teraz skrypt zapisuje do bazy aktualny czas + 300 ( mktime()+300 )
4 - skrypt kasuje wszystkie wpisy, w których czas jest mniejszy niż czas aktualny
5 - nastąpnie wysyła do użytwkonika plik, przekierowując go na właściwy adres lub odczytując zawartość i wysyłając do przeglądarki
Objaśnienia :
- 300 oznacza 300 sekund czyli 5 minut, przykładowy czas przez ktory użytkownik uważany jest za pobierającego plik, oczywiście możesz zmienić
- X to ilość osób które mogą pobierać jednocześnie
oczywiscie mozesz to zrobic na sql'ku
można innaczej.
Wysyłąć pliki poprzez header'a.
Na początki pobierania dodawać do bazy danych że ktoś pobiera dany plik z konkretnego IP. Po zakończeniu wysyłąnia poprostu usuwać rekordy z bazy. Trzeba jeszzce coś zrobić żeby jak ktoś przerwie nie blokowało ale to już nie powinno być trudne. Niestety to rozwiązanie będzie sie dobrze sprawdzało jeżeli pliki są na tym samym serwerze, innaczej będzie nam generowało dodatkowy ruch.
cichy
3.05.2004, 12:41:55
Wpadł mi jeszcze inny pomysł (azckolwiek podobny)
Można zrobić tak:
1. user klika na ściągnij
2. sprwadzane jest ile jest plikow aktualnie sciaganych
(w bazie np tak:
plik, przewidywany czas zakonczenia
Czyli skrypt sprawdza ile jest plikow ktorych czas zakonczenia jest wiekszy niz aktualna data (najlepiej zapisywac jako time() )
jesli mniej niz np 30 (limit ilosci na raz sciaganych plikow)
to przejscie do punktu 3.
jeśli więcej do punktu 5.
3. zapisanie w bazie nazwy pliku (lub jego id, albo inny identufikator)
np jakisplik.rar, time()+45 (aktualna data +45 sekund)
4. przekierowanie kogoś do odpowiedniego pliku.
5. wstawienie uzytkownika do kolejki nazwapliku.rar, nr w kolejce(np poprzez nadanie mu najwiekszego id obecnie)
6 odswierzenie za pare sekund , sprawdzenie ile ile jest sciagnych plikow..
jesli zwolnilo sie jakies miejsce (np 29 osob teraz sciaga plik)
to wybranie z tabeli kolejka osoby z najmniejszym ID i przekierowanie jej do pliku.
Ogólnie dobrze by było ukrywać też adres ściąganego pliku (było o tym na forum już) żeby nie można było zassać pliku bez czekania w kolejce.
Dzięki temu rozwiązaniu możliwe jest ustalanie róznego czasu dla różnych plików, i tam np plik 1 mb może być ściagany w minute a 100 mb w 10 godzin.
Pozdro
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.