Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Limitowanie prędkości pobierania plików dynamicznych
Forum PHP.pl > Forum > PHP
seba22
Witam,

Mam plik zapisany w zmiennej $zdjęcie.

Chciał bym wysłać go do przeglądarki z maksymalną prędkością 20KB/s.

Czy jest na to jakaś metoda ?

W wypadku plików statycznych, było obejście związane z fopen, wysyłanie chyba 4 kilobajtów w pętli a potem usleep na (x milisekund)... i dzięki temu mogliśmy dowolnie bawić się w limitowanie transferu...

Jak sytuacja miewa się w wypadku czegoś, co nazwijmy nie parlamentarnie mam w "stringu" i nie mogę wydawać parametru który mówi ile mam odczytać i ile wysłać... ?

Pozdrawiam
Pilsener
Jeśli chcesz odciążyć pamięć to wysyłasz po prostu plik po kawałku lub linia po linii, jeśli transfer to polecam:
http://pl.php.net/manual/pl/function.fread.php - w komentarzach kilka sposób limitowania transferu, było też na forum.
p-avel
Sory, ale tu http://pl.php.net/manual/pl/function.fread.php nie ma nic konkretnego, szukając po necie też znajdziesz w większości przykład

  1. // local file that should be send to the client
  2. $local_file = 'test-file.zip';
  3. // filename that the user gets as default
  4. $download_file = 'your-download-name.zip';
  5.  
  6. // set the download rate limit (=> 20,5 kb/s)
  7. $download_rate = 20.5;
  8. if(file_exists($local_file) && is_file($local_file)) {
  9. // send headers
  10. header('Cache-control: private');
  11. header('Content-Type: application/octet-stream');
  12. header('Content-Length: '.filesize($local_file));
  13. header('Content-Disposition: filename='.$download_file);
  14.  
  15. // flush content
  16. flush();
  17. // open file stream
  18. $file = fopen($local_file, "r");
  19. while(!feof($file)) {
  20.  
  21. // send the current file part to the browser
  22. print fread($file, round($download_rate * 1024));
  23.  
  24. // flush the content to the browser
  25. flush();
  26.  


problem jest w tym że w zależności od prędkości łącza po stronie klienta, oraz to że nie znamy rozmiaru pliku który będzie przesłany powoduje to to że limit prędkości jest różny, trzeba by sprawdzać w jakiś sposób może prędkość łącza po stronie klienta i tym parametrem się sugerować

Pozdr
varez
sa też rozszerzenia do apacha (zakladajac ze masz dostep do ich instalacji) z tego co wiem
p-avel
nie no oczywiście chodzi o np. cband, ale cały bajer w tym z aby poziomu php to regulować

jakieś komercyjne rozwiązanie http://www.12scripts.com/scripts.php?scripts.id=4 ale nie ma nigdzie skryptu zeby przetestowac jak to działa

linki do tego co znalazłem:

Real Bandwidth Limiting with PHP
http://sixserv.org/2009/02/21/experimental...-http_download/

tu jest też spoko
Bandwidth Control with pure PHP
http://www.codewalkers.com/c/a/File-Manipu...-with-pure-PHP/

tyle że w każdym przypadku rozmiar pliku jest znany
erix
Yhm, a w czym problem użyć funkcji buforowania wyjścia?

Do tego register_tick_function i sprawdzanie wielkości -> jeśli jest większe niż rozmiar bloczku -> pauza na sekundę.
p-avel
Cytat(erix @ 9.04.2010, 13:30:06 ) *
Yhm, a w czym problem użyć funkcji buforowania wyjścia?

Do tego register_tick_function i sprawdzanie wielkości -> jeśli jest większe niż rozmiar bloczku -> pauza na sekundę.

Buforowanie hm... ok, ale potrzebą jest aby limitowało cały ruch który dany użytkownik generuje, czyli jak pobiera dwa pliki to zadany transfer ma dzielić przez 2 itp., jak testowałem na jednym pliku to regulowałem prędkość bardziej przy pomocy usleep(); niż rozmiarem bloczku
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-2025 Invision Power Services, Inc.