2011-03-23 64 views
4

我正在編寫一個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(),但這種效果完全相同。

回答

3

內置的SOAP擴展是一個不可破解的恐怖二進制塊。這很可能是因爲它沒有考慮序列化。例如,它可能包含一個內部文件句柄,在serialize/unserialize過程中將不會存活。我強烈建議您使用其他一些SOAP客戶端,例如:

  • Zend_Soap,Zend Framework的一部分。您不需要在代碼的任何其他區域使用框架,並且可能會刪除大部分其他組件。但是,它似乎在封面下使用了現有的SOAP擴展,所以它可能不適合序列化。
  • PEAR's SOAP經常被引用,雖然它有點舊了。
  • NuSOAP最近已經從死裏復活,儘管所有在線文檔似乎已經消失在zip文件中。

如果這些都不合適,請考慮在本地緩存WSDL文件,因爲我在某種程度上預計這是延遲的地方。

+0

感謝您的答覆。我已經做了一些進一步的調查,看起來像你的分析是現實的 - 序列化的字符串幾乎沒有用於重建對象;它幾乎沒有任何內容,所以解串行不起來也就不足爲奇了。我會研究其他的選擇,但是PHP SOAP已經很好地融入到了我們的應用程序中,所以切換起來可能太痛苦了。我們已經研究過WSDL緩存;它迄今還沒有工作,但我會重新訪問它,因爲我認爲我們之前沒有做到。 – Spudley 2011-03-24 11:05:57

+0

而不是學習另一個肥皂的擴展,我會建議尋找wsdl緩存。除非你有特定的功能。 – denormalizer 2011-05-31 07:17:30

+2

@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