Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ilość plików pobieranych jednoczesnie
Forum PHP.pl > Forum > PHP
radmistrz2
Witam. Czy można jakoś sprawdzić z poziomu php ile plików użytkownik o x ip pobiera w danym momencie? Chcę ograniczyć ilość pobieranych plików aby ludzie nie zaczynali ściągać 10 plików po 100 mega jeśli zostało im 150 MB transferu - transfer odejmuje dopiero po zakończeniu pobierania. Może jest jakiś jeszcze inny sposób na to aby nie dać się oszukać??
marcio
Ja sie na tym nie znam ale gdybys np robil update transferu(nie wiem masz go w bazie czy cos) za pomoca ajax'a?

Lub poprostu za kazdym sciagnietym plikiem sprawdzasz ile transferu zostalo porownywal go z wielkoscia nastepnego pliku do sciagniecia jesli jest wiecej to sciagasz jesli nie to konczysz download.

Nie chce powiedziec zadnej herezji ale akurat nigdy nie rozwiazywalem takiego problemu.

artega
Dostosuj poniższy skrypt do własnych potrzeb
  1. <?php
  2.  
  3. $speed = 100;
  4.  
  5. $bufsize = 2048;
  6.  
  7. $packet = 1;
  8.  
  9. $bandwidth = 0;
  10.  
  11. $file = "/home/file.tgz";
  12.  
  13. $lock = '/tmp/'.$_SERVER['REMOTE_ADDR'].'_'.md5($file).'.lock';
  14.  
  15. if (file_exists($lock))
  16. {
  17. echo "Concurrent downloading is disallowed";
  18. exit();
  19. }
  20.  
  21. $size = filesize($file);
  22.  
  23. $fp = fopen($file, 'rb');
  24.  
  25. touch($lock);
  26.  
  27. while (!(connection_aborted() || connection_status() == 1) && $size > 0)
  28. {
  29. if ($size < $bufsize)
  30. {
  31. echo fread($fp, $size);
  32.  
  33. $bandwidth += $size;
  34. }
  35. else
  36. {
  37. echo fread($fp , $bufsize);
  38.  
  39. $bandwidth += $bufsize;
  40. }
  41.  
  42. $size -= $bufsize;
  43.  
  44. flush();
  45.  
  46. if ($speed > 0 && ($bandwidth > $speed * $packet * 1024))
  47. {
  48. sleep(1);
  49. $packet++;
  50. }
  51. }
  52.  
  53. unlink($lock);
  54.  
  55. fclose($fp);
  56.  
  57. ?>

Aby sprawdzić ile plików jest pobieranych w danej chwili wystarczy:
  1. <?php
  2. echo count(glob('/tmp/'.$_SERVER['REMOTE_ADDR'].'_*.lock'));
  3. ?>

Wypadałoby też zabezpieczyć się przed martwymi kluczami wskazywanymi przez zmienną $lock sprawdzając czas ostatniego dostępu.
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.