我正在編寫一個PHP應用程序,它使用一些SOAP Web服務來收集數據。序列化一個PHP SOAPClient對象
我在實例化所有這些對象時收到了大量的開銷:在某些情況下,一行代碼$object = new SoapClient($wsdl);
可能需要三秒鐘。顯然,只有少數人使網頁感覺非常慢。
爲了加快了一點東西,我想我會連載的對象,並將其存儲在會話(或類似的地方),所以我寫了下面的功能:
function soap_client($name,$wsdl) {
if (!isset($_SESSION['soapobjects'][$name])) {
$client = new SoapClient($wsdl, array('trace' => 1));
$_SESSION['soapobjects'][$name]=serialize($client);
} else {
$client = unserialize($_SESSION['soapobjects'][$name]);
}
return $client;
}
這當然似乎是the way PHP recommends to do it。
...然後調用它像這樣...
$client = soap_client('servicename',$wsdl);
$client->MethodName($parameters);
然而,它似乎並沒有工作。
第一次運行它時,它可以工作(即創建對象並創建序列化副本,並且方法調用可以正常工作)。但是,第二次運行它時會失敗。
出現正確序列化和反串行化,但是當你嘗試執行反序列化對象上的SOAP調用的對象,它引發以下錯誤:
Fatal error: Uncaught SoapFault exception: [Client] Error finding "uri" property
顯然,去序列化對象與原始對象不同,這與對象序列化應該如何工作不一致。
任何人都可以解釋爲什麼我得到這個錯誤?你能提出一種方法來讓它工作,或者我可以選擇一種替代策略嗎?
謝謝。
ps - 我試着解決這個問題,但沒有喜悅。
我試過在選項參數中指定URI(如PHP SOAP Client manual中指定的那樣),但它沒有任何區別。但是,無論如何,因爲我正在使用WSDL,所以它不是必需的。
我也嘗試過簡單地將對象複製到$_SESSION
,而不使用serialize()
和deserialize()
,但這種效果完全相同。
感謝您的答覆。我已經做了一些進一步的調查,看起來像你的分析是現實的 - 序列化的字符串幾乎沒有用於重建對象;它幾乎沒有任何內容,所以解串行不起來也就不足爲奇了。我會研究其他的選擇,但是PHP SOAP已經很好地融入到了我們的應用程序中,所以切換起來可能太痛苦了。我們已經研究過WSDL緩存;它迄今還沒有工作,但我會重新訪問它,因爲我認爲我們之前沒有做到。 – Spudley 2011-03-24 11:05:57
而不是學習另一個肥皂的擴展,我會建議尋找wsdl緩存。除非你有特定的功能。 – denormalizer 2011-05-31 07:17:30
@Charles使用Zend_Soap_Client不起作用,因爲它包裝了一個[擴展的SoapClient](http://framework.zend.com/apidoc/1.11/db_Soap_Client_Common.html#%5CZend_Soap_Client_Common)類。將此存儲到(Zend_)緩存或(Zend_)會話中也會導致反序列化問題,除非您之前沒有使用客戶端。由於Zend_Soap_Client延遲加載底層的SoapClient,這可能會導致應用程序中出現未知的副作用。 – Partyschaum 2012-02-03 11:33:17