【发布时间】:2012-04-26 04:43:18
【问题描述】:
我的网络中有三个盒子
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 设置为开启
只是想看看它是否适用于 box#1,我尝试使用 cURL 来获取文件的内容,但它没有返回任何内容。
如果有人能给我任何见解,将不胜感激。我确定在 PHP.ini 中有一个我缺少的设置或一些非常小的设置。
【问题讨论】:
-
如果您从浏览器打开
http://XXX.XXX.XXX.XXX:8080/axis2/services/TheService?wsdl,您的浏览器会显示什么? -
显示 WSDL 的内容
-
我建议您使用网络嗅探器连接并检查当您使用 PHP 请求时在 HTTP 协议级别上发生了什么。是 200 OK 还是其他请求(不是浏览器,而是 PHP)。您也可以尝试:
var_dump($http_response_header);直接在 file_get_contents 行之后。见php.net/manual/en/reserved.variables.httpresponseheader.php -
警告:file_get_contents(XXX.XXX.XXX.XXX:8080/axis2/services/TheService?wsdl):无法打开流:第 4 行 /application/test.php 中的权限被拒绝 注意:未定义变量:第 5 行 /application/test.php 中的 http_response_header空
-
做网络嗅探。可能会证明根本没有执行 HTTP 请求。逐字粘贴您的代码(只需掩盖 IP 的数字)。