我一直在使用PHP4的脚本,它依赖于NuSOAP。现在,我正在尝试将其移至PHP5,并在那里使用SOAP的buildin支持。
$wsdlPath = ""; // I have obviously set these variables to something meaningful, just hidden for the sake of security
$apiPath = "";
$username = "";
$password = "";
// PHP5 style
$client = new soapclient($wsdlPath, array('login'=>username,
'password'=> $password,
'soap_version'=> SOAP_1_2,
'location'=> $apiPath,
'trace'=> 1));
// PHP4/NuSOAP style
$client = new soapclient($wsdlPath, true);
client->setEndpoint($apiPath);
$client->setCredentials($username, $password);
$client ->loadWSD);
PHP5版本抛出以下异常堆栈跟踪:
EXCEPTION=SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://external-nbb.napi.norwegian.no.stage.osl.basefarm.net/api/napi1300?wsdl' in /home/eisebfog/public_html/database/norwegian.php:31
Stack trace:
#0 /home/eisebfog/public_html/database/norwegian.php(31): SoapClient->SoapClient('http://external...', Array)
#1 /home/eisebfog/public_html/database/index.php(53): require_once('/home/eisebfog/...')
#2 {main}
现在,由于NuSOAP版本确实有效,纯PHP5没有 - 它不会让脑外科医生弄清楚我做错了什么。我可以访问.htaccess文件,并通过phpinfo()确保我正确地运行NuSOAP并在应该运行PHP5时运行PHP5 / Nusoap。
基本上,我对网络服务和肥皂并不是很好 - 但如果有人有任何想法,我会很感激我对错误以及如何在PHP5中使用本地肥皂的任何意见。顺便说一下,我首先想要这一举动的共鸣是假定的本地肥皂资源节约。我也很欣赏这两种解决方案之间的基准测试链接。
答案 0 :(得分:2)
确保NuSoap和PHPv5-SOAP在同一台服务器上运行。如果我没有完全错误,两个库都使用相同的类名。如果确保没有包含任何NuSopa文件,它可能会更好吗?并验证是否已加载SOAP库:
if(!extension_loaded('soap')){
dl('soap.so'); // Actually a deprecated method. See "notes" at http://no.php.net/dl
}
我猜你引用的版本字段是定义为“SOAP 1.1”还是类似?
祝福:)
顺便问一下:你在做什么?从飞行员到机场的交换延误?或者也许是一个减少奥斯陆行李托运等待时间的网络服务? :P
答案 1 :(得分:1)
没有测试,我有两个建议:
首先,将您的error_reporting设置为尽可能高(在创建SoapClient之前):
error_reporting( E_ALL );
如果服务器端的身份验证出现问题,PHP将发出警告。在大多数情况下,它会告诉你,出了什么问题。
第二:我不知道你是否可以指定'location'选项和wsdl的URL。从理论上讲,wsdl会告诉您的客户端操作的端点在哪里,因此您不必费心。
答案 2 :(得分:1)
我们遇到了与尝试使用基于.NET的Web服务的PHP5内置SOAP客户端非常相似的问题。 WSDL解析也无法报告无效架构。将模式定义放在一个本地文件中没有帮助。
我们放弃了尝试并切换到NuSOAP,这确实有效。
然而,NuSOAP也远非完美。现在,在解析1MB +响应期间,我遇到了内存不足的情况。擦除所有讨厌的调试代码有点帮助,但不是根本。
因此,看起来目前在PHP中没有100%可互操作/功能的SOAP客户端实现。