【发布时间】:2020-05-15 10:38:46
【问题描述】:
我有一个包含休闲代码的简单 php 脚本:
$options = array(
'uri'=>'http://schemas.xmlsoap.org/wsdl/soap/',
'style'=>SOAP_RPC,
'use'=>SOAP_ENCODED,
'soap_version'=>SOAP_1_1,
'cache_wsdl'=>WSDL_CACHE_NONE,
'connection_timeout'=>15,
'trace'=>true,
'encoding'=>'UTF-8',
'exceptions'=>true
);
$client = new SoapClient($wsdl,$options);
当我通过 php-cli (CentOS 8) 执行代码时,一切都像魅力一样。 我可以成功连接到webservice并调用方法、处理响应等。
当我尝试通过浏览器执行脚本时出现错误:
致命错误:未捕获的 SoapFault 异常:[WSDL] SOAP-ERROR:解析 WSDL:无法从“http://xxx/services/Assets?wsdl”加载:无法在 /var/www/ 中加载外部实体“http://xxx/services/Assets?wsdl” html/xxx.php:32 堆栈跟踪:#0 /var/www/html/xxx.php(32): SoapClient->SoapClient('http://xxx....', Array) #1 {main} 抛出/var/www/html/xxx.php 第 32 行
由于 php 是在 服务器端 直接通过 php-cli 在服务器上运行脚本和通过浏览器间接从远程主机运行脚本有什么区别? PHP 在网络服务器上执行,所以它不应该是防火墙/网络问题...对吗?
我尝试连接的 web 服务服务器在我的 CentOS 以外的其他主机上,但它们之间没有防火墙/acl。路由配置正确(就像我说的,从 php-cli 一切正常)
【问题讨论】:
-
你是如何运行 PHP 的? FPM、Apache、内置服务器?我的猜测是主机解析的工作方式与 CLI 不同(它应该与执行脚本的用户几乎相同)
-
@ArSeN 我从默认存储库安装了带有 httpd/php/php-cli/php-soap 的全新 CentOS 8。我已将主机名更改为 ip(用于 wsdl 地址)- 没有更改。
-
所以您是说使用 IP 它仍然可以在 CLI 中运行,但在使用 httpd 和浏览器执行时不能运行,是吗?在这种情况下,主机解析不应该是问题。除了肥皂,你可以尝试做其他事情吗? wsdl 上的 file_get_contents() 看看问题是否重复?
-
@ArSeN 是的,IP 在 CLI 中仍然有效,但在浏览器中无效。我制作了超级简单的脚本: echo file_get_contents('http://[ip]/services/Assets?wsdl');在 CLI 中它返回 WSDL,而在浏览器中则不返回任何内容(我还检查了网页代码)......为什么?我应该允许在 httpd.conf 中进行远程调用吗?
-
ps。我检查了我的 php.ini,我有
allow_url_fopen = On。我设置了error_reporting(E_ALL);和ini_set('display_errors', '1');现在我收到错误Warning: file_get_contents(http://[ip]/services/Assets?wsdl): failed to open stream: Permission denied in /var/www/html/xxx.php on line 4
标签: php soap soap-client