Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Limitowanie transferu, Przesyłanie plików przez http
CyklOP
post
Post #1





Grupa: Zarejestrowani
Postów: 61
Pomógł: 0
Dołączył: 16.08.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Witam, ostatnio zostałem postawiony przed problemem ograniczenia transferu przy przesyłaniu pliku przez protokół http (NIE ftp!).

Usiłowałem znaleźć odpowiedź na to pytanie zarówno na forum jak i w internecie, niestety nie znalazłem ani śladu informacji na ten temat.

Ograniczenie takie miałoby zostać narzucone przez php, a nie jakąś konfigurację serwera, albo przez program na nim zainstalowany.

Mój obecny pomysł to użycie funkcji, która po przesłaniu do bufora serwera pakietu czeka z wysłaniem kolejnego 1 sekundę (gdy $delay=1).

  1. <?php
  2.  
  3. function readfile_chunked ($filename,$delay,$kb_per_s) {
  4. $chunksize = $kb_per_s*(1024); // how many kbytes per chunk
  5. $buffer = '';
  6. $handle = fopen($filename, 'rb');
  7. if ($handle === false) {
  8. return false;
  9. }
  10. while (!feof($handle)) {
  11. $buffer = fread($handle, $chunksize);
  12. print $buffer;
  13. sleep($delay);
  14.  
  15. }
  16. return fclose($handle);
  17. }
  18.  
  19. ini_set( 'output_buffering','Off' );
  20. //ini_set( 'implicit_flush','On' );
  21.  
  22. header("Content-type: application/download");
  23. header('Content-Disposition: attachment; filename="'.$name.'"');
  24. readfile_chunked($name,1,10);
  25.  
  26. ?>


Takie rozwiązanie na pewno działa, bo testowałem - być może ktoś jednak ma uwagi co do wydajności takiego rozwiązania (czy obsługiwanie downloadu w ten sposób na stronie z dużą ilością odwiedzin nie wykończy serwera), a także ewentualnie wysłucham pomysłów i uwag.

Obecne rozwiązanie (chyba?) nie opóźnia wysyłki przy słabych łączach, gdy transfer i tak jest mniejszy niż ograniczenie.

Jeśli rozwiązanie jest ok, to mam nadzieję, że komuś kto kiedyś będzie go szukał też się przyda.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
CyklOP
post
Post #2





Grupa: Zarejestrowani
Postów: 61
Pomógł: 0
Dołączył: 16.08.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Cytat
do małych plików, możesz bez problemu streamować
natomiast większe po prostu przekieruj się headerem.


A czy przypadkiem nie jest tak, że jedyna różnica między dużymi plikami a małymi to czas działania skryptu? No bo do pamięci ładowane jest tylko:
$chunksize = $kb_per_s*(1024);
czyli przykładowo 10 kilobajtów...
Chyba, że sam fakt działania w tle kilkuset "procesów" (przy kilkuset downloadach naraz) niezależnie od tego co te procesy robią jest dużym obciążeniem... ale czy wtedy nie jest tak, że nie ma znaczenia czy to duże czy małe pliki, a jedynie ile średnio w trakcie sekundy uzytkownikow sciaga pliki (jakiekolwiek?)?
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.10.2025 - 08:59