[PHP]Anzahl der gleichzeitigen Downloads begrenzen

KingLouie

Active member
ID: 145230
L
5 Juli 2006
26
1
Hallo,
und zwar wollte ich mal fragen, ob jemand weiß, ob und wie es möglich ist die anzahl der gleichzeitigen downloads zu begrenzen. Also das nur x Personen gleichzeitig downloaden können.


Grüße,

KingLouie
 
Hast du mal versucht das ganze über Cookies (oder Sessions, da weiß ich aber nich ob und wie's geht) zu lösen? Einfach die Anzahl der Cookies zusammen Zählen, die gerade mit dem DL beschäftigt sind... dann für alle anderen ne Fehlermeldung ausgeben!

---zyclop
 
Na ja, ich bin leider nicht das größte Programmier-Genie...Habe leider nur Grundkenntnisse.
Aber mal ne andere Frage. Woher sollten die Cockies wissen, wann der Download zuende ist?


Grüße,

KingLouie
 
Woher sollten die Cockies wissen, wann der Download zuende ist?

eben das wird das problem sein...

du könntest aber zB. ne Zahl in ne Textdatei schreiben und diese bei jeden Download um eins erhöhen bis eine maximale Anzahl an Downloads erreicht ist und dann sperren.

Die Zahl wird dann je nach Größe des Downloads (zB. alle 5 Minuten) um eins herunter gesetzt.

So musst du zwar schätzen, wie lange jemand braucht um die Datei zu Downloaden und es ist nicht sehr genau - je nach dem könnte es aber ne Verbesserung der "Serverlast" bringen...
 
Hm, ihr wollt mit Cookies die Anzahl verschidener Personen begrenzen? Ich weis ja nicht...

Theoretisch ist das ganze mehr oder weniger nicht möglich. Du kannst ganz einfach keine Personen unterscheiden. Aber ich gehe mal davon aus dass du die Anzahl gleichzeitiger Downloads limitieren willst. Falls ja, kannst du ja mal folgendes versuchen:
Code:
// pseudo code$
max_downloads = 10
current = SELECT count(*) FROM active_downloads
if current >= 10
  last_insert_id = INSERT INTO active_downloads (ip) (HTTP_CLIENT_IP)
  input = open(file)
  while(!eof(input))
    print read(input)
  DELETE FROM active_downloads WHERE id = last_insert_id
Denn Code kannst du natürlich noch um eine Bandbreiten Limitierung pro Download, sowie eine Limitierung für die Downloads per IP erweitern. Des weiteren wird es nötig sein Leichen aufzuspüren und beseitigen (mit einem timestamp o.ä.) die entstehen können wenn der Server Crasht, oder die Ausführung aus anderen Gründen abbricht. Was in PHP passiert, wenn der Client den Download vorzeitig beendet, weis ich leider nicht, ich vermute aber das das Script Normal weiter läuft, eventuell tritt aber eine Exception beim Ausgeben der Daten aus (der Socket wurde ja geschlossen). Da hilft wohl nur Testen.

Viel Spass beim implementieren,
Veers
 
sollte wohl besser
Code:
//...
if current <= max_downloads
//...
sein. ;)

Was in PHP passiert, wenn der Client den Download vorzeitig beendet, weis ich leider nicht, ich vermute aber das das Script Normal weiter läuft, eventuell tritt aber eine Exception beim Ausgeben der Daten aus (der Socket wurde ja geschlossen).
Hier kannst du mittels ignore_user_abort() verhindern, dass das Script nach Client-Abbruch sofort beendet wird. Über connection_status() checkst du, ob ein Abbruch da is und handelst entsprechend, bevor du das Script dann beendest.
 
Hier kannst du mittels ignore_user_abort() verhindern, dass das Script nach Client-Abbruch sofort beendet wird. Über connection_status() checkst du, ob ein Abbruch da is und handelst entsprechend, bevor du das Script dann beendest.

brauchste nicht... standard mässig bricht das script ab wenn der user die verbindung trennt. Und mithilfe von register_shutdown() kannste auf den abbruch reagieren...
 
brauchste nicht... standard mässig bricht das script ab wenn der user die verbindung trennt. Und mithilfe von register_shutdown() kannste auf den abbruch reagieren...

korrekt ... damit sind aber nur die downloads, die über eine bestimmte (php-)seite gestartet werde gezählt. wenn die leute jetzt das file direkt downloaden funktioniert der ganze spass nicht.

daher wäre folgendes vielleicht eine überlegung wert: leeres verzeichnis erstellen ... htaccess rein, die alle 404-zugriffe auf ein php-script umleitet ... dieses script läd das file von verstecktem pfad nach.

man kann jetzt einen file-counter o.ä. zum beispiel über ein checkfile oder mysql lösen. veränderung des file-counters geschieht bei aufruf des scripts (+1 downloads) und wie zeroccc sagte über register_shutdown (-1 downloads).

mit dieser methode kann man auch alle downloads abfangen, die nicht über die website geschehen.

das ganze kann man aber auch noch anders versuchen. z.b. kann man mit mode-rewrites direkt die zahl der zugriffe auf ein file kontrollieren (da müsste ich mich aber auch erstmal reinlesen)


hth.

@theHacker: kümmer dich doch mal bitte um den progger-gruppen-thread, danke.
 
korrekt ... damit sind aber nur die downloads, die über eine bestimmte (php-)seite gestartet werde gezählt. wenn die leute jetzt das file direkt downloaden funktioniert der ganze spass nicht.

und wie kommt der user deiner meinung nach an die orginale datei? wenn du den download nur über zb download.php?file=blub.zip anbietest, weiß der user nicht wo die datei blub.zip wirklich liegt. also wäre ein direkter zugriff darauf sehr unwahrscheinlich...
 
Hier kannst du mittels ignore_user_abort() verhindern, dass das Script nach Client-Abbruch sofort beendet wird. Über connection_status() checkst du, ob ein Abbruch da is und handelst entsprechend, bevor du das Script dann beendest.

ZeroCCC schrieb:
brauchste nicht... standard mässig bricht das script ab wenn der user die verbindung trennt. Und mithilfe von register_shutdown() kannste auf den abbruch reagieren...

tja meine herren ... weder das eine noch das andere funktioniert komischerweise, wenn die datei downloaded wird.

ich versuche KingLouie das grad umzusetzen und muss erschüttert feststellen, dass der kram nicht funktioniert. die abbrucherkennung läuft wunderbar, wenn man eine lange ausgabe direkt in den browser schickt (also text-ausgabe). sobald das downloadfenster übernommen hat, (ich teste mit opera, mozilla und einem ie-clone) dann funktioniert das ganze nicht mehr.

habe nach diversen (fehl-)versuchen mit readfile, passthru, ausgabe-buffer etc. jetzt folgenden versuch am start:

PHP:
if( !($fh = fopen( $secretFolderPath.$fileName, "r" )) )
  downloadError( "Fehler beim Öffnen der Download-Datei." );
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header('Content-Description: File Transfer');
header('Content-Type: application/octed-stream');
header('Content-Length: '.@filesize($secretFolderPath.$fileName));
header("Content-Disposition: attachment; filename=".$fileName);
header("Content-Transfer-Encoding: binary");

while( true ) {
   echo fgets($fh, 4096);
   if( feof($fh) )              break;
   if( connection_status()!=0 ) break;
}
fclose ($fh);
closeDownload();

downloadError ist ne formatierte meldung dann exit();
closeDownload schreibt das checkfile zurück

die schleife versuche ich, damit ich über connection_status abfragen kann.

funktioniert natürlich auch nicht, obwohls soooooo schön aussieht *grmpf*
hat jemand noch ne idee dazu ?