Dit is een topic in Community » Forum » Pro » Web ontwikkeling

load balancing / mirror distibutie via PHP

Sad op 28 juni 2005 #

Stel ik heb dezelfde file op 2 verschillende servers staan: http://server1.com/mijnbestand.zip http://server.nl/mijnbestand.zip Tevens heb ik een download pagina op een andere server: http://server80.org/download.php Nu wil ik er voor zorgen dat bezoekers gewoon naar http://server80.org/download.php kunnen gaan en daar op een linkje klikken. Het download.php script moet er dan voor zorgen dat de bezoekers gelijkmatig verdeeld worden over de 2 mogelijke download URL's, zonder dat ze verder zelf lastig gevallen worden met het feit dat er eigenlijk 2 mirrors zijn om de bandbreedte te verdelen. Hoe moet ik zoiets bouwen? Op zich is een random verdeling voldoende (zolang de random waarde echt random is en niet mogelijk telkens dezelfde waarde oplevert). Hoe zorg ik ervoor dat de gebruiker op een link klikt en dan de juiste file voor zijn kiezen krijgt?

bartv

bartv op 28 juni 2005 #

Zoiets als dit misschien? (ongeteste code) <? if( rand(0,1) ) { header( 'location: http://server1/bestand.zip' ); } else { header( 'location: http://server2/bestand.zip' ); } ?>

hydro

hydro op 29 juni 2005 #

Bij Mammoet Software gebruiken we deze code om te bekijken welke download-mirror online is, uit de servers welke online zijn wordt vervolgens een random download-locatie gegenereerd, met wat aanpassingen kun je dit script makkelijk gebruiken. <?php // RANDOM DOWNLOADER v0.1 // (C)Copyright 2005 Mammoet Software. Alle Rechten Voorbehouden. // Door André Kemmeren en Lex Nicolaes function download($mode) { switch( $mode ) { // BACKPACK MAC OS X case 'backpack_macosx': $_GET['ip']="www.misterme-hosting.nl:80"; $array=explode(':',$_GET['ip']); $fp = @fsockopen($array[0], $array[1], $errno, $errstr,1); if($fp){ $url[0] = 'http://www.misterme-hosting.nl/mammoet/backpack.dmg'; fclose($fp); } // TWEEDE DOWNLOAD LOCATIE $_GET['ip']="www.backpack.darwinist.nl:80"; $array=explode(':',$_GET['ip']); $fp = @fsockopen($array[0], $array[1], $errno, $errstr,1); $VALID_URLS = array(); if($fp){ $url[1] = 'http://www.backpack.darwinist.nl/backpack.dmg'; fclose($fp); } // DERDE DOWNLOAD LOCATIE $_GET['ip']="members.lycos.nl:80"; $array=explode(':',$_GET['ip']); $fp = @fsockopen($array[0], $array[1], $errno, $errstr,1); $VALID_URLS = array(); if($fp){ $url[2] = 'http://www.members.lycos.nl/backpackdwn/backpack.dmg'; fclose($fp); } // VIERDE DOWNLOAD LOCATIE $_GET['ip']="www.zcvalkenburg.nl:80"; $array=explode(':',$_GET['ip']); $fp = @fsockopen($array[0], $array[1], $errno, $errstr,1); $VALID_URLS = array(); if($fp){ $url[3] = 'http://www.zcvalkenburg.nl/mammoet/backpack.dmg'; fclose($fp); } $backup = "http://www.backpack-online.nl/backpack.dmg"; break; // BACKPACK WINDOWS case 'backpack_windows': $_GET['ip']="www.misterme-hosting.nl:80"; $array=explode(':',$_GET['ip']); $fp = @fsockopen($array[0], $array[1], $errno, $errstr,1); if($fp){ $url[0] = 'http://www.misterme-hosting.nl/mammoet/backpack.zip'; fclose($fp); } // TWEEDE DOWNLOAD LOCATIE $_GET['ip']="www.backpack.darwinist.nl:80"; $array=explode(':',$_GET['ip']); $fp = @fsockopen($array[0], $array[1], $errno, $errstr,1); $VALID_URLS = array(); if($fp){ $url[1] = 'http://www.backpack.darwinist.nl/backpack.zip'; fclose($fp); } // DERDE DOWNLOAD LOCATIE $_GET['ip']="members.lycos.nl:80"; $array=explode(':',$_GET['ip']); $fp = @fsockopen($array[0], $array[1], $errno, $errstr,1); $VALID_URLS = array(); if($fp){ $url[2] = 'http://www.members.lycos.nl/backpackdwn/backpack.zip'; fclose($fp); } // VIERDE DOWNLOAD LOCATIE $_GET['ip']="www.zcvalkenburg.nl:80"; $array=explode(':',$_GET['ip']); $fp = @fsockopen($array[0], $array[1], $errno, $errstr,1); $VALID_URLS = array(); if($fp){ $url[3] = 'http://www.zcvalkenburg.nl/mammoet/backpack.zip'; fclose($fp); } $backup = "http://www.backpack-online.nl/backpack.zip"; break; // XCLIP (Mac OS X) case 'xclip': $_GET['ip']="www.misterme-hosting.nl:80"; $array=explode(':',$_GET['ip']); $fp = @fsockopen($array[0], $array[1], $errno, $errstr,1); if($fp){ $url[0] = 'http://www.misterme-hosting.nl/mammoet/xclip/Xclip.dmg'; fclose($fp); } // TWEEDE DOWNLOAD LOCATIE $_GET['ip']="www.backpack.darwinist.nl:80"; $array=explode(':',$_GET['ip']); $fp = @fsockopen($array[0], $array[1], $errno, $errstr,1); $VALID_URLS = array(); if($fp){ $url[1] = 'http://www.backpack.darwinist.nl/xclip/Xclip.dmg'; fclose($fp); } // DERDE DOWNLOAD LOCATIE $_GET['ip']="members.lycos.nl:80"; $array=explode(':',$_GET['ip']); $fp = @fsockopen($array[0], $array[1], $errno, $errstr,1); $VALID_URLS = array(); if($fp){ $url[2] = 'http://www.members.lycos.nl/backpackdwn/xclip/Xclip.dmg'; fclose($fp); } // VIERDE DOWNLOAD LOCATIE $_GET['ip']="www.zcvalkenburg.nl:80"; $array=explode(':',$_GET['ip']); $fp = @fsockopen($array[0], $array[1], $errno, $errstr,1); $VALID_URLS = array(); if($fp){ $url[3] = 'http://www.zcvalkenburg.nl/mammoet/xclip/Xclip.dmg'; fclose($fp); } $backup = "http://www.backpack-online.nl/xclip/Xclip.dmg"; break; } // KIES EEN DOWNLOADLOCATIE srand ((double)microtime()*1000000); $randomnum = rand(0, count($url)-1); //header ("Location: $url[$randomnum]"); if (!$url[$randomnum]) { $download = $backup; } else { $download = $url[$randomnum]; } return $download; } // ROEP 1 V/D VOLGENDE FUNCTIES OP: //download(backpack_macosx); //download(backpack_windows); //download(xclip); ?> De code van bartv werkt overigens ook wel (enigszins).

remier

remier op 29 juni 2005 #

Als het heeel makkelijk moet zijn, zou ik gewoon twee bestanden aanmaken server1.com_mijnbestand.zip.count server.nl_mijnbestand.zip.count als iemand dan op download klikt lees je voor beide bestanden het count bestand in hierin staat een getal van hoeveel keer het bestand gedownload is. Als de count van server1 dan bv. op 10 staat en die van server.nl op 6 dan pak je de laatste.... en verhoog je de count met 1. denk dat je wel begrijp wat ik bedoel. De teller loopt zo wel op, maar als je die telkens tegen elkaar vergelijkt: download.php // lees de twee count bestanden in , waardes -> $count_server1& $count_server2 if ($count_server1 >= $count_server2) then { $count_server2++; // pak server2 bestand } else { $count_server1++; // pak server 1 bestand }

Sad op 29 juni 2005 #

okee bedankt ik ga beide opties eens uitproberen

Je kunt alleen reageren met een gratis OMT account.
Log in of registreer.

Inloggen

Over dit topic

Gestart op 28 juni 2005 door Sad

Laatste reactie door Sad

Reageer op dit topic