Ankündigung

Einklappen
Keine Ankündigung bisher.

Donload Mirror mit begrenzter Useranzahl pro Datei bauen!

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Newan
    hat ein Thema erstellt Donload Mirror mit begrenzter Useranzahl pro Datei bauen!.

    Donload Mirror mit begrenzter Useranzahl pro Datei bauen!

    Hallo,

    ich bin schon seid längerem auf der suche nach einer passenden Idee für ein Download Mirror.
    Dieser Mirror sollte die Funktion haben das die Anzahl der User die eine Datei ziehen begrenzt sein soll. Nur wie bekomme ich mit wieviele User die Datei am ziehen sind ? O.k ich würde mitbekommen wieviele auf den Link bzw. Button klicken. Dann weiß ich aber immer noch nicht wieviele Fertig sind oder noch schlimmer wieviele den Download abgebrochen haben.

    Beim Apache Webserver hab ich auch keine Logdatei gefunden die mir sagt wie weit der Download ist oder wer fertig ist. Hier finde ich nur eine wodrin steht das der Downlaod gestartet wurde aber das reicht ja nicht ganz aus.

    Die zweite Möglickeit wäre dies über einen FTP mit max. User zu machen. finde das aber irgendwie unglücklich.

    Welche Ideen habt ihr den noch zu dem Problem?

    Bin über jedes Statement dankbar.....

  • Newan
    antwortet
    Hallo und danke nochmal...ich hab es soweit hinbekommen:


    Code:
    <?
    /*
    CREATE TABLE `downloadmirror` (
    `nlfddownloadmirror` INT NOT NULL AUTO_INCREMENT ,
    `nlfddownload` INT NOT NULL ,
    `dtdownload` TIMESTAMP NOT NULL ,
    `sIp` VARCHAR( 15 ) NOT NULL ;
    `nbeendet` INT DEFAULT '0' NOT NULL ,
    `dtdownloadstart` TIMESTAMP NOT NULL ;
    PRIMARY KEY ( `nlfddownloadmirror` )
    );
    */
    
    function download($str_file, $num_throttle, $num_update_time)
      {
      global $con;
      //Insert in die Datenbank für User
      $query = "INSERT INTO downloadmirror (dtdownload, sIp, dtdownloadstart) VALUES (".time().", '".$_SERVER['REMOTE_ADDR']."', ".time().") ";
      $res = mysql_query($query, $con) OR DIE (mysql_error());
      $num_nlfddownloadmirror = mysql_insert_id();
      header("Content-Type: application/octet-stream");
      header("Content-Disposition: attachment; filename=\"$file\"");
      header('Cache-Control: no-cache');
      header('Pragma: no-cache');
      header('Expires: 0');
      header('Content-Length: '.(string)(filesize($str_file)));
      $fp=fopen($str_file,'rb');
      var_dump($str_file);
      $num_max_update_Time = time() + $num_update_time;
      sleep(1);
      while(!feof($fp))
        {
        $num_line++;
        $str_buffer = fread($fp, 1024*$num_throttle);
        print $str_buffer;
        // User abgleichen
        echo time().":".$num_max_update_Time."
    ";
        if(time()>=$num_max_update_Time)
          {
          $num_max_update_Time = time() + $num_update_time;
          //Datenbankupdate...muss noch eingebaut werden
          $query = "Update downloadmirror set dtdownload = ".time()." where nlfddownloadmirror = ".$num_nlfddownloadmirror." ";
          $res = mysql_query($query, $con) OR DIE (mysql_error());
          }
        }
      fclose($fp);
      //Download zu ende und Hacken setzen
      $query = "Update downloadmirror set nbeendet = 1 where nlfddownloadmirror = ".$num_nlfddownloadmirror." ";
      $res = mysql_query($query, $con) OR DIE (mysql_error());
      }
    
    // Master Variabelen
    $num_max_user = 5;      // <- maximale Anzahl der User für einen Download
    set_time_limit(0);      // <- TimeLimit auf unendlich setzen (Das dauert mit so einem Download ;-))
    $num_throttle = 2;      // <- kb/s
    $str_free = false;      // <- Allgemein erst mal blockieren
    $str_user_off = true;   // <- User nicht vorhanden
    $num_nlfddownload = 1;  // <- Debugwert (!!!!!!!!!!!!!Muss noch raus hier!!!!!!!!!!!!!)
    $num_update_time = 1;   // <- Max idle für User, ab dann gilt er als tot , in Sek.
    $num_max_waittime = 30;  // <- Zeit bis Download wieder freigegen wird
    
    // Datenbankconnect
    $host = "localhost";
    $user = "weberj";
    $pass = "jens";
    $database = "test";
    $con = @mysql_connect($host, $user, $pass) OR DIE ("
    
    Entschuldigung der Datentenbestand wird zur Zeit aktualisiert</p>");
    mysql_select_db($database, $con) OR DIE ("
    
    Entschuldigung der Datentenbestand wird zur Zeit aktualisiert</p>");
    
    //Download raussuchen
    $str_sql  = "SELECT ";
    $str_sql .= "  sdownloadnr ";
    $str_sql .= "FROM ";
    $str_sql .= "  download ";
    $str_sql .= "WHERE ";
    $str_sql .= "  nlfddownload = ".$num_nlfddownload." ";
    $result = mysql_query($str_sql);
    while ($row = mysql_fetch_array($result))
      {
      //File auswählen
      $str_file= $row['sdownloadnr'];
      }
    mysql_free_result($result);
    
    //Select was raussucht wieviele Leute die datei am ziehen sind
    $str_sql  = "SELECT ";
    $str_sql .= "  nlfddownloadmirror ";
    $str_sql .= "FROM ";
    $str_sql .= "  downloadmirror ";
    $str_sql .= "WHERE ";
    $str_sql .= "  nlfddownload = ".$num_nlfddownload." ";
    $str_sql .= "AND  ";
    $str_sql .= "  dtdownload >= ".time() + $num_max_waittime." ";
    $result = mysql_query($str_sql);
    while ($row = mysql_fetch_array($result))
      {
      $num_vorhanden++;
      }
    mysql_free_result($result);
    
    //Select was raussucht ob die Ip schon ein Download zieht
    $str_sql  = "SELECT ";
    $str_sql .= "  nlfddownloadmirror ";
    $str_sql .= "FROM ";
    $str_sql .= "  downloadmirror ";
    $str_sql .= "WHERE ";
    $str_sql .= "  sIP = '".$_SERVER['REMOTE_ADDR']."' ";
    $str_sql .= "AND ";
    $str_sql .= "  nbeendet = 0 ";
    $result = mysql_query($str_sql);
    while ($row = mysql_fetch_array($result))
      {
      $str_user_off = false;
      }
    mysql_free_result($result);
    
    if($num_vorhanden < $num_max_user && $str_user_off = true)
      {
      //Wenn noch ein Platz frei Variabele $str_free füllen
      $str_free = true;
      }
    //Wenn User für Downlaod frei ist!!!!
    if($str_free == true)
      {
      //Download aufrufen
      download($str_file, $num_throttle, $num_update_time);
      }
    else
      {
      echo "Der Dateimirror ist zur Zeit schon voll!!!";
      }
    ?>
    Ich übernehme keine Garantie das es läuft...muss nämlich jetzt ersteinmal anfangen mit dem testen.........aber ich denke es sieht schon ganz gut aus.

    Einen Kommentar schreiben:


  • Newan
    antwortet
    vielen dank für die mühe.....

    ich werd mich mal dransetzen und es versuchen in ein script nach meinen wünschen umzusetzen.

    Falls ich auf weitere Probleme stoßen sollte melde ich mich nochmal. Die idee zumindest ist sehr gut.


    Big THX

    Einen Kommentar schreiben:


  • robo47
    antwortet
    ich hab doch gesagt nicht readfile, sondern die file-funktionen

    fopen
    fgets
    fclose ...

    und das fgets / freads in der schleife benutzen

    jenachdem wie viel du pro schleifendurchlauf ausliest, kannst du hier sogar noch die geschwindigkeit regulieren mit der maximal runtergeladen wird.

    da findest du beispielcode:
    -> http://www.phpfriend.de/forum/ftopic37147-0.html

    mfg
    robo47

    Einen Kommentar schreiben:


  • Newan
    antwortet
    o.k o.k......

    hab es nochmal gelesen. Nur irgendwie hab ich deine Antwort noch nicht ganz verstanden.

    Das man ne schleiße macht und mit der 30 Sekunden Klausel ja das ist gut so nur wie sollte die Bedingung dafür aussehen?

    Code:
    while (readfile('test.mp3')!=filesize('test.mp3'))
     {
     //DBStatement!
     }
    Ich komm dadrauf weil in der Doku steht:

    Gibt die Anzahl der gelesenen Bytes einer Datei zurück
    Nur bei mir gibt das ne fette Endlosschleiße. Achso habe noch PHP4.x kein 5.
    Was meinst du den genau mit:
    ne while-schleife mit den file-funktionen ist da wohl besser
    Kannst du das kongretter fassen? Wäre nett. Danke im vorraus

    Einen Kommentar schreiben:


  • robo47
    antwortet
    vieleicht erstmal readfile im manual anschauen, in php5 ist es unter umständen buggy, 2tens verbraucht es viel speicher, ne while-schleife mit den file-funktionen ist da wohl besser und dann kannst du bei jedem schleifendurchlauf auch die tabelle aktualisieren, wenn seit mehr als 30 sekunden ein eintrag nicht mehr geupdatet wurde -> gilt er als tot

    Einen Kommentar schreiben:


  • Newan
    antwortet
    Ja das hab ich auch alles...nur müsste man das ja noch eweitern so das z.b die header ausgabe und readfile(); nur aufgerufen werden wenn weniger als z.b 5 Benutzer in der Tabelle x stehen.

    Wenn der Download fertig ist oder abgebrochen wird trage ich den benutzer wieder aus Tabelle x aus. Soweit so gut, da muss ich aber noch wissen wie ich mitbekomme wann der Download fertig ist und wann nicht. Den readfile läuft soweit wie ich das mitbekommen hab (getestet usw.) asyncron...das heißt mein script läuft durch und hält nicht so lange an bis der download durch ist.

    Einen Kommentar schreiben:


  • Zergling-new
    antwortet
    Vielleicht hilft dir dieser Lösungsansatz:
    http://www.phpfriend.de/forum/ftopic49257.html

    Einen Kommentar schreiben:

Lädt...
X