load balancing / mirror distibutie via PHP

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?

Zoiets als dit misschien? (ongeteste code)

[code:1:ffefebe418]
<?
if( rand(0,1) )
{
header( ‘location: http://server1/bestand.zip’ );
} else {
header( ‘location: http://server2/bestand.zip’ );
}
?>
[/code:1:ffefebe418]

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. [code:1:353a0f5626] <?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'&#58;
			  $_GET&#91;'ip'&#93;=&quot;www.misterme-hosting.nl&#58;80&quot;;
            $array=explode&#40;'&#58;',$_GET&#91;'ip'&#93;&#41;;
            $fp = @fsockopen&#40;$array&#91;0&#93;, $array&#91;1&#93;, $errno, $errstr,1&#41;;
            if&#40;$fp&#41;&#123;
            $url&#91;0&#93; = 'http&#58;//www.misterme-hosting.nl/mammoet/backpack.zip';
            fclose&#40;$fp&#41;;
            &#125;
            // TWEEDE DOWNLOAD LOCATIE
            $_GET&#91;'ip'&#93;=&quot;www.backpack.darwinist.nl&#58;80&quot;;
            $array=explode&#40;'&#58;',$_GET&#91;'ip'&#93;&#41;;
            $fp = @fsockopen&#40;$array&#91;0&#93;, $array&#91;1&#93;, $errno, $errstr,1&#41;;
            $VALID_URLS = array&#40;&#41;;
            if&#40;$fp&#41;&#123;
            $url&#91;1&#93; = 'http&#58;//www.backpack.darwinist.nl/backpack.zip';
            fclose&#40;$fp&#41;;
            &#125;
            // DERDE DOWNLOAD LOCATIE
            $_GET&#91;'ip'&#93;=&quot;members.lycos.nl&#58;80&quot;;
            $array=explode&#40;'&#58;',$_GET&#91;'ip'&#93;&#41;;
            $fp = @fsockopen&#40;$array&#91;0&#93;, $array&#91;1&#93;, $errno, $errstr,1&#41;;
            $VALID_URLS = array&#40;&#41;;
            if&#40;$fp&#41;&#123;
            $url&#91;2&#93; = 'http&#58;//www.members.lycos.nl/backpackdwn/backpack.zip';
            fclose&#40;$fp&#41;;
            &#125;
            // VIERDE DOWNLOAD LOCATIE
            $_GET&#91;'ip'&#93;=&quot;www.zcvalkenburg.nl&#58;80&quot;;
            $array=explode&#40;'&#58;',$_GET&#91;'ip'&#93;&#41;;
            $fp = @fsockopen&#40;$array&#91;0&#93;, $array&#91;1&#93;, $errno, $errstr,1&#41;;
            $VALID_URLS = array&#40;&#41;;
            if&#40;$fp&#41;&#123;
            $url&#91;3&#93; = 'http&#58;//www.zcvalkenburg.nl/mammoet/backpack.zip';
            fclose&#40;$fp&#41;;
            &#125;
            $backup = &quot;http&#58;//www.backpack-online.nl/backpack.zip&quot;;
		break;
		
	// XCLIP &#40;Mac OS X&#41;
	case 'xclip'&#58;
			  $_GET&#91;'ip'&#93;=&quot;www.misterme-hosting.nl&#58;80&quot;;
            $array=explode&#40;'&#58;',$_GET&#91;'ip'&#93;&#41;;
            $fp = @fsockopen&#40;$array&#91;0&#93;, $array&#91;1&#93;, $errno, $errstr,1&#41;;
            if&#40;$fp&#41;&#123;
            $url&#91;0&#93; = 'http&#58;//www.misterme-hosting.nl/mammoet/xclip/Xclip.dmg';
            fclose&#40;$fp&#41;;
            &#125;
            // TWEEDE DOWNLOAD LOCATIE
            $_GET&#91;'ip'&#93;=&quot;www.backpack.darwinist.nl&#58;80&quot;;
            $array=explode&#40;'&#58;',$_GET&#91;'ip'&#93;&#41;;
            $fp = @fsockopen&#40;$array&#91;0&#93;, $array&#91;1&#93;, $errno, $errstr,1&#41;;
            $VALID_URLS = array&#40;&#41;;
            if&#40;$fp&#41;&#123;
            $url&#91;1&#93; = 'http&#58;//www.backpack.darwinist.nl/xclip/Xclip.dmg';
            fclose&#40;$fp&#41;;
            &#125;
            // DERDE DOWNLOAD LOCATIE
            $_GET&#91;'ip'&#93;=&quot;members.lycos.nl&#58;80&quot;;
            $array=explode&#40;'&#58;',$_GET&#91;'ip'&#93;&#41;;
            $fp = @fsockopen&#40;$array&#91;0&#93;, $array&#91;1&#93;, $errno, $errstr,1&#41;;
            $VALID_URLS = array&#40;&#41;;
            if&#40;$fp&#41;&#123;
            $url&#91;2&#93; = 'http&#58;//www.members.lycos.nl/backpackdwn/xclip/Xclip.dmg';
            fclose&#40;$fp&#41;;
            &#125;
            // VIERDE DOWNLOAD LOCATIE
            $_GET&#91;'ip'&#93;=&quot;www.zcvalkenburg.nl&#58;80&quot;;
            $array=explode&#40;'&#58;',$_GET&#91;'ip'&#93;&#41;;
            $fp = @fsockopen&#40;$array&#91;0&#93;, $array&#91;1&#93;, $errno, $errstr,1&#41;;
            $VALID_URLS = array&#40;&#41;;
            if&#40;$fp&#41;&#123;
            $url&#91;3&#93; = 'http&#58;//www.zcvalkenburg.nl/mammoet/xclip/Xclip.dmg';
            fclose&#40;$fp&#41;;
            &#125;
            $backup = &quot;http&#58;//www.backpack-online.nl/xclip/Xclip.dmg&quot;;
		break;
&#125;	

// KIES EEN DOWNLOADLOCATIE
srand &#40;&#40;double&#41;microtime&#40;&#41;*1000000&#41;;
$randomnum = rand&#40;0, count&#40;$url&#41;-1&#41;;
//header &#40;&quot;Location&#58; $url&#91;$randomnum&#93;&quot;&#41;;
    if &#40;!$url&#91;$randomnum&#93;&#41; &#123;
        $download =  $backup;
    &#125; else &#123;
        $download = $url&#91;$randomnum&#93;;
    &#125;
return $download;

}
// ROEP 1 V/D VOLGENDE FUNCTIES OP:
//download(backpack_macosx);
//download(backpack_windows);
//download(xclip);
?>
[/code:1:353a0f5626]
De code van bartv werkt overigens ook wel (enigszins).

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:

[code:1:424bbd25f9]

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
}
[/code:1:424bbd25f9]

okee bedankt ik ga beide opties eens uitproberen :)