2010-07-10 54 views
2

我已經使用PHP 5.3創建了一個基於WSDL的SOAP Web服務。我使用Zend Framework來處理服務,而ZF反過來又被分層到PHP的內置SoapServer類上。無法處理PHP的SoapServer-> handle()方法中的錯誤

在使用SoapUI進行測試時,我發現傳遞無效類型的參數(例如,在WSDL定義整數時傳遞字符串)導致了空響應。挖掘到的代碼,我發現,當ZF調用SoapServer->手柄(),執行與這種致命的錯誤死亡:

Fatal error: SOAP-ERROR: Encoding: Violation of encoding rules 

錯誤是有道理的,但對我的生活,我無法弄清楚如何捕捉它,以便我可以優雅地處理它。我的理解是,handle()應該拋出一個異常,但它只是簡單的死去。

但這裏的地方變得很奇怪....

運行具有了SoapUI多個測試,未做任何代碼更改,會產生不同的結果。大多數情況下,我會得到空的答覆,但偶爾我會找回一個SoapFault(我期望的!)。然而,這並不一致,我無法弄清楚是什麼觸發它。據我所知,我關閉了SoapUI中的緩存功能,以及WSDL緩存。我不知道這是SoapUI還是PHP。正如我所說,奇怪。

相關,我發現這個老PHP錯誤:

http://bugs.php.net/36629

聽起來可怕像我自己的問題。但我並不完全相信這是我的問題,主要是因爲涵蓋所有這些內容的PHP文檔以及ZF的文檔都非常不完整。因此,我可能只是在做一些非常錯誤的事情而不知道它。鑑於此,我很想看到一個簡單的外殼,顯示捕捉和處理錯誤的正確方法。但我會接受任何人可能提供的幫助。

+0

這是否報告錯誤相關? http://bugs.php.net/bug.php?id=49513 – MrWhite 2010-07-16 19:04:06

+0

我確實相信。實際上,它看起來像所有這些都是相關的: http://bugs.php.net/bug.php?id=36629 http://bugs.php.net/bug.php?id=50547 http://bugs.php.net/bug.php?id=50895 http://bugs.php.net/bug.php?id=50547 http://bugs.php.net/bug.php? ID = 49513 – 2010-08-25 16:42:01

回答

0

如果您發送了錯誤的XML,Zend框架發送的SOAPFault例外:

// Zend/Soap/Server.php line 818 
try { 
    $this->_setRequest($request); 
} catch (Zend_Soap_Server_Exception $e) { 
    $setRequestException = $e; 
} 

有了這個代碼,唯一的例外是轉化成的SOAPFault。 但所有PHP錯誤不要扔異常和SoapServer時不顯示錯誤:

// Zend/Soap/Server.php line 857 
protected function _initializeSoapErrorContext() 
{ 
    $displayErrorsOriginalState = ini_get('display_errors'); 
    // Delete this line to view error in developement 
    ini_set('display_errors', false); 

    set_error_handler(array($this, 'handlePhpErrors'), E_USER_ERROR); 
    return $displayErrorsOriginalState; 
} 

我不知道怎麼回的SOAPFault所有的時間。抱歉。 我正在尋找......;)

1

你可以試試評論:https://bugs.php.net/bug.php?id=50547#1298563236(頁面上的第三條評論)?

Xdebug might be the problem. When using xdebug_disable() before calling the handle() method, the server responds with a proper SOAP message which says that something went wrong.

我有完全相同的問題(有時是空響應,有時是正確的SoapFault)。 xdebug_disable()救了我。