2011-12-09 21 views
2

我有交換一些數據的服務器A和服務器B.服務器A根據用戶請求使用帶有一些參數的簡單file_get_content從服務器B中提取數據,因此服務器B可以執行所有任務(數據庫等)並將結果返回給格式化並顯示給用戶的A。一切都在PHP中。2個遠程服務器之間的PHP傳輸數據,最快的方法是什麼?

現在我感興趣什麼是最快的方式來做到這一點?我在(〜0.2秒)內對服務器B的平均響應做了一些測試和平均傳輸時間。在那0.2秒,0.1秒。 aprox的。是服務器B的運行時間(拉數據調用少數數據庫等)什麼意思是50kb的平均傳輸時間是0.1秒。 (服務器不在同一網絡)

我應該嘗試:

  1. 捲曲insted的file_get_content的?
  2. 或嘗試使用套接字整個事情(我從來沒有在PHP中使用套接字工作,但我容易做到這一點,這樣可以跳過網頁服務器)
  3. 或其他第三方?

我認爲縮短連接建立時間能夠「發現」,因爲現在,每個請求新連接發起(我的意思是在單獨的file_get_content電話,還是我錯了?)

請給我你的建議,嘗試的方向,或者如果你有我聽到的更好的解決方案。

+0

fgc是fopen的一個包裝,這就是爲什麼捲曲略快。無論你設計什麼解決方案,它總是會有一些延遲,我之前使用curl來抓取serverB的大視頻,並從serverA流出,沒有問題 –

回答

11

捲曲

function curl($url) 
{ 
    $ch = curl_init(); 
    curl_setopt ($ch, CURLOPT_URL,$url); 
    curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); 
    curl_setopt ($ch, CURLOPT_TIMEOUT, 60); 
    curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
    $result = curl_exec ($ch); 
    curl_close($ch); 
    return $result; 
} 

套接字:

function sockets($host) { 
$fp = fsockopen("www.".$host, 80, $errno, $errstr, 30); 
    $out = "GET/HTTP/1.1\r\n"; 
    $out .= "Host: www.".$host."\r\n"; 
    $out .= "Connection: Close\r\n\r\n"; 
    fwrite($fp, $out); 
    $f=''; 
    while (!feof($fp)) { 
    $f .= fgets($fp, 1024); 
    } 
return $f; 
} 

的file_get_contents

function fgc($url){ 
     return file_get_contents($url); 
    } 

Multicurl

function multiRequest($data,$nobody=false,$options = array(), $oneoptions = array()) 
{ 
    $curls = array(); 
    $result = array(); 
    $mh = curl_multi_init(); 
    foreach ($data as $id => $d) 
    { 
     $curls[$id] = curl_init(); 
     $url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d; 
     curl_setopt($curls[$id], CURLOPT_URL,   $url); 
     curl_setopt($curls[$id], CURLOPT_HEADER,   0); 
     curl_setopt($curls[$id], CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($curls[$id], CURLOPT_FOLLOWLOCATION,1); 
     curl_setopt($curls[$id], CURLOPT_USERAGENT,"Mozilla/5.0(Windows;U;WindowsNT5.1;ru;rv:1.9.0.4)Gecko/2008102920AdCentriaIM/1.7Firefox/3.0.4"); 
     //curl_setopt($curls[$id], CURLOPT_COOKIEJAR,'cookies.txt'); 
     //curl_setopt($curls[$id], CURLOPT_COOKIEFILE,'cookies.txt'); 
     //curl_setopt($curls[$id], CURLOPT_NOBODY, $nobody); 

     if (!empty($options)) 
     { 
      curl_setopt_array($curls[$id], $options); 
     } 
     if (!empty($oneoptions[$id])) 
     { 
      curl_setopt_array($curls[$id], $oneoptions[$id]); 
     } 
     if (is_array($d)) 
     { 
      if (!empty($d['post'])) 
      { 

       curl_setopt($curls[$id], CURLOPT_POST,  1); 
       curl_setopt($curls[$id], CURLOPT_POSTFIELDS, $d['post']); 
      } 
     } 
     curl_multi_add_handle($mh, $curls[$id]); 
    } 
    $running = null; 
    do 
    { 
     curl_multi_exec($mh, $running); 
    } 
    while($running > 0); 
    foreach($curls as $id => $content) 
    { 
     $result[$id] = curl_multi_getcontent($content); 
     //echo curl_multi_getcontent($content); 
     curl_multi_remove_handle($mh, $content); 
    } 
    curl_multi_close($mh); 
    return $result; 
} 

測試:

$url = 'example.com'; 
$start = microtime(1); 
for($i=0;$i<100;$i++) 
curl($url); 
$end = microtime(1); 
echo "Curl:".($end-$start)."\n"; 

$start = microtime(1); 
for($i=0;$i<100;$i++) 
fgc("http://$url/"); 
$end = microtime(1); 
echo "file_get_contents:".($end-$start)."\n"; 

$start = microtime(1); 
for($i=0;$i<100;$i++) 
sockets($url); 
$end = microtime(1); 
echo "Sockets:".($end-$start)."\n"; 

$start = microtime(1); 
for($i=0;$i<100;$i++) 
$arr[]=$url; 
multiRequest($arr); 
$end = microtime(1); 
echo "MultiCurl:".($end-$start)."\n"; 
?> 

結果

  • 捲曲:5.39667105675
    的file_get_contents:7.99799394608
    套接字: 個2.99629592896
    MultiCurl:0.736907958984
+0

爲什麼這個答案被拒絕? – maialithar

+0

我知道,不是我: - http://meta.stackexchange.com/questions/115396/is-it-ever-appropriate-to-question-a-downvote – ajreal

+0

可能是因爲沒有足夠的例子給出.. 。 開玩笑。從我+1。 –

0

什麼是最快的方法?

將您的數據存儲在閃存驅動器上。

現在認真。
來吧,這是網絡很慢。你無法讓速度更快。
爲了使服務器響應更快,請勿從服務器B請求數據。這是唯一的方法。
您可以複製您的數據或緩存它,或者完全退出如此笨拙的設置。
但是,只要您必須對每個用戶的請求進行網絡查找,它就會很慢。儘管你正在使用的方法。這不是方法,它是媒體。這不明顯嗎?

-1

您可以嘗試其他不同的方法:將遠程文件系統安裝在本地計算機上。你可以用sshfs來做到這一點,所以你將獲得一個encripted連接的額外安全性。

它可能會更有效,因爲php不必處理連接協商和建立。

相關問題