cesarcesar Posted March 10, 2009 Share Posted March 10, 2009 I need to transfer files between a network of servers all over the world. I have looked into using cURL and ftp_fput() but am having little luck. I can get a transfer going from my local to the server or visa versa but not from server to server. Basically im trying to replicate Akamai on a very small scale. This is the scenario. I am working from home. I search for a file on Web Server 1 in Oregon. The file doesn't exist. I search my other servers and find that it is located on Server 2 in Germany. I then need to COPY the file from Web Server 2 to Web Server 1. That's it. I have it all in place except getting the server-to-server transfer to work. Who can help? Thanks much. Quote Link to comment Share on other sites More sharing options...
premiso Posted March 10, 2009 Share Posted March 10, 2009 You would have to use your server as a medium. Copy the file from Server 2 to your server then copy to Server 1 from your server. Doubles the bandwidth. I do know that this is called FXP in the Internet world and that there used to be (may still be I think it was FlashFXP) an FTP program to do this. I am not sure if you are looking for this to be done in PHP, but if you are on a windows machine you could download that program then run a exec command to do the transfer. The other way is you could have to have 2 open FTP connections (not sure if the ports/sockets would allow that) since they are probably both on port 21. Hope that at least gave you some ideas. Quote Link to comment Share on other sites More sharing options...
cesarcesar Posted March 10, 2009 Author Share Posted March 10, 2009 One other thing. The connections need to be made via FTP. I have IP, USER & PASSWORDS for each account. Thanks. Quote Link to comment Share on other sites More sharing options...
cesarcesar Posted March 10, 2009 Author Share Posted March 10, 2009 thanks @premiso. Quote Link to comment Share on other sites More sharing options...
cesarcesar Posted March 10, 2009 Author Share Posted March 10, 2009 Thanks for all your input. Let me explain a little more about what i have done. First of, each of the files I'm transferring are over 1Gb so file_get_contents() wont work. Files are not transferred until requested by the user. I would prefer to do it all in CURL, but as i said im having issues. I have looked into SST scripts but none seems to satisfy. My thinking is that cURL cannot directly transfer a file server to server (please correct if wrong). I thought that the way to make it work would be to call a file on Web Server 2 using cURL and add some parameters (file name to transfer) to the call so that when ran it would using cURL transfer the file to Web Server 1. Sound good? Problem, Web Server 2 doesn't have a URL that will resolve to a specific file on the server. Therefor again only cURL via FTP login can be used (as i see it). So do further define my question, with cURL, is there a way to transfer files between servers directly using a curl statement like $ch = curl_init("ftp://theuser:thepass@72.47.251.180/testfile.m4v"); but one that works more like below with a location to get and set from/to. I know the following code is incorrect, i just would like to know how to get it right. $c = curl_init("ftp://theuser:thepass@72.47.251.180/testfile.m4v","ftp://theuser:thepass@42.76.151.236/testfile.m4v"); I know i have left out parts of the cURL process. curl_exec() and curl_close() are pretty standard. Thanks. Quote Link to comment Share on other sites More sharing options...
cesarcesar Posted March 11, 2009 Author Share Posted March 11, 2009 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. 1. GeoLoc user. 2. GeoLoc all servers 3. Calculate distance between user and each server. 4. Sort by distance. 5. Check to see if file is at closest server. If so download. 6. 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; } Quote Link to comment Share on other sites More sharing options...
cesarcesar Posted March 11, 2009 Author Share Posted March 11, 2009 I have another question to go along with this post. Once the cURL transfer is started on my 1GB file the screen just sits white while doing its thing (page load bar crawls). Is there a way to finish loading the page while the transfer is in process. This way the user doesn't have to wait for the transfer to finish, they are just there to make it happen. (they are not downloading at the time so it would be okay for them to continue). Thanks. Quote Link to comment Share on other sites More sharing options...
redarrow Posted March 11, 2009 Share Posted March 11, 2009 what about you include the current page then send them to a new one might work, but the new page would have to be something off interest on it. Quote Link to comment Share on other sites More sharing options...
cesarcesar Posted March 11, 2009 Author Share Posted March 11, 2009 can you expand your suggestion. If I include(), wont the page just continue as is? Quote Link to comment Share on other sites More sharing options...
redarrow Posted March 11, 2009 Share Posted March 11, 2009 after the info has been submitted send them to a new page. Quote Link to comment Share on other sites More sharing options...
cesarcesar Posted March 17, 2009 Author Share Posted March 17, 2009 /** * Takes a needle and haystack (just like in_array()) and does a wildcard search on it's values. * * @param string $string Needle to find * @param array $array Haystack to look through * @result array Returns the elements that the $string was found in */ function find ($string, $array = array ()) { foreach ($array as $key => $value) { unset ($array[$key]); if (strpos($value, $string) !== false) { $array[$key] = $value; } } return $array; } Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.