2011-05-10 60 views
2

我是PHP新手。經過大量搜索,我設法以某種方式使用由Java創建的PHP Web服務,但問題在於SoapClient類的構造函數非常緩慢。這裏是我的PHP代碼:PHP:SoapClient構造函數非常慢(需要3分鐘)

<? 
require_once('SOAP/Client.php'); 
$url = "http://127.0.0.1:8024/_RS?wsdl"; 
$sc = new SoapClient($url); 
?> 

這需要長達3分鐘的一些時間。我不知道問題是什麼。在創建構造函數後,我可以在1秒內在for循環中使用它50次,所以我非常肯定構造函數是減慢我的代碼的部分。

您認爲是什麼導致了這個問題?

預先感謝您。

PS: 在我的其他問題的更多信息: https://stackoverflow.com/questions/5929669/call-a-wsdl-web-service-created-by-java-from-nushphere-phped

PPS: 正如AJ建議,我用了XDebug和kcachegrind來分析這個問題。正如你所看到的,我是對的。這裏的圖片: XDebug result in kcachegrind both in % (up) and time(down).

回答

4

我有同樣的問題。 php SoapClient非常快速,在Tomcat上部署了相同的webservice。我試圖做一個「wget的」,看是否在響應中的頭是不同的,因爲這個問題是與WSDL緩存我發現可能是原因的不同:

對於Tomcat:

HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
Content-Type: text/xml;charset=utf-8 
Content-Length: 23925 
Date: Thu, 08 Mar 2012 23:13:10 GMT 
Connection: keep-alive 

隨着Endpoint.publish(...)

HTTP/1.1 200 OK 
Content-type: text/xml;charset=utf-8 
Content-length: 23837 

現在我只需要找出如何強制Endpoint.publish(...)插入ServerDate,或Connection -header。

(編輯)我發現了一個解決方案:這個問題不僅與分塊數據有關,而且還與「Keep-Alive」有關。這可以通過在stream_context中設置標題「Connection:Close」來防止。請看下面:

class ImprovedSoapClient extends SoapClient 
{ 
    public function __construct($wsdlLocation) 
    { 
     parent::__construct(
      $wsdlLocation 
      , array(
       , 'cache_wsdl' => WSDL_CACHE_NONE 
       , 'stream_context'=>stream_context_create(
        array('http'=> 
         array(
          'protocol_version'=>'1.0' 
          , 'header' => 'Connection: Close' 
         ) 
        ) 
       ) 
      ) 
     ); 
    } 
} 
+0

謝謝。如果您找到解決方案,請告訴我。 – 2012-03-09 07:55:07

+0

我設法添加標題 - 但徒勞無功。 Php的SoapClient仍然希望花費60秒來兌現WSDL,並且60秒鐘緩存XSD。 – 2012-03-09 08:25:21

+0

哈哈,將「default_socket_timeout」設置爲5會將緩存降低到10秒 - 看起來差異可能在於處理與Tomcat和Endpoint.publish(....)不同的連接(誰終止它)。 – 2012-03-09 08:26:24

1

我猜想,這不是PHP類的構造函數,而是它可能使第一調用您的Java Web服務 - 任何對象已經在Java應用程序初始化之前。

但是,你應該確定這肯定通過使用PHP分析工具,如Xdebug的:

http://www.xdebug.org/docs/profiler

+0

的服務只是一個很小的世界你好服務只是用於測試目的。您可以在問題結尾的鏈接中看到代碼。我不認爲java部分正在放慢速度,因爲silverlight消費者使用相同的服務工作得很好。你不同意嗎? – 2011-05-10 01:07:18

+0

這可能是真的......再次,唯一的方法來了解**確定**造成您的放緩的是使用分析工具。它會告訴你最長的確切路線。 – 2011-05-10 01:09:49

+0

謝謝。難道我只是在構造函數之前和之後回顯一些文本以查看區別?我是PHP新手,我會花一些時間來使用您提供的工具。 – 2011-05-10 01:16:33

1

這看起來非常相似的問題: http://www.ozonesolutions.com/programming/2011/05/nsclient-login-time/ 它使用PHP工具包而不是Java,但解決方案可能仍然適用。

+0

自己找到一個很好的教程。謝謝。當我發現Thrift是一個更合理的解決方案時,我不想更多地關注它。無論如何,我將這個標記爲答案,因爲這似乎是一個好的開始。 – 2011-09-26 20:47:59