Avatar billede bgo Nybegynder
23. februar 2007 - 17:30 Der er 5 kommentarer og
1 løsning

Begrænsning af båndbredde

Jeg har en formodning om, at det ikke er muligt at begrænse hastigheden på copy(), men hvis det er muligt, vil jeg meget gerne vide hvordan, da jeg har nogle vitale XML-downloads der desværre ofte stjæler al båndbredde
Avatar billede coderdk Praktikant
23. februar 2007 - 18:21 #1
brug fopen/fread/fclose og sæt sleep() ind ;)
Avatar billede bgo Nybegynder
24. februar 2007 - 03:31 #2
årh, den skulle jeg da have tænkt på ;) Rejser dog et par andre spørgsmål, som jeg lige checker for på php.net før jeg spørger her ;)
Avatar billede bgo Nybegynder
24. februar 2007 - 04:14 #3
Jeg fik svar på nogle spørgsmål, men ikke dette:

Jeg ved at hastigheden en sjælden gang imellem er nedsat, hvilket gør en halv times download til en times download. Her er det så ikke nødvendigt at jeg nedsætter hastigheden kunstigt. Nu kan det så godt være at det bliver lidt kompliceret, men hvordan måler jeg hastigheden, således at jeg kan styre sleep (usleep, hvis den virker på windows til min version af php)?
Avatar billede coderdk Praktikant
24. februar 2007 - 12:09 #4
Du gemmer starttiden ( time() ) og i dit loop henter du en ny tid og trækker den gamle fra - Så har du antallet af sekunder siden starten. Så regner du ud hvad gennemsnitshastigheden er (strlen på resultatet af fread() akkumuleret) og justerer...
Kode til illustration:

$start = time();
$bytes = 0;
$data = '';
while ( !feof( $fp ) )
{
  $data .= fread( $fp, 1024 );
  if ( strlen( $data ) / ( time() - $start ) > 5000 )
  {
      sleep( 1 );
  }
}

Den skulle gerne lave en pause hvis hastigheden bliver over 5000 bytes/sekund....
Avatar billede bgo Nybegynder
25. februar 2007 - 16:26 #5
takker mange gange :)
Avatar billede bgo Nybegynder
27. februar 2007 - 15:58 #6
Fik det iøvrigt til at blive til denne:

function download ($file_source, $file_target){
      $start = time();
    $messspeed=0;
    $maxspeed=50*1024;
      if (($rh = fopen($file_source, 'rb')) === FALSE) { return false; }
      if (($wh = fopen($file_target, 'wb')) === FALSE) { return false; }
      while (!feof($rh)){
        $messspeed+=1024;
        if ( $messspeed / ( time() - $start ) > $maxspeed ){
            sleep( 1 );
        }
        if (fwrite($wh, fread($rh, 1024)) === FALSE) { fclose($rh); fclose($wh); return false; }
      }
   
      fclose($rh);
      fclose($wh);
      return true;
}

Kan ikke have flere GB i hukommelsen, og foretrækker desuden at skrive det læste ud i destinationsfilen med det samme, så din "$data .= fread( $fp, 1024);" blev til "$messspeed+=1024;" som så blev brugt i if-conditionen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester