• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Es regnet, ist neblig und kalt, alle sind krank und der Chef wird zunehmend cholerisch. Das Thema des Monats ist also folgerichtig --> Das Grau(en)
    Wir sind gespannt, war Euch dazu einfällt! Zum Wettbewerb --> Klick

Downloadgeschwindigkeits Begrenzung

MACRASSI

Gelbe Schleswiger Reinette
Registriert
21.11.04
Beiträge
1.754
Ich wollte mal fragen wie mache ich das denn das Besucher meiner HomePage zb. nur mit 6KB Dateien runterladen können?

Gruß Rasmus

Ps. Will das nur mal wissen, wende das ja nicht bei meiner kleinen HomePage an, das bringt ja nichts ;)
 

Flo82

Eifeler Rambour
Registriert
19.04.05
Beiträge
590
Hi,

hab das vor Jahren mal auf nem Windowsrechner mit ftp gemacht. Da konnte ich die Download- und Uploadrate zuweisen. Also registrierte User volle Geschwindigkeit, Anonyme 6KB. War n lokaler Web-server bei mir daheim.;)
Des Tool war damals bei dem Package WAMP dabei. Obs jetzt noch dabei ist, weiß ich leider net. Schätz mal fürn Mac gibts was ähnliches.

Gruß
Flo
 

Sir Q

Rheinischer Winterrambour
Registriert
12.04.05
Beiträge
923
Hi MACRASSI,

wenn du einen root-Server hast, kannst du eine ganze menge machen und auch für unterschiedliche FTP-accounts unterschiedliche begrenzungen/freiheiten einbauen (z.B. accountXY darf nur 2mb pro tag runterladen, oder accountZZ darf nur soviel runterladen wie er hochgeladen hat).

Beim Apache wird es schwieriger, weil das Programm ja dazu da ist, webseiten so performant wie möglich auszuliefern. Die einfachste Möglichkeit Files nur mit 6kb/s downloaden zu lassen ist - genügend leute parallel die datei runterladen lassen *g* dann wird automatisch langsamer :)

Ernst bei seite - wenn du einen download per PHP-Script (am besten per mod-rewrite getarnt) realisierst, dann tunnelt man in der Regel die eigentliche Datei (außerhalb der root) mit readfile durch. Wenn du da aber einen eigenes construkt ersetzt:

Code:
function delay_dl($filename)
{
	$chunksize = 1*(1024*1024); 	// 1 KiloByte Chunks
	$buffer = '';


	$handle = fopen($filename, 'rb');
	if ($handle === false)
	{
		return false;
	}
	while (!feof($handle))
	{
		$buffer = fread($handle, $chunksize);
		echo $buffer;
		flush();
		usleep(160);	// 160 Mikrosekunden pause
   }

   $status = fclose($handle);
   return $status;
}
Der Code ist nicht getestet - aber so aus dem Kopf - und das eine knappe stunde nach dem aufstehen denke ich, das es funktionieren müsste den Download damit aufzuhalten.

Der Trick ist einfach der, bei 6 KB/s muß eine Pause von 0.166667 Sekunden 166.66666 Mikrosekunden erfolgen - gehen wir davon aus, das das Senden etwas zeit braucht, nehmen wir nur 160 Mikrosekunden - rein Rechnerisch wird damit bei 6 mailigen aufruf schon allein fast eine sekunde mit warten gefüllt, und dabei immer nur ein KB gesendet (macht also 6 Chunks zu je 1Kb pro Sekunde) ...

~

Nachtrag, das war mein einundelfzigster Eintrag - 111 - schön binär :)
 

MACRASSI

Gelbe Schleswiger Reinette
Registriert
21.11.04
Beiträge
1.754
Mhm, wenn ich das script teste lade ich mit 70KB und mehr runter und er zeigt mir dann den dateiinhalt im Browser an...

Gruß Rasmus
 

Sir Q

Rheinischer Winterrambour
Registriert
12.04.05
Beiträge
923
Hi MACRASSI,

1. du mußt einen header senden - damit der Browser weiß, was da ankommt. Also einen content-type senden -
Code:
header("Content-type: application/pdf");
wenn du ein PDF downloadest. Must mal etwas googeln nach anderen Content-types ...

2. eventuell stimmt meine Überlegung für die Zeit nicht - probier es mal mit einer anderen - ruhemethode aus:
Code:
sleep(1);
währe dann einfach mal genau eine sekunde pause. Vieleicht stimmt meine idee mit der ersten usleep (microsekunden) ja auch nicht ...

~

Naja, programmieren ist halt nicht wie „Apple benutzen“ - es funktioniert in der Regel nicht auf anhieb. So ein Script-Schnipsel ist oft nur ein Fingerzeig - ausprobieren, die Idee aufgreifen und experimentieren - oder feststellen das es quatsch ist und was anderes machen ...
 

MACRASSI

Gelbe Schleswiger Reinette
Registriert
21.11.04
Beiträge
1.754
Hab den Thread mal wieder ausgegraben.
Egal ob ich mit der einen oder der funktion das Script laufen lasse, ich bekomme immer wieder eine Downloadgeschwindigkeit von 60-200kb/s.

Gruß Rasmus
 

Trapper

Meraner
Registriert
12.05.05
Beiträge
232
Benutzt du den vorgeschlagenen Code von oben?
Falls nein, poste mal deinen verwendeten.
Fall ja, die Chunksize erscheint mir im obigen Code falsch gesetzt. Im Kommentar steht 1 Kilobyte, angegeben sind aber 1024*1024 Byte = 1 Megabyte. Damit wird pro Sekunde (Falls sleep(1)) max. ein Megabyte gesendet... bisl viel.
 

MACRASSI

Gelbe Schleswiger Reinette
Registriert
21.11.04
Beiträge
1.754
Ich hab das so wie oben.
Ich will das man mit maximal 6kbs downloaden kann. (so das ich das einstellen kann)

Gruß Rasmus

Ps. Danke für eure Hilfe

Ach ja, ich hab das so:

Code:
<?php
// Wir werden eine PDF Datei ausgeben
header('Content-type: application/mp3');

// Es wird downloaded.pdf benannt
header('Content-Disposition: attachment; filename="downloaded.mp3"');

// Die originale PDF Datei heißt original.pdf
//readfile('original.jpg');


function delay_dl($filename)
{
	$chunksize = 1*(1024*1024); 	// 1 KiloByte Chunks
	$buffer = '';


	$handle = fopen($filename, 'rb');
	if ($handle === false)
	{
		return false;
	}
	while (!feof($handle))
	{
		$buffer = fread($handle, $chunksize);
		echo $buffer;
		flush();
		sleep(1);	// 160 Mikrosekunden pause
   }

   $status = fclose($handle);
   return $status;
}

delay_dl("podcast_download.mp3");

?>
 

Trapper

Meraner
Registriert
12.05.05
Beiträge
232
dann änder doch mal die Größe eines Chunks:
Code:
$chunksize = 6*1024;
Geht's nun?
 
  • Like
Reaktionen: MACRASSI

MACRASSI

Gelbe Schleswiger Reinette
Registriert
21.11.04
Beiträge
1.754
Jo!
Jetzt klappts.
Danke für die schnelle Hilfe.

Gruß Rasmus

Ich poste hier mal den ganzen Code so wie es sein muss.(fals jemand sowas braucht)

Code:
<?php
// Wir werden eine PDF Datei ausgeben
header('Content-type: application/mp3');

// Es wird downloaded.pdf benannt
header('Content-Disposition: attachment; filename="downloaded.mp3"');

// Die originale PDF Datei heißt original.pdf
//readfile('original.jpg');


function delay_dl($filename)
{
	$chunksize = 6*1024; 	// 1 KiloByte Chunks
	$buffer = '';


	$handle = fopen($filename, 'rb');
	if ($handle === false)
	{
		return false;
	}
	while (!feof($handle))
	{
		$buffer = fread($handle, $chunksize);
		echo $buffer;
		flush();
		sleep(1);	// 160 Mikrosekunden pause
   }

   $status = fclose($handle);
   return $status;
}

delay_dl("podcast_download.mp3");

?>