SOLVED -
Thanks for everyones help. I am posting my full function for those who may find it useful. To recap, this function "try's" to simulate Akamai's service.
- GeoLoc user.
- GeoLoc all servers
- Calculate distance between user and each server.
- Sort by distance.
- Check to see if file is at closest server. If so download.
- If file not at closest server, copy file from mother server to server missing file. Then notify user via email with download link to closest server.
function sst() {
global $_GET, $_SERVER;
/* start geo loc */
// http://www.imaginerc.com/software/GeoCalc/
require_once('standards/classes/geoplugin.class.php');
$geoplugin = new geoPlugin();
// http://www.phpclasses.org/browse/file/25516.html
include_once("standards/classes/GeoCalc.class.php");
$oGC = new GeoCalc();
/* set server ip's and FTP logins */
$servers = array($_SERVER['REMOTE_ADDR'],'xxx.xx.xx.xxx','xxx.xx.xx.xxx');
$user = array('','usr1','usr2');
$pass = array('','pass1','pass2',);
/* get user location */
$geo[0]['ip'] = $servers[0];
$geoplugin->locate($geo[0]['ip']);
$geo[0]['lat'] = $geoplugin->latitude;
$geo[0]['lon'] = $geoplugin->longitude;
$geo[0]['city'] = $geoplugin->city;
$geo[0]['countryName'] = $geoplugin->countryName;
/* get servers data */
for ($i = 1; $i < count($servers); $i++) {
$geo[$i]['ip'] = $servers[$i];
$geo[$i]['user'] = $user[$i];
$geo[$i]['pass'] = $pass[$i];
$geoplugin->locate($geo[$i]['ip']);
$geo[$i]['lat'] = $geoplugin->latitude;
$geo[$i]['lon'] = $geoplugin->longitude;
$geo[$i]['city'] = $geoplugin->city;
$geo[$i]['countryName'] = $geoplugin->countryName;
$geo[$i]['dist'] = $oGC->GCDistance($geo[0]['lat'],$geo[0]['lon'],$geo[$i]['lat'],$geo[$i]['lon']);
}
/* order by distance. */
$geo = orderBy($geo, 'dist');
/* connect to closeest server */
$conn_id = ftp_connect($geo[1]['ip']) or die("Couldn't connect to $ftp_server");
ftp_login($conn_id, $geo[1]['user'], $geo[1]['pass']);
$contents = ftp_nlist($conn_id, "tts/incoming");
ftp_close($conn_id);
$localfile = '/user/dac15/tts/incoming/';
$remotefile = '/user/'.$geo[1]['user'].'/tts/incoming/';
/* if file is on the closest server. */
if (find($_GET['name'],$contents)) {
// http://www.awesomephp.com/?Tutorials*16/Download-file-with-resume,-stream-and-speed-options.html
downloadFile($remotefile,$_GET['name'],900,false);
}else{
/* push file to the closest server requesting server.*/
$ch = curl_init();
$fp = fopen($localfile.$_GET['name'], 'r');
curl_setopt($ch, CURLOPT_URL, 'ftp://'.$geo[1]['user'].':'.$geo[1]['pass'].'@'.$geo[1]['ip'].'/'.$remotefile.$_GET['name']);
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localfile.$_GET['name']));
curl_exec($ch);
$error_no = curl_errno($ch);
curl_close($ch);
if ($error_no == 0) {
$error = 'File uploaded succesfully.';
$mailto[0][0] = $_SERVER['HTTP_EMAIL'];
$mailto[0][1] = $_SERVER['HTTP_FNAME'];
$mailto[0][2] = $_SERVER['HTTP_LNAME'];
$content="
Dear ".$mailto[0][1]."
<br>
Your file is ready for download. Go to this link in your preferred web browser.
";
// http://www.xpertmailer.com/
if (smtp_mail($mailto,"DoD File Download",$content)) { Return 1; }
}else{
$error = 'File upload error.';
echo $error;
}
}
die;
}
function orderBy($data, $field, $reverse_sort='') {
$code = "return strnatcmp(\$a['$field'], \$b['$field']);";
usort($data, create_function('$a,$b', $code));
if ($reverse_sort==1) { krsort($data); }
return $data;
}