我有一个想通过 SOAP 访问的 Web 服务。但是我收到一个肥皂错误:
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"
如果我在浏览器中手动输入 URL http://127.0.0.1:9999/info?wsdl,那么我可以看到生成的 xml 文件。
为什么我不能用 SOAP 加载它?
我在 PHP 中使用 SOAP 加载 URL,如下所示:
$soap = new SoapClient("http://127.0.0.1:9999/info?wsdl", array("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 支持。
我也有同样的问题。 基本上,当前版本的 SOAP 客户端不能正确处理远程 wsdl(即使远程服务器是"本地主机"(。不知道为什么,尝试了很多方法开始工作,就是没有。 如果您下载 wsdl 的副本并将其保存在本地,则可以像这样使用它:
$soap = new SoapClient("/path/to/local/file.wsdl");
它就像一个魅力。
如果您确实需要一个实时 wsdl,您的选择是:
- 查找旧版本的NuSoap并使用它
- 使用 php curl 库之类的东西将 wsdl 下拉并另存为本地文件,然后从这个新保存的文件创建 Soap 客户端对象。
祝你好运!
感谢您的回答和想法!但我们已经发现了问题所在。SELinux 中的东西必须被禁用(您可以编辑/etc/sysconfig/selinux
并编辑行SELINUX=enforcing
以SELINUX=permissive
(或SELINUX=disabled
禁用 SELinux(。
另外,在我们的例子中,我们必须以根用户身份运行连接到WSDL的php文件(chown root /path/to/phpfile/on/webserver/file.php
.
我们只有在使用 CentOS 6 时才遇到这个问题, 不是在使用 Ubuntu och MS Windows 时。
另外,请查看 @dar7yl:s 链接:http://www.victorstanciu.ro/php-soapclient-port-bug-workaround/如果您无法解决 SELinux 中的更改并以 root 身份运行 php 文件的问题。
我认为问题是 PHP Soap 库无法处理 WDSL 版本 2。 您可能需要寻找第三方库。
使其与 SELinux 强制一起使用。
由于默认情况下不允许 httpd 脚本连接到网络,因此如果您需要脚本能够连接,则可以设置布尔值httpd_can_network_connect。