kostenloser Webspace werbefrei: lima-city


Download Kontrolle

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    s******2

    Abend,
    Ich möche in meinem CMS eine Download Sektion einführen.

    Da es sich eher um größere Dateien handelt und ich damit rechne sehr viele Downloader gleichzeitig zu bekommen, möschte ich eine Funktion einführen die überprüft, wie viele Leute gerade eine Datei vom Server laden.

    Also wenn zb. 50 gleichzeit laden, sollen alle die auch noch laden wollen, geblockt oder auf einen anderen mirrow weitergeleitet werden.

    Ich hab aber keine Ahnung ob so etwas mit Php überhaupt realiesierbar ist.

    mfg Skar1212
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. ist ein bisschen tricky, aber möglich,
    ich würde dazu 2 Dateien erstellen:
    1. temp-speicher.php, diese Datei speichert, wie viele Leute gerade, eine Datei herunterladen, außerdem noch, welche Downloads es überhaupt gibt:
    <?php
    $downloads = array();
    // ein kleines Beispiel: ADRESSE, ANZAHL_DOWNLOADS, MIRROR
    $downloads['gif-bild.gif'] = array('./downloads/gif-bild.gif', 0, 'http://mirror.example.com/gif-bild.gif');
    ?>

    2. download.php, diese Datei leitet auf die resource um, bzw. wenn die Datei bereits zu oft runtergeladen wird, leitet sie auf einen mirror um:
    <?php
    // Wenn gar keine Resource angegeben ist,
    // Fehlermeldung ausgeben und abbrechen.
    if(!isset($_GET['download']) || empty($_GET['download']))
        die('Sie haben keine Datei angegeben,
             die sie herunterladen wollen.');
    
    // resouce in variable $file abspeichern
    $file = $_GET['download'];
    
    // resourcenverzeichnis holen
    require_once('temp-speicher.php');
    
    // falls die resource nicht im verzeichnis steht mit fehlermeldung
    // abbrechen
    if(!isse($downloads[$file]))
        die('Die Datei, die sie herunterladen wollen steht ihnen nicht
             zur verfügung!');
    
    // falls bereits mehr als 50 Leute die datei runterladen, an mirror
    // weiterleiten und beenden
    if($downloads[$file][1] > 50){
        header('Location: '.$downloads[$file][2]);
        exit();
    }
    
    // abbrechen vom user ignorieren, damit downloadzahl nicht nur steigt!
    ignore_user_abort(true);
    
    // downloadzahl erhöhen
    $downloads[$file][1]++;
    
    // und das verzeichnis aktualisieren
    $buffer = '<?php';
    foreach($downloads[$file] as $k => $v){
        $buffer.="\$downloads['$k']=array('{$v[0]}',{$v[1]},'{$v[2]}')\n";
    }
    $buffer .= '?>';
    file_put_contents('temp-speicher.php', $buffer);
    
    // dann die datei an den user senden
    readfile($downloads[$file][0]);
    
    // nachdem senden die downloadzahl wieder reduzieren
    // damit das passiert, ist es wichtig, das der user den download nicht 
    // abbrechen kann, darum s.o. ignore_user_abort(true)
    $downloads[$file][1]--;
    
    // und das verzeichnis erneut aktualisieren
    $buffer = '<?php';
    foreach($downloads[$file] as $k => $v){
        $buffer.="\$downloads['$k']=array('{$v[0]}',{$v[1]},'{$v[2]}')\n";
    }
    $buffer .= '?>';
    file_put_contents('temp-speicher.php', $buffer);
    ?>
  4. vampiresilence

    Kostenloser Webspace von vampiresilence

    vampiresilence hat kostenlosen Webspace.

    @nemoinho
    Eigtl nen recht hübsches Script, aber es behandelt nicht den Fall, dass ein Benutzer das Laden einfach abbricht (aus welchen Gründen auch immer). D.h. nach 50 abgebrochenen Downloads, sind die freien Slots auf 0 gesunken und der Download wird für alle nachfolgenden User unmöglich. Darüber hinaus geht die Variable $downloads nach Beendigung des Scripts verloren und fängt beim nächstem Download immer wieder bei 0 an. Sie müsste also durch einen Datenbankeintrag ersetzt werden, um dauerhaft zur Verfügung zu stehen.

    Ich würde es anders machen. Schematisch:
    1. Alle IPs mit Datum in eine Tabelle speichern.
    2. Bei jeder Downloadanfrage die Tabelle von Einträgen entfernen, die länger als (Dateigröße / ~ 50 KB/s) her sind.
    3. Bei einem mysql_num_rows() von < 50 den Download gestatten, oder andernfalls eben umleiten oder ablehnen.
    4. Bei abgeschlossenem Download, die IP sofort aus der Tabelle entfernen.

    Hinweis: Die IP muss in der Tabelle UNIQUE, wenn nicht sogar PRIMARY KEY sein.

    Erfordert zwar eine DB, aber die ist bei Lima ja schnell ersteigert (falls du nicht sowieso schon eine hast) und ist in der Umsetzung etwas simpler.

    Liebe Grüße
    - VampireSilence
  5. Autor dieses Themas

    s******2

    Also,
    ich habe mir das Download System so vorgestellt:

    Die File sind in dem Ordner "Downloads" gespeichert, der User kann bei Hochladen selbst ein Verzeichniss wählen, welches im Download Center dann auch angezeigt wird, also zb. Downloads -> Videos -> Kurzfilme -> Schikurs 2010.

    Jedes File, wird in der Datenbank "regestriert", da zu jedem, File bewertungen, Kommentare usw. angezeigt werden.

    Gut das hab ich erledigt (;

    Nun will ich aber nicht dass gleich 100 Gleichzeitig Downloaden können, sondern nur so um die 25.

    Ich weiß nicht wie ich das anstellen, soll, also kann man mit Php überhaupt kontrollieren, wann der User das File endgültig gedownloadet, oder abgebrochen hat.

    Ich habe schon ein kleines Script programmiert, das jedes mal wenn ein User etwas ladet, ein Counter erhöht wird, und nach ca. 2 Min wieder um 10 hinutner geht.

    Das ist aber nicht sinn und zweck, würde ich jetzt 50 mal auf den Download Link klicken und jedes mal, wieder abbrechen, wäre der Counter schnell erreicht, was anderen Usern gegenüber unfair währe. Ganszuschweige, ein super angriffs Punkt, für Spammer.
  6. @vampiresilence du hast dir offensichtlich meine Lösung nicht durchgelesen, beziehungsweise, du hast sie nicht verstanden,
    darum beschreibe ich sie dir nochmal:
    - zuerst ein paar absicherungen...
    - danach ignore_user_abort, damit ignoriert der Server ein abbrechen des Ladevorgangs!
    - dann wird die Downloadzahl erhöht und zurück in die Datei geschrieben, somit bekommt ein später zugreifendes Skript auch die veränderte Zahl!
    - erst wenn das passiert ist startet der download
    - und danach wird die downloadzahl wieder verringert und ebenfalls zurück in die Datei geschrieben...

    Eine Lösung mit mysql ist zwar sinnvoll, aber nicht notwendig.
    Außerdem ist die Variante mit der geschätzten Downloadzahl 1.) nicht sehr elegant und 2.) sehr ungenau, ein Umstand der bei meiner Variante nicht gegeben ist!

    @skar1212 das was du willst ist eine komplette Lösung, die werde ich hier aber bestimmt nicht so mir nichts dir nichts posten, da das auch schon umfangreicher sein kann, zumal es bestimmt auch schon fertige und gute "Downloadscripte" im Netz gibt!
  7. Autor dieses Themas

    s******2


    @skar1212 das was du willst ist eine komplette Lösung, die werde ich hier aber bestimmt nicht so mir nichts dir nichts posten, da das auch schon umfangreicher sein kann, zumal es bestimmt auch schon fertige und gute "Downloadscripte" im Netz gibt!


    Sorry, wenn du das falsch aufgefasst haben solltest.
    Ich wollte kein fertiges Download Script haben, sondern einfach nur informationen oder Tipps wie ich dieses Problem lösen kann.

    Etwa ob ich kontrollieren, kann wenn ein user einen Download, fertigstellt oder abbricht!

    mfg
    Skar1212
  8. Um es kurz und schmerzvoll zu machen: Geht nicht.

    Du kannst nur feststellen, ob eine HTTP-Verbindung aufgebaut wurde, nicht aber, ob der Download abgebrochen wurde.
  9. Autor dieses Themas

    s******2

    fabo schrieb:
    Um es kurz und schmerzvoll zu machen: Geht nicht.

    Du kannst nur feststellen, ob eine HTTP-Verbindung aufgebaut wurde, nicht aber, ob der Download abgebrochen wurde.

    Ok, danke!

    Allerdings frage ich mich dann, wie es die Leute von http://www.worldofplayers.de das geschafft haben?

    Beitrag zuletzt geändert: 17.6.2010 20:31:13 von skar1212
  10. vampiresilence

    Kostenloser Webspace von vampiresilence

    vampiresilence hat kostenlosen Webspace.

    nemoinho schrieb:
    @vampiresilence du hast dir offensichtlich meine Lösung nicht durchgelesen, beziehungsweise, du hast sie nicht verstanden,
    darum beschreibe ich sie dir nochmal:
    - zuerst ein paar absicherungen...
    - danach ignore_user_abort, damit ignoriert der Server ein abbrechen des Ladevorgangs!
    - dann wird die Downloadzahl erhöht und zurück in die Datei geschrieben, somit bekommt ein später zugreifendes Skript auch die veränderte Zahl!
    - erst wenn das passiert ist startet der download
    - und danach wird die downloadzahl wieder verringert und ebenfalls zurück in die Datei geschrieben...


    Gut, das mit dem Speichern habe ich überlesen, trotzdem bietet ignore_user_abort() nicht die Möglichkeit, sich der max_execution_time zu widersetzen und wenn du per PHP die Daten rüberschiebst, wirst du diese erreichen. Wenn du Pech hast, sitzt der User danach sogar auf dem Trockenen und der Download bricht einfach ab.

    skar1212 schrieb:
    Allerdings frage ich mich dann, wie es die Leute von http://www.worldofplayers.de das geschafft haben?


    Die haben vermutlich Root-Zugriff, damit ist schon einiges mehr möglich, wenn man will. Damit kannste sogar BluRays brennen, oder nen Netzwerkdrucker remote was ausspucken lassen, aber das nur am Rande. Wie fabo schon sagte, ist es ohne aber bisher nicht möglich. Die allseits beliebten EventHandler sind für PHP scheinbar am Kommen, aber noch ist für dein Problem nichts Brauchbares dabei.

    Liebe Grüße
    - VampireSilence

    Beitrag zuletzt geändert: 18.6.2010 0:20:50 von vampiresilence
  11. Vielleicht lässt sich da doch was machen.. Ich habe gerade mal dies gefunden und im Prinzip ist das garkein schlechter Ansatz.
  12. Autor dieses Themas

    s******2

    vampiresilence schrieb:
    Die haben vermutlich Root-Zugriff, damit ist schon einiges mehr möglich, wenn man will. Damit kannste sogar BluRays brennen, oder nen Netzwerkdrucker remote was ausspucken lassen, aber das nur am Rande. Wie fabo schon sagte, ist es ohne aber bisher nicht möglich. Die allseits beliebten EventHandler sind für PHP scheinbar am Kommen, aber noch ist für dein Problem nichts Brauchbares dabei.


    Danke! Was man alles mit Apache machen kann^^

    fabo schrieb: Vielleicht lässt sich da doch was machen.. Ich habe gerade mal dies gefunden und im Prinzip ist das garkein schlechter Ansatz.


    Interessant, werds mir mal ansehen, allerdings wollte ich das je mit einer DB machen. Die brauch ich sowieso, da ich ja beschreibungen machen will!
  13. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!