Czasami 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:

  1. wysłać nagłówki
  2. opróżnić bufory
  3. 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).