我是PHP的新手。经过大量的搜索后,我设法以某种方式使用由Java和PHP创建的Web服务,但问题是SoapClient类的构造函数非常慢。这是我的PHP代码:
<?
require_once('SOAP/Client.php');
$url = "http://127.0.0.1:8024/_RS?wsdl";
$sc = new SoapClient($url);
?>
有时需要3分钟。我不知道问题是什么。在创建构造函数之后,我可以在for
循环中在1秒内使用它50次,所以我很确定构造函数是减慢代码速度的部分。
您认为导致问题的原因是什么?
提前谢谢。
PS: 更多信息在我的另一个问题: https://stackoverflow.com/questions/5929669/call-a-wsdl-web-service-created-by-java-from-nushphere-phped
PPS: 正如AJ所建议的,我使用XDebug和kcachegrind来分析问题。如你所见,我是对的。这是图片:
答案 0 :(得分:4)
我有同样的问题。 php SoapClient非常快,在Tomcat上部署了相同的Web服务。我尝试做一个“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(...)
插入Server
,Date
或Connection
- 标题。
(编辑)我找到了一个解决方案:问题不仅在于Chunked数据,还在于“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'
)
)
)
)
);
}
}
答案 1 :(得分:1)
我猜它不是PHP类的构造函数,而是在Java应用程序初始化任何对象之前,它可能会对您的Java Web服务进行第一次调用。
但是,你应该通过使用PHP分析工具来确定这一点,比如Xdebug:
答案 2 :(得分:1)
这与您的问题非常相似: http://www.ozonesolutions.com/programming/2011/05/nsclient-login-time/ 它使用php工具包而不是java,但解决方案仍然适用。