Ograniczenie pobierania w PHP
PHP 29 grudnia 2009Czasami powstaje konieczność ustawienia ograniczenia pobierania danego pliku. Przyczyn może być kilka, chcemy zrobić płatny dostęp do naszego serwisu i chcemy aby tylko osoby posiadające odpowiednie uprawnienia mogły pobierać pliki z pełną prędkością, albo porostu nie chcemy przeciążać naszej maszyny. W tym artykule pokaże jak za pomocą PHP w łatwy sposób możemy zrobić ograniczenie szybkości pobierania plików.
Jak pobiera się pliki
Pierwszym pytaniem na jakie musimy sobie odpowiedzieć brzmi: ‘Jak PHP realizuje pobierania plików?’. Odpowiedź jest prosta – PHP wysyła nagłówki zgodne z protokołem HTTP za pomocą funkcji PHP:header.
Pobierania plików z ograniczeniem
Aby pobrać jakiś plik musimy kolejno:
- wysłać nagłówki
- opróżnić bufory
- przeczytać dany plik
Do poprawnego ściągnięcia pliku musimy wysłać odpowiednie nagłówki, myślę że te są wystarczające:
| PHP | | copy code | | ? |
header("Cache-control: private"); |
header("Content-Type: application/octet-stream"); |
header("Content-Length: ".filesize($file_down)); |
header("Content-Disposition: filename=\"$download_file\""); |
pokazujemy w ten sposób co ma być ściągane, jaki rozmiar i jak ma się nazywać plik u nas na komputerze.
To teraz zobaczmy jak powinien wyglądać kod odpowiedzialny za ograniczenie prędkości ściągania pliku:
| PHP | | copy code | | ? |
| 01 | $download_rate = 20.5; |
| 02 | if(file_exists('plik.txt') && is_file('plik.txt')) |
| 03 | { |
| 04 | header("Cache-control: private"); |
| 05 | header("Content-Type: application/octet-stream"); |
| 06 | header("Content-Length: ".filesize('plik.txt')); |
| 07 | header("Content-Disposition: filename=\"plik_pobrany.txt\""); |
| 08 | flush(); |
| 09 | $file = fopen('plik.txt', "r"); |
| 10 | while(!feof($file)) |
| 11 | { |
| 12 | print fread($file, round($download_rate * 1024)); |
| 13 | flush(); |
| 14 | sleep(1); |
| 15 | } |
| 16 | fclose($file); |
| 17 | } |
Teraz może wyjaśnię jak to działa. Wysyłamy nagłówki odpowiedzialne za pobieranie pliku. Czyścimy bufor za pomocą PHP:flush, czytam nasz plik.txt, za pomocą funkcji PHP:fread, i ustawiamy opóźnienie funkcją PHP:sleep. Po tych wszystkich zabiegach w zmiennej $download_rate ustawiamy wielkość z jaką ma być pobierany plik. Wielkość ta jest podawana w kilobajtach (KB).
13 stycznia 2010 at 19:40
a jak zrobić gdy nie znasz rozmiaru pliku?
13 stycznia 2010 at 19:44
Jak możesz nie znać rozmiaru pliku? Właśnie po to używamy funkcji filesize.
13 stycznia 2010 at 22:33
sory za pytanie coś ciężko mi sie myśli ostatnio, albo źle przekazuje o co mi chodzi, inaczej jak pobierasz ze zdalnego serwera plik a nie z lokalnego to jak to może wyglądać? muszę zrobić coś w stylu fsize($url, gdzie url = link do zdalnego pliku?
Pozdr
17 marca 2010 at 14:46
I jak ma sie to do max_execution_time z php.ini?
Pozdrawiam.