我是 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 分钟的时间。我不知道问题是什么。创建构造函数后,我可以在 1 秒内在 for
循环中使用它 50 次,因此我非常确定构造函数是减慢代码速度的部分。
您认为是什么导致了这个问题?
提前谢谢您。
PS: 更多信息在我的另一个问题中: https://stackoverflow.com/questions/5929669/call-a-wsdl-web-service-created-by-java-from-nushphere-phpedPPS: 按照AJ的建议,我使用XDebug和kcachegrind来分析问题。正如你所看到的,我是对的。这是图片:
最佳答案
我也有同样的问题。使用部署在 Tomcat 上的相同 Web 服务,php SoapClient 速度非常快。我尝试执行“wget”来查看响应中的 header 是否不同,并且由于问题在于 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
、或连接
- header 。
(编辑)我找到了一个解决方案:问题不仅在于分块数据,还在于“保持 Activity ”。可以通过在stream_context 中设置 header “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'
)
)
)
)
);
}
}
关于java - PHP:SoapClient 构造函数非常慢(需要 3 分钟),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5944067/