2011-05-10 90 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