php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 04.11.2005, 11:35  
Benutzer
 
Registriert seit: 27.12.2004
Beiträge: 62
Newan
Newan eine Nachricht über ICQ schicken
Standard 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 ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 04.11.2005, 12:43  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Vielleicht hilft dir dieser Lösungsansatz:
http://www.phpfriend.de/forum/ftopic49257.html
Zergling-new ist offline   Mit Zitat antworten
Alt 04.11.2005, 13:21  
Benutzer
 
Registriert seit: 27.12.2004
Beiträge: 62
Newan
Newan eine Nachricht über ICQ schicken
Standard

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.
Newan ist offline   Mit Zitat antworten
Alt 04.11.2005, 13:40  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

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 ist offline   Mit Zitat antworten
Alt 04.11.2005, 22:50  
Benutzer
 
Registriert seit: 27.12.2004
Beiträge: 62
Newan
Newan eine Nachricht über ICQ schicken
Standard

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:

Zitat:
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:
Zitat:
ne while-schleife mit den file-funktionen ist da wohl besser
Kannst du das kongretter fassen? Wäre nett. Danke im vorraus
Newan ist offline   Mit Zitat antworten
Alt 05.11.2005, 10:12  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

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 ist offline   Mit Zitat antworten
Alt 07.11.2005, 21:37  
Benutzer
 
Registriert seit: 27.12.2004
Beiträge: 62
Newan
Newan eine Nachricht über ICQ schicken
Standard

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
Newan ist offline   Mit Zitat antworten
Alt 09.11.2005, 14:11  
Benutzer
 
Registriert seit: 27.12.2004
Beiträge: 62
Newan
Newan eine Nachricht über ICQ schicken
Standard

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.
Newan ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Datei auf FTP-Server ändern ohne lokal abzuspeichern faux PHP-Fortgeschrittene 11 02.09.2005 11:54

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
readfile blockiert php

Alle Zeitangaben in WEZ +2. Es ist jetzt 20:51 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.