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

  • 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.....


  • #2
    Vielleicht hilft dir dieser Lösungsansatz:
    http://www.phpfriend.de/forum/ftopic49257.html

    Kommentar


    • #3
      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.

      Kommentar


      • #4
        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
        robo47.net - Blog, Codeschnipsel und mehr
        | Caching-Klassen und Opcode Caches in php | Robo47 Components - PHP Library extending Zend Framework

        Kommentar


        • #5
          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

          Kommentar


          • #6
            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
            robo47.net - Blog, Codeschnipsel und mehr
            | Caching-Klassen und Opcode Caches in php | Robo47 Components - PHP Library extending Zend Framework

            Kommentar


            • #7
              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

              Kommentar


              • #8
                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.

                Kommentar

                Lädt...
                X