【问题标题】:Can not load webservice with SOAP in PHP, I get SOAP-ERROR无法在 PHP 中使用 SOAP 加载 Web 服务,我得到 SOAP-ERROR
【发布时间】:2012-03-01 21:36:50
【问题描述】:

我有一个想通过 SOAP 访问的 Web 服务。 但我收到一个 SOAP 错误:

Exception caught: SOAP-ERROR: Parsing WSDL: Couldn´t load from 'http://127.0.0.1:9999/info?wsdl' : failed to load external entity "http://127.0.0.1:9999/info?wsdl"

如果我在浏览器中手动输入网址http://127.0.0.1:9999/info?wsdl,则可以看到生成的xml文件。

为什么我不能用 SOAP 加载它?

我在 PHP 中使用 SOAP 加载 URL,如下所示:

$soap = new SoapClient("http://127.0.0.1:9999/info?wsdl", 数组("trace" => TRUE));

我错过了什么?

编辑
将 SOAP 版本设置为 1.1 并不能使其正常工作:

$soap = new SoapClient("http://127.0.0.1:9999/info?wsdl", array("trace" => TRUE, "soap_version" => SOAP_1_1));

编辑 2:
我让它在 Windows 和 Ubuntu 上都可以工作,但不能在 CentOS 6 上工作。CentOS 6 是否有什么东西使 PHP:s SoapClient 不能工作?我在 CentOS 6 机器上运行的 PHP 版本是 5.3.3,(当然)在 PHP 中启用了 Soap 支持。

【问题讨论】:

    标签: php web-services soap wsdl


    【解决方案1】:

    我也有同样的问题。基本上,当前版本的 SOAP 客户端不能正确处理 REMOTE wsdl(即使远程服务器是“localhost”)......不知道为什么,尝试了很多方法来开始工作,只是没有。如果您下载 wsdl 的副本并将其保存在本地,则可以像这样使用它:

    $soap = new SoapClient("/path/to/local/file.wsdl");
    

    它就像一个魅力。

    如果您真的需要实时 wsdl,您的选择是:

    • 查找旧版本的 NuSoap 并使用它
    • 使用类似 php curl 库的东西来拉下 wsdl 并将其保存为本地文件,然后从这个新保存的文件创建您的 Soap Client 对象。

    祝你好运!

    【讨论】:

      【解决方案2】:

      感谢您的回答和想法!但是我们发现了问题。这是 SELinux 中必须禁用的东西(您可以编辑 /etc/sysconfig/selinux 并将 SELINUX=enforcing 行编辑为 SELINUX=permissive(或 SELINUX=disabled 以禁用 SELinux)。
      另外,在我们的例子中,我们必须以 root (chown root /path/to/phpfile/on/webserver/file.php) 身份运行连接到 WSDL 的 php 文件。

      我们仅在使用 CentOS 6 时遇到此问题,而不是在使用 Ubuntu och MS Windows 时。

      另外,查看@dar7yl:s 链接:http://www.victorstanciu.ro/php-soapclient-port-bug-workaround/ 如果您无法解决 SELinux 中的更改问题并以 root 身份运行 php 文件。

      【讨论】:

      • 我遇到了完全相同的问题,这也解决了我的问题。
      【解决方案3】:

      我认为问题在于 PHP Soap 库无法处理 WDSL 版本 2。您可能需要寻找 3rd 方库。

      【讨论】:

      • 在 SOAP 构造函数中,我添加了 "soap_version" => SOAP_1_1 但它没有帮助。 :( 看看我上面的编辑。
      • PHP 文档说 PHP 支持版本 2:php.net/manual/en/class.soapclient.php
      • 哦,您编写的是 WSDL 2.0,而不是 SOAP 2.0。是否可以将版本设置为 WSDL 1.0?
      • 不确定。我放弃了直接从 php 调用 Web 服务,并用 C# 编写了一个小胶水程序(我正在使用 WAMP 服务器),它通过 system() 调用。它既粗鲁又低效,但对我有用。您可以查看victorstanciu.ro/php-soapclient-port-bug-workaround 看看这是否是您的问题。 (也可能是我的问题;我无法承受项目停机时间来分析问题)
      【解决方案4】:

      使其与 SELinux 强制一起使用。

      由于默认情况下不允许 httpd 脚本连接到网络,如果您需要脚本能够连接,您可以设置 httpd_can_network_connect 布尔值。

      【讨论】:

      • 执行此操作的命令是:sudo setsebool -P httpd_can_network_connect on
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多