2016-06-13 50 views
1

我使用SoapClient连接到第三方服务。大多数的正常工作时间,但每过一段时间中,也许一次每100-150电话,我得到的错误从SoapFault获取错误的WSDL?

Soap Failed: SOAP-ERROR: Parsing Schema: unexpected in complexType

我的代码是在一个try/catch随着重试,它会通过下一轮工作。但是我想研究WSDL以找出失败的原因,部分原因是为了我自己的好奇心,并且需要将它传递给我所连接的公司。我可以从SoapFault获取这些信息吗?或者我必须调用URL来获取字符串?我担心如果在事实之后获得WSDL,它可能已经被修复。

$pass = FALSE; 
$this->soap = NULL; 
$this->session = NULL; 
do { 
    try { 
     Doc::i("Starting session"); 
     $this->soap = new SoapClient($this->wsdl_url, ['trace' => 1]); 
     $pass = TRUE; 
    } catch (\SoapFault $e) { 
     Doc::e('Soap Failed: ' . $e->getMessage()); 
     if(str_contains($e->getMessage(),'Parsing Schema') && !empty($e->detail)) { 
      Doc::e($e->detail); // Something new I'm trying to see if it helps 
     } 
    } catch (FatalErrorException $e) { 
     Doc::e("Soap failed really bad: " . $e->getMessage()); 
    } catch (\Exception $e) { 
     Doc::e("Soap failed bad: " . $e->getMessage()); 
    } 
} while (!$pass); 
+0

['__getLastResponse'](http://php.net/manual/en/soapclient.getlastresponse.php),因为你正在使用'trace'? – bishop

+0

我发现'__getLastResponse()',并且只是添加了。我希望下次发生错误时能够正常工作。谢谢你的支持! – aynber

+0

祝你好运!这些错误令人讨厌。我发布了一个正式的答案,以防最终解决。 – bishop

回答

0

你应该能够使用$this->soap->__getLastResponse()因为你是路过'trace' => 1选项SoapClient

您可能还会考虑记录$this->soap->__getLastRequest以及这两者的标头版本,以确保您在运行时捕获尽可能多的信息。

有关可能的选项,请参阅SoapClient方法列表。请记住这里的技巧是trace选项:没有这个,这些将不会返回任何有用的东西!

+0

我真的很希望这可以工作,但是我调用了一个非对象的成员函数__getLastResponse()。 – aynber

+0

嗯,这表明'\ SoapClient'没有被创建。请使用'__getLastResponse'使用最新的代码更新您的OP。 – bishop

+0

走过PHP引擎的源代码,似乎[__doRequest](https://github.com/php/php-src/blob/master/ext/soap/soap.c#L2585-L2586)失败。你*可以*通过创建你自己的客户端类并覆盖['__doRequest'](http://php.net/manual/en/soapclient.dorequest.php)来收集即时信息,就像[这个例子](https://github.com/php/php-src/blob/master/ext/soap/tests/typemap008.phpt#L9-L14)。 – bishop