Memcache - memcached - chodzi o idee
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ą