2013-03-28 90 views
9

我是Web服務的新手。我遇到了莫名其妙的SoapClient構造函數執行時間。通常這個通話大約需要10秒。有時只需不到一秒鐘,但這種情況不太頻繁。PHP SoapClient構造函數很慢

PHP SoapClient Constructor extremely slow

PHP: SoapClient constructor is very slow (takes 3 minutes)

Connecting to WCF Web Service is inexplicably slow

我的情況是類似於上述線程,但他們提供的解決方案並沒有解決我的問題。

// config params 
$params = array(
    'trace'  => 1, 
    'soap_version' => SOAP_1_1, 
    'cache_wsdl' => WSDL_CACHE_MEMORY 
); 
// this call takes about 10 seconds to remote WSDL 
$soap_client = new SoapClient(WSDL_URL,$params); 

我已經打了不同的WSDL高速緩存參數,發現WSDL_CACHE_MEMORY是最快的。使用其他緩存選項時,通話平均需要大約25秒。

我沒有使用多個用戶。

我已將wsdl_cache_dir更改爲在php.ini中的Windows友好目錄。

我的問題是雙重的:

  1. 爲什麼SoapClient的構造函數需要多長時間來執行看似隨機的?爲什麼它通常需要更長的時間,但有時只需要一秒鐘?我可以通過測試來了解它爲什麼會這樣做?

  2. 我應該緩存/保存SoapClient對象或資源,以便當頁面訪問者頁面間移動時,我不需要創建新的SoapClient並重新解析WSDL?推薦的方法是什麼?

任何幫助或推動正確的方向將是非常有責任感。謝謝。

+0

是WSDL文件的本地或遠程? – datasage

+0

@datasage我嘗試了兩個。本地第一,然後遠程。使用遠程更快的執行時間。 – cre8value

+0

嘗試使用soapui創建測試客戶端 - http://www.soapui.org/是否也很慢? – herrjeh42

回答

11

檢查TTL

TTL定義了WSDL在緩存中的生存時間。

soap.wsdl_cache_ttl integer 

設置的秒緩存文件將被用來代替原件的數量(生存時間)。

http://www.php.net/manual/en/soap.configuration.php#ini.soap.wsdl-cache-ttl

Store中WSDL本地

你也可以在WSDL下載到本地文件系統,並用它作爲源SoapClient

$client = new SoapClient("file://path/wsdl.file", array(
    'location' => "http://domain/ws-endpoint", 
)); 
+0

+1爲本地複製想法。 – GordonM