PHP Make SOAP Client Request返回500内部服务器错误

时间:2015-03-12 03:22:14

标签: php web-services soap wsdl

我使用PHP来发出SOAP请求。我确实有来自第三方的Web服务的信息。基本上他们给了我的东西:

  1. 完整的URI请求(http://xx.xx.xx.xx:xxxxxx/some/services/BasicDo
  2. 用户名&密码
  3. 我很新,但我能理解PHP SOAP的工作原理。但是在示例中,我发现调用的URL类似于http://xx.xx.xx.xx/services/myservice?wsdl,这与我对我的内容并不完全相同。这里的其他问题是我应该问他们什么?也许wsdl文件的名称是什么?

    到目前为止,我还有这个代码:

    try{
        $client = new SoapClient("http://xx.xx.xx.xx:xxxxx/some/services/BasicDo?wsdl", array('login'=>"myusername",'password'=> "mypwd"));
    }
    catch(SoapFault $fault) {
        trigger_error("SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})", E_USER_ERROR);
    }
    

    但是从控制台,我收到状态500内部服务器错误。我不知道这是怎么回事,我期待来自catch区块的东西。有人请告诉我这个。提前谢谢。

5 个答案:

答案 0 :(得分:5)

不幸的是,似乎no matter what you try(例如,传递array('exceptions' => 0)SoapClient()将在网络连接问题上抛出无法捕获的E_ERROR。此错误仍然存​​在于PHP 5.5.4之上(REF)。

要点:

测试脚本:

$client=@new SoapClient('garbage',array('exceptions'=>FALSE));
echo 'OK';

预期结果:我们应该看到“OK”,

实际结果:

如果我们使用register_shutdown_function来显示error_get_last()的内容,我们会得到:

Array
(
    [type] => 1
    [message] => SOAP-ERROR: Parsing WSDL: Couldn't load from 'garbage' : failed 
to load external entity "garbage"
)

要解释为什么在不更改系统任何内容的情况下突然收到此错误的原因,并解释为什么SoapClient在本地计算机上运行而不在生产系统上运行,这很可能是防火墙问题。

以下是另一个person报道解决了他的问题:

  

我解决了我的问题。这实际上是我的防火墙的一个问题。该   防火墙正在丢弃通过PHP发送的数据包,但通过curl或wget   没被丢弃。我为该服务器的所有流量添加了规则   增加了数据包丢弃长度,现在一切正常!

建议:

我最好建议在同一个PHP文件中编写一些代码,以检查SOAP服务URL是否在调用SoapClient之前解析并正确加载

答案 1 :(得分:1)

我不确定问题是什么,但在我遇到它时我做了以下调试这个问题

$client = new SoapClient("http://xx.xx.xx.xx:xxxxx/some/services/BasicDo?wsdl", array('login'=>"myusername",'password'=> "mypwd"));

你可以做的事情:

  1. 创建一个PHP文件。把它命名为什么。在那里写下面的代码:

    的ini_set('的display_errors''在&#39);

    $ client = new SoapClient(" http://xx.xx.xx.xx:xxxxx/some/services/BasicDo?wsdl",数组('登录' =>" myusername",'密码& #39; =>" mypwd")); 后续代码var_dump($客户端); 出口;

  2. 运行文件。

  3. 这可能会向您显示所需的例外情况。
  4. 在我的情况下,我们的服务器使用了一个我没有通过参数的代理,因为我得到了这个问题。 让我们知道它是怎么回事。

    谢谢

答案 2 :(得分:1)

在文件的头部添加这些代码以查看错误发生的位置

ini_set('display_errors','1');
error_reporting(E_ALL);

答案 3 :(得分:0)

首先,您需要确保可以访问SOAP服务器。

从运行php脚本的机器尝试访问wsdl文件并检查它是否有效。

您可以使用wget http://xx.xx.xx.xx:xxxxx/some/services/BasicDo?wsdl然后打开已保存的文件并查看您获得的内容。它是有效的wsdl吗?

完成访问权限后,您需要阅读文档herehere。您可能需要以不同方式进行身份验证或传递其他选项。

至于为什么catch块没有提取你的异常,你只是抓住了SoapFault。任何事情都可能导致500内部服务器错误。

答案 4 :(得分:0)

我非常感谢所有给出的答案。我实际上正在与另一方合作,我在远程方面没有任何访问权限。我的工作是向服务器发出SOAP请求。但事实证明,我没有可用的网络服务。所以我最终使用cURL发送SOAP请求的原始POST。 : - )