Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php , zend] komercyjny downoad binarnych plikow.
Forum PHP.pl > Forum > Gotowe rozwiązania > Szukam
kostekplay
Szukam klasy, innego rozwiązania, umożliwiającego mi udostępnienie odpłatne dużych plików binarnych.
Chodzi o pliki o rozmiarach 300 - 500 mb.
Pliki udostępniany by były płatnie na określoną ilość pobrań prze określonego użytkownika w danym czasie.
Po dokonaniu analizy w grę wchodą praktycznie trzy rozwiązania:
- zagonienie mysql lub postgress do udostępniania LONGBLOB
- stworzenie za pomocą np proftpd dynamicznych kont użytkownikow z dowiązanymi linkami do poboru na określony czas i ilość ...
- podwiązanie linku do maskowanego linku i jego domyślna translacja ( sa dobre tylko rozwiązania komercyjne )

ilość pobrań ok 200 / doba - łącze 100mbit/s , możliwości sprzętowe ( 4 proc, 8 GB itp, debian 6 )

problem polega na tym że dany link musi być aktywny TYLKO dla DANEJ OSOBY na OKLREŚLONĄ ilość pobrań i OKREŚLONY czas ...

czy ktoś ma uż coś takiego wdrożone i z praktycznej strony chciałby się podzielić doświadczniem ?
Sephirus
Z mojego doświadczenia polecam na przykład takie rozwiązanie

- system linków tymczasowych obsługiwanych przez PHP + Memcache (serwer 1)

Linki tworzone by były w momencie żądania pierwszego (płatnego pobrania) - taki link miałby swój counter oraz limit czasu (zapewnia to memcache) po którym byłby kasowany. Link ten oczywiście nie miałby nic wspólnego z realnym adresem plików

- przechowywanie plików

Pliki powinny być trzymane poza dostępem via WWW na szybkim serwerze - nginx/lighttpd itp (apache odpada). Polecam tu nginx+php. Pobranie pliku wyglądało by w ten sposób:

a. Użytkownik "klika" pobieranie pierwszy raz.
- naliczenie opłaty za plik... (odpowiednio pobranie z konta dostępnej kasy itp)
- tworzy się link tymczasowy w memcache kierujący na konkretny plik - może to być ID danego pliku w bazie
- przejście na link tymczasowy
- PHP sprawdza czy dany link tymczasowy istnieje w memcache i czy counter nie jest równy 0 - odpowiednio zmniejsza counter pobrań
- PHP przekazuje poprzez odpowiednie nagłówki serwerowe (X-sendfile lub podobne - nginx ma coś takiego) jaki plik serwer ma zwrócić użytkownikowi (w tym miejscu można też określić prędkość wysyłania danych itd - za to dalej odpowiada już sam serwer / PHP ma za zadanie jedynie sprawdzić czy dany link tymczasowy jest ważny i przekazać serwerowi dane które plik ma wysłać (nie jest to żadne readfile itp...)

b. Użytkownik klika pobieranie po raz kolejny
- dzieje się dokładnie to samo bez naliczania opłaty...

Jeśli zastosujesz szybki serwer (w sensie nginx/lighttpd/lightspeed(płatny)) to to rozwiązanie jest proste do wdrożenia i implementacji i bardzo wydajne smile.gif

(współtworzyłem spory hosting plików w którym było dużo zmian i nauki na błędach więc możesz mi zaufać) smile.gif

Tak więc - co do gotowych rozwiązań - to musza sporo kosztować żeby były naprawdę dobre - a samemu za free można to całkiem nieźle zbudować. Darmowe (w większości) rozwiązania - w dodatku jeszcze mało profesjonalne lub z podejściem czysto PHPowym (bez określenia serwera itd...) są bardzo słabiutkie... ale może się trafić jakiś wyjątek - tak czy owak ja go nie znam tongue.gif
kostekplay
Hmmm, dziękuję za wyczepującą odpowiedź,

Co do memcache to memcached jest świeższy.
Kwestia cachowania oczywiście powinna wystąpić, ale mnie bardziej zastanawia co miałeś na myśli

Cytat
Linki tworzone by były w momencie żądania pierwszego (płatnego pobrania) - taki link miałby swój counter oraz limit czasu (zapewnia to memcache) po którym byłby kasowany. Link ten oczywiście nie miałby nic wspólnego z realnym adresem plików


Generalnie, skoro uż przedłubaleś temat, może jesteś zainteresowany współpracą ? ( oczywiście nie na zasadzie wolontariatu ).
Jak tak, to poproszę info na priv.

Sephirus
Memcache - memcached - chodzi o idee wink.gif Ja już sam nie pamiętam na czym to robiliśmy - serwer na pewno był memcached ale czy uzywaliśmy w PHP do łączenia i obsługi klasy memcache czy memcached to już nie pamiętam.

Co do pytania to opiszę po krótce na przykładzie.

Pliki trzymamy w /home/www/pliki/ - niedostępny przez www

Strona jest w /home/www/public_html/ - dostępny przez www

Ktoś chce pobrać plik. Przykładowo php.rar. Wchodzi więc na stronę (jest zalogowany, może pobierać itd.).

Pokazuje mu się link do pobrania pliku. Link ten jest generowany automatycznie przykładowo tak:

- Żądanie pliku php.rar (id:12345)
- Generowanie linku tymczasowego poprzez jakiś hash z id pliku, id usera, itp. do formatu np strona.pl/file/[hash]/php.rar
- Zapis do memcache 2 tablic pod kluczem [hash] oraz [hash]_counter z polami:
* dla [hash] - [id_pliku],[adres_ip_usera], itp...
* dla [hash]_counter - 10 (zakładmy że plik może być pobrany 10 razy)
- Oba obiekty memcache zapisane są z timeoutem 24h (takie założenie że 24h będzie aktywny link)

Teraz użytkownik klika link. Odpowiedni mod-rewrite wyciąga z adresu [hash] i sprawdza czy ma obiekt memcache pod takim kluczem.
Jeśli ma (czyli nie wygasł) sprawdza counter - jesli jest 0 to usuwa obiekty z memcache i zwraca błąd (wygaśnięcie linku), jeśli jest > 0 to:
- robi decrement na [hash]_counter,
- pobiera z bazy dane o pliku
- wywołuje header(...) z odpowiedni nagłowkiem typu x-sendfile oraz ewentualnym okresleniem prędkości pobierania oraz pliku z katalogu plików, który ma być przesłany. Ustawia odpowiednie nagłówki HTTP co do Content-type i size.

Plik się pobiera - uzytkownik jest happy. Samo pobieranie pliku idzie już poza PHP i jest regulowane przez serwer. Odpowiednia konfiguracja daje możliwość również sprawdzenia czy plik został pobrany w całości, poprzez PHP można również odczytać Content-range toteż umożliwić wznawianie pobierania itp. Wszystko to w jednym skrypcie do obsługi pobierania plików.

Tak generowane linki tymczasowe pozwalają na uzywanie download-managerów itd. Ponieważ przy samym pobieraniu nie jest sprawdzane kto pobiera plik (w sensie że user nie musi być zalogowany jak już ma link tymczasowy) jest to możliwe. Link tymczasowy jest generowany tylko przez zalogowanego użytkownika. Zatem nie ma mozliwości kombinowania i wpisywania linków z palca bo ich po prostu nie będzie. Jedyna możliwość do pobrania pliku bez styku z serwisem jest gdy ktoś miałby fart i "zgadł" jakiś hash do pliku, wpisał adres w przeglądarkę i plik by mu się pobrał. Można to jednak bardzo łatwo ukrócić poprzez dodanie do obiektu memcache pod kluczem [hash] adresu IP. Wówczas można by było sprawdzać czy wywołanie linku tymczasowego jest z tego samego adresu co jego generacja. Co wyklucza w praktyce jakiekolwiek próby pobierania plików dla tych którzy nie powinni tego móc zrobić.

Co do opłaty - gdzieś musi być pobierana opłata - domyśliłem się z tego co pisałeś, że byłaby to opłata za dany plik a nie jako abonament. Tak czy owak gdzieś trzeba ją upchnąć - jeśli dobrze Cię zrozumiałem to powinna znaleźć sie przy/przed generacją linku tymczasowego do pobrania pliku.

Jeśli chodzi o pomoc - to wierz mi - chciałbym pomóc - bo to jest bardzo ciekawy temat i mam w tym nieco doświadczenia - ale niestety czas mi na to nie pozwoli. Zawsze jednak mogę służyć radą lub "lekką" pomocą wink.gif

Crozin
@Sephirus: Chyba nieco lepszym rozwiązaniem byłoby generowanie oddzielnego, unikalnego linka dla każdej kopii pobieranego pliku, czyli:
1. Zalogowany użytkownik po opłaceniu pobierania danego pliku ląduje na jakiejś stronie z której może pobrać (np. 10 razy) docelowy plik.
2. Klika w link "wyświetl link do pobrania" po czym (o ile może jeszcze generować nowe linki) dostaje unikalny link typu: http://strona.pl/pobierz/whfdsfxcncv23423rdslsdf
3. Wejście na dany link umożliwia pobranie raz, i tylko raz, danego pliku.

Po co takie coś? Umożliwia to lepszą kontrolę nad pobieranymi plikami z dokładnością do każdej pojedynczej kopii pliku. Daje to trochę potencjalnych możliwości nie generując na dobrą sprawę żadnych dodatkowych obciążeń.
Sephirus
@Crozin - masz rację i nie masz smile.gif

- Masz rację oczywiście jeśli chodzi o samą idee - nie potrzebne jest trzymanie "countera" przy linku do pliku - twoje podejście jest nieco wydajniejsze nawet pod pewnym kątem - tak można zrobić i jest to faktycznie łatwiejsze jeśli chodzi o staystykę tego itd...

Ale... napisałem że masz rację i nie masz dlatego, że:

- Jak czytałeś wspominałem o opcji typu download-manager + wznawiawnie pobierania a przy tej opcji twoja metoda odpada. Link musi być trzymany tyle ile ma timout'u lub tyle razy ile można go pobierać.

Przy czym wznawianie jest cięższą sprawą niż się wydaje smile.gif

Swego czasu przerobiłem to wznawianie pod względem i technicznych i teoretycznym (w oparciu też o najpopularniejsze download-managery) i mogę powiedzieć tyle:
- pobieranie pliku zwykłym D-M to nie problem - odpalamy link raz.
- pobieranie pliku zwykłym D-M ze wznawianiem - odpalamy link - pobieramy - przerywany - odpalamy jeszcze raz ten link z określonym RANGE'em - to też nie jakiś wielki problem
- Pobieranie pliku D-M tzw akceleratorem pobierania - D-M odpala link ze 4 razy równocześnie ustawiając chęć pobrania 25% pliku zaczynając w każdym requeście od innej części (0,25%,50%,75%) - da się to zrobić poprzez obsługę wznawianie - wówczas jednak user w tym samym czasie zasysa ten sam plik 4 razy...

Problem da się rozwiązać łatwo - blokada Akceleratorów pobierania - sprawdzanie czy istnieje aktualnie pobieranie pliku A gdy ten sam user żąda pliku A - trzeba to zrobić po stronie serwera (da się tak skonfifurować by po wysłaniu pliku serwer odpalał skrypt PHP przekazując mu dane, które wcześniej ustawiliśmy w nagłówku + dane o postępie wysyłania pliku).

Ale to jest takie kiepskie rozwiązanie - jesli chcemy korzystać z Akceleratorów to musimy pamiętać że jedno kliknięcie w link (dodanie linku do kolejki pobierania w A-D) to X pobierań jednoczesnych a zatem nasz counter z 10 zamiast zejść na 9 zejdzie na 6 co też trzeba obsłużyć smile.gif

A nie oszukujmy się - porządny hosting powinien to udostępniać smile.gif

W hostingu, który współtworzyłem nie mieliśmy problemu maksymalnej liczby pobrań danego pliku - stąd też ten problem rozwiązał się sam a akceleratory śmigały - tutaj sprawa się komplikuje.

Reasumując - link nie powinien być jednorazowy ze względu na wznawianie i/lub akceleratory :/
Crozin
@Sephirus: O akceleratorach nie pomyślałem (w końcu post pisany z miejsca, bez zastanowienia :]), jednak ogólnie chodziło mi o to by każde z przykładowych 10 pobrań reprezentować sobie w systemie jako 10 oddzielnych obiektów, nie jeden zbiorczy z licznikiem. To jak to tam zostanie dokładnie zaimplementowane to już inna kwestia - może co najwyżej (nie musi) być jednorazowy w sensie umożliwiać jednokrotne pobranie danej części pliku. Ale jak już napisałem nie to było istotą mojej uwagi. wink.gif
Sephirus
@Crozin ok wink.gif Teraz w 100% kumam smile.gif I zgadzam się z Tobą - trzeba to wziąć pod uwagę by się odpowiednio każdy download zapisywał smile.gif

EDIT: Tak czy owak cała dyskusja od początku prowadzi w zasadzie do jednego - darmowej, dobrej machiny do tego raczej się nie znajdzie - zostają komercyjne lub tworzone od podstaw smile.gif
kostekplay
@Sephirus

Bardzo Ci dziękuję.

Szukałem rozwiązań a Ty wskazałeś mi drogę ( nieźle to brzmi, wzniośle smile.gif

W święta odpalę sobie takie rozwiązanie i przygotuję do szerszych testów.
Chętnie pochwalę się wynikami, a jak wszstko pojdzie zgodnie z przewidywaniem, postaram się podziękować bardziej namacalnie smile.gif

JK

jeszcze jedno ...

masz moze jakies doswiadczenia z wydajnascia mod_xsendfile ?

Poczytalem troszke i wyglada naprawde niezle ( co najwazniejsze calkowicie odpowiada moim wymaganiom ).

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.
Invision Power Board © 2001-2024 Invision Power Services, Inc.