Avatar billede dimsushi Nybegynder
30. august 2006 - 13:29 Der er 9 kommentarer og
1 løsning

Flere download servere

Hejsa :)

Jeg er blevet spurgt om jeg kan lave et downloadsystem for en side. Hermed mener jeg at de har 2 downloadservere. De vil gerne have det sådan at når folk trykker 'download' skal den skifte til server nummer 2, hvis den første ikke svarer indenfor fx 5 sek. Hvis server nummer 2 så ikke svarer efter 5 sek skal den prøve server et igen i 10 sek osv. Er det noget som er muligt? Jeg er helt lost på det så håber på lidt hjælp fra jer eksperter. :)
Avatar billede coderdk Praktikant
30. august 2006 - 13:45 #1
http://dk.php.net/fsockopen - sæt timeout, lav et HTTP request evt. bare HEAD / HTTP/1.0 - Hvis den svarer kan du bruge serveren, ellers prøv en anden ;P
Avatar billede dimsushi Nybegynder
30. august 2006 - 14:16 #2
Noget ala?
<?php
$fp = fsockopen("www.server1.com/files/something.exe", 80, $errno, $errstr, 5);
if (!$fp) {
  // Vi skal have fat i server 2
  $fp = fsockopen("www.server2.com/files/something.exe", 80, $errno, $errstr, 5);
  if (!$fp) {
      // Vi skal tilbage til server 1 igen....
      echo "$errstr ($errno)<br />\n";
  } else {
      Download kode til filen
      /*$out = "GET / HTTP/1.1\r\n";
      $out .= "Host: www.example.com\r\n";
      $out .= "Connection: Close\r\n\r\n";

      fwrite($fp, $out);
      while (!feof($fp)) {
            echo fgets($fp, 128);
      }
      fclose($fp);*/
    }
} else {
  Download kode til filen
  /*$out = "GET / HTTP/1.1\r\n";
  $out .= "Host: www.example.com\r\n";
  $out .= "Connection: Close\r\n\r\n";

  fwrite($fp, $out);
  while (!feof($fp)) {
      echo fgets($fp, 128);
  }
  fclose($fp);*/
}
?>

Fanger ikke helt det fwrite mv. Er det noget jeg skal bruge? :)
Avatar billede coderdk Praktikant
30. august 2006 - 14:23 #3
Nej, du kan jo egentlig bare nøjes med fsockopen og dets timeout :)
Der hvor du har // Download kode til filen - Der ville jeg lave en "download ticket" som  og så redirecte til et PHP-script på downloadserveren som så checker at den ticket er gyldig - hvorefter downloaden starter...
Avatar billede dimsushi Nybegynder
30. august 2006 - 14:32 #4
Kan du måske uddybe det du mener med en download ticket? Der tabte du mig lidt må jeg indrømme. :)
Avatar billede coderdk Praktikant
30. august 2006 - 14:49 #5
F.eks.:

$time = time();
$ticket = $time . ":" . md5( md5( $time . "hemmelig nøgle" ) );
header( "location: http://server2.com/download.php?file=filen.exe&ticket=$ticket" );

på downloadserveren kan du så:

list( $time, $ticket ) = split( ":", $_GET['ticket'] );
$file = $_GET['file'];
if ( $ticket != md5( md5( $time . "hemmelig nøgle" ) ) )
{
  die( "Invalid download ticket, try downloading the file again." );
}

if ( strtotime( "+10 minutes", $time ) < time() )
{
  die( "Download ticket is too old, try downloading the file again." );
}

header( 'Content-Type: application/x-msdownload' );
header( 'Content-Length: ' . filesize( $file ) ) );
echo file_get_contents( $file );
Avatar billede dimsushi Nybegynder
30. august 2006 - 15:03 #6
Må jeg spørge hvad fordelen er ved at bruge sådan et ticket system? Smid bare et svar forresten. Du fortjerner dine point. Kan jo altid spørge videre hvis jeg finder på mere. Mange tak. :)
Avatar billede coderdk Praktikant
30. august 2006 - 15:10 #7
Well, Boomtown (www.boomtown.net) bruger det f.eks. til et køsystem med separate køer til deres gratis- og betalende medlemmer - Hvis du ikke har brug for sådan noget, og hvis du ikke har noget imod at folk kan linke direkte til www.server2.com/files/something.exe så er det jo fint - i øvrigt, så lige din fsockopen er forkert :)

$fp = fsockopen("www.server1.com/files/something.exe", 80, $errno, $errstr, 5);

skal være:

$fp = fsockopen("www.server1.com", 80, $errno, $errstr, 5);

Her tester den om der er liv i serveren, hvis du vil vide om du kan få fat i filen:

fwrite( $fp, "HEAD /files/something.exe HTTP/1.0\nHost: www.server1.com\nConnection: Close\n\n" );
$cnt = '';
while ( !feof( $fp ) )
{
  $cnt .= fread( $fp, 1024 );
}
$ok = preg_match( "/200 OK/", $cnt );

eller lignende... :)
Avatar billede coderdk Praktikant
30. august 2006 - 15:11 #8
Glemte at uddybe: Hvis du ikke har noget imod at folk kan linke direkte til en fil på en af serverne, så bare smid: header("location: http://www.serverX.com/files/something.exe"); ind i stedet for alt det ticketfis :)
Avatar billede dimsushi Nybegynder
31. august 2006 - 12:41 #9
Lige et sidste spørgsmål. Kan du med ord fortælle hvad der sker fra fwrite og til slutningen? Returnerer $ok false hvis filen ikke kan nås og true hvis den kan nås? Mange tak. :)
Avatar billede coderdk Praktikant
31. august 2006 - 12:50 #10
fwrite requester filen, men uden rent faktisk at downloade den, fread-løkken læser serverens respons - i denne respons leder jeg efter 200 OK serveren giver hvis requestet lykkes, findes filen ikke svarer serveren med 404 NOT FOUND eller lignende - Så ja, $ok er sand hvis filen eksisterer :)
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