2

我的网络中有三个盒子

Box#1 - 一个带有 apache 和 php 的 RHEL 盒子(基本上是一个 LAMP 盒子)
Box#2 - 一个带有 JBoss 的 windows 盒子,它使用 apache 轴 2 托管一个 WSDL
Box#3 - 另一个 windows 盒子(基本上是一个 XAMPP 盒子——更多关于之后的第三个盒子)

当我尝试在 box#1 上运行 PHP 脚本时,该脚本使用 SoapClient 对象在浏览器中访问 box#2 的 WSDL,它返回:

致命错误:未捕获的 SoapFault 异常:[WSDL] SOAP-ERROR:解析 WSDL:无法从“http://XXX.XXX.XXX.XXX:8080/axis2/services/TheService?wsdl”加载:无法加载外部实体

然后我尝试使用 box#2 只是为了简单地返回我返回的 wsdl 文件的 file_get_contents:

警告:file_get_contents(http://XXX.XXX.XXX.XXX:8080/axis2/services/TheService?wsdl):无法打开流:第 4 行 /application/test.php 中的权限被拒绝

然而!当我以运行 apache 的同一用户身份登录时通过 telnet(命令行)运行最后一个脚本(file_get_contents)时,它返回 WSDL 的内容......(!)

--

我尝试在 Windows 框(框 #3)上运行相同的代码,如果 PHP.ini 设置与框 #2 不太相同,我可以使用 wsdl 并获取内容WSDL 文件没有问题。

--

我搜索了(stackoverflow 和 google),发现其他人也有同样的问题,并尝试了列出的解决方案,包括:

  • 我的 PHP.ini 的 max_file_size 设置为 128M(大于 wsdl)
  • allow_url_fopen 设置为 on

只是为了看看它是否适用于 box#1,我尝试使用 cURL 来获取文件的内容,但它没有返回任何内容。

如果有人能给我任何见解,将不胜感激。我确定在 PHP.ini 中有一个我缺少的设置或一些非常小的设置。

4

1 回答 1

8

我今天遇到了同样的问题,几个小时后,在尝试file_get_contents了我的 WSDL URL 之后,我注意到我的 apache 错误日志中出现了权限被拒绝错误。我发现 SELinux 是罪魁祸首。我相信默认情况下,SELinux 会阻止 httpd 发出自己的网络请求(至少在 Fedora 上)。

修复是:setsebool -P httpd_can_network_connect 1,然后允许 Apache 连接到远程服务(它适用于 SSL 和非 SSL 请求)。

还在这里回答:SOAP-ERROR: Parsing WSDL: Couldn't load from url

于 2012-10-24T06:52:32.730 回答