2010-04-13 59 views
4

我們目前正在考慮在一個依賴Soap Web服務的網站上調整性能。但是......我們的服務器位於比利時,我們連接的網絡服務位於舊金山,因此至少可以說是一個長途連接。加快肥皂供電網站的速度

我們的網站採用PHP驅動,使用PHP內置的SoapClient類。 平均而言,對web服務的調用需要0.7秒,而我們每頁大約需要3-5個請求。所有可能的請求/響應緩存已經實現,所以我們現在正在尋找其他方法來提高連接速度。

這是實例化SoapClient的代碼,我現在正在尋找的是提高單個請求速度的其他方式/方法。任何人有想法或建議?

private function _createClient() 
{ 
    try { 

     $wsdl = sprintf($this->config->wsUrl.'?wsdl', $this->wsdl); 
     $client = new SoapClient($wsdl, array(
      'soap_version'  => SOAP_1_1, 
      'encoding'   => 'utf-8', 
      'connection_timeout' => 5, 
      'cache_wsdl'   => 1, 
      'trace'    => 1, 
      'features'   => SOAP_SINGLE_ELEMENT_ARRAYS 
     )); 

     $header_tags = array('username' => new SOAPVar($this->config->wsUsername, XSD_STRING, null, null, null, $this->ns), 
          'password' => new SOAPVar(md5($this->config->wsPassword), XSD_STRING, null, null, null, $this->ns)); 
     $header_body = new SOAPVar($header_tags, SOAP_ENC_OBJECT); 
     $header = new SOAPHeader($this->ns, 'AuthHeaderElement', $header_body); 

     $client->__setSoapHeaders($header); 

    } catch (SoapFault $e){ 
     controller('Error')->error($id.': Webservice connection error '.$e->getCode()); 
     exit; 
    } 

    $this->client = $client; 
    return $this->client; 
} 
+5

如果您無法將服務器移動到舊金山,您可以嘗試移動比利時。我認爲有一個python模塊可以做到這一點。 – 2010-05-04 08:58:17

回答

5

因此,根本的問題是你必須做的請求數。怎麼樣創建分組服務?

  • 如果你負責web服務,你可以創建專門的web服務,它可以同時執行多個操作,所以你的主應用程序可以每頁只執行一個請求。
  • 如果不是,您可以將您的應用程序服務器重新安置在SF附近。
  • 如果無法重新定位所有服務器,並且無法創建新的專用Web服務,則可以在Web服務服務器附近添加一個橋。這座橋將提供專門的網絡服務,並負責調用原子網絡服務。例如,你會有0.7s + 5 * 0.1,而不是0.7s * 5。
+0

+1爲brigde,我不負責WS本身,但是一座橋可能是一個有效的解決方案! – ChrisR 2010-05-04 11:10:49

3

PHP.INI

output_buffering = On 
output_handler = ob_gzhandler 
zlib.output_compression = Off 
+0

謝謝!似乎是一個明顯的一個,並會檢查,但我正在尋找一種相當實用的方法,而不是調整PHP的設置,其方式已經像你建議設置:)感謝您的建議壽! – ChrisR 2010-05-04 08:18:52

+0

實際上,zlib.output_compression優於ob_gzhandler。 – dutchmega 2010-05-04 09:16:11

+1

@ChrisRamakers - 我使用肥皂作爲內部應用程序。我添加的一個功能是發送一個格式參數,它允許我在一個節點中獲得json格式的數據集。我檢索數據,然後讓客戶端設置數據。這有助於因爲身體反應的長度更少,因爲 ...次200已被替換爲 {....} 2010-05-06 14:25:26

1

1您可以斷言您的肥皂服務器使用gzip壓縮http內容,以及您的網站輸出。對SF的0.7s總結似乎有點長,它要麼是Web服務很長的回答,要麼有一個重要的無聊延遲。 如果可以的話,試試其他託管公司爲您的比利時服務器,在法國有些與美國的連接性要好得多。 我經歷了從一個主機移動到另一個主機的網站,巴黎和紐約之間的網絡延遲幾乎翻了一番!這很糟糕,我的客戶和很多美國遊客都對此感到不滿。 將Web服務器重定位到SF的解決方案可能是一種選擇,您將在服務器之間獲得更好的連接,但如果訪問者主要位於歐洲,請注意延遲。

2您可以使用操作碼緩存機制,例如xcache或APC。它不會改變肥皂等待時間,但會改善php的執行時間。

3根據肥皂請求是否重複以及內容更新可以延長多長時間,您可以使用肥皂結果上的緩存對肥皂進行真正的改進。我建議你使用內存中的緩存系統(如xcache/memcached或其他),因爲它們比文件或數據庫緩存系統快得多。

從你的類時,createclient方法是不是最適合爲例功能被緩存,但對於任何讀操作,它只是爲PErF的最佳方式:

private function _createClient() 
{ 
    $xcache_key = 'clientcache' 
    if (!xcache_isset($key)) { 
     $ttl = 3600; //one hour cache lifetime 
     $client = $this->_getClient(); ///private method embedding your soap request   
     xcache_set($xcache_key, $client, $ttl); 
     return $client; 
    } 
    //return result form mem cache 
    return xcache_get($xcache_key); 
} 

的例子是針對了XCache擴展,但您可以以非常類似的方式使用其他系統

4要進一步您可以使用類似的機制來緩存您的php處理結果(如模板呈現輸出和其他資源消耗操作)。這個技術成功的關鍵在於知道哪些部分是被緩存的,以及持續多久會令人耳目一新。

+0

我們最近實現了一個緩存機制,它取決於WS中記錄的最後更新時間。客戶端緩存也已到位。我並不是說我們已經把所有東西都推到了最高,但與5次以上的請求相比,收益可以忽略不計。在地理位置上重新分配服務器也可能會發揮作用,但所有訪問者/用戶都來自比利時和荷蘭,因此將我們的服務器移至美國的網站上引入了一般延遲。 – ChrisR 2010-05-04 11:15:49

+0

好吧,似乎唯一的選擇是評估WS服務器優化或更好的重新定位到比利時。 我見過的性能最好的SOA託管在同一個地方,同一個機架上,但我知道解決方案從一開始就有了這種架構 – Benoit 2010-05-04 11:40:22

3

您是否確切知道網絡延遲會降低每個請求的速度?正如Benoit所說,0.7s似乎是一個漫長的一輪。我會考慮做一些基準測試 - 你可以用curl來做到這一點,儘管我不確定這將如何與你的soap客戶端一起工作。

是這樣的:

$ch = curl_init('http://path/to/sanfrancisco/'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$output = curl_exec($ch); 
$info = curl_getinfo($ch); 

$info將返回一個陣列,其包括用於total_timenamelookup_timeconnect_timepretransfer_timestarttransfer_timeredirect_time元件。從這些你應該能夠計算出是否是dns,請求,實際的soap服務器或者是佔用時間的響應。

剛剛發生的一件顯而易見的事情是您是通過域還是IP請求SOAP服務器?如果你使用的是域名,你的DNS可能會顯着減慢速度(儘管它會在幾個階段被緩存)。檢查您的本地dns時間(在您的soap客戶端或php.ini中 - 不確定)以及您的域的TTL(在您的DNS區域中)。爲您的SanFran服務器設置一個靜態IP,並且如果尚未引用它。

+0

往返時間確實是0.7-0.5秒......它不是一個簡單的網絡命令,如ping但是在服務器上也會發生一些處理,如果無法從緩存中獲取,通常需要一些時間。 – ChrisR 2010-05-04 11:11:59

+0

是的 - 我不是在建議一個ping。分解0.7s - 包括對實際應用的基準測試。 – 2010-05-04 12:56:56

+2

@Chris如果ping到WS服務器的速度很快,那麼距離是(很可能)_not_你的問題:) – 2010-05-07 06:08:11

-1

任何使用AJAX接口的機會..如果請求可能發生在後臺,你似乎不會等待響應。

+0

他們仍然只需要加載 – rickyduck 2012-06-01 10:09:19