【发布时间】:2016-04-26 23:45:23
【问题描述】:
我遇到了有史以来最奇怪的头裂问题。真正的问题是我收到了一个 SOAP 错误 SOAP-ERROR: Parsing WSDL: Couldn't load from 'some website' : failed to load external entity
以前是主机不响应、网址错误等造成的,但今天连接主机没有问题。
我正在使用 Symfony 运行 API。我从 API 中剥离了所有的肥皂代码,创建了一个简单的 test.php 文件,并在运行 API 的确切服务器上从命令行运行它,它运行良好!
所以我回到了 Symfony,刷新了缓存。还是不行。
接下来,我决定测试我能做到的最简单的方法,并在发出此 SOAP 调用的服务的最顶部添加了“file_get_contents('the url to the WSDL')”。它返回一个空字符串。错误日志中没有错误。
接下来我尝试将其移至控制器。仍然是一个空字符串。
我试过file_get_contents('https://google.com')。尽管如此,无论我将它粘贴在 Controller 或 Service 的哪个位置,都是空字符串。但是,如果我在同一台服务器上从命令行运行 PHP 脚本,它就没有问题。
我什至不知道从哪里开始向您展示我的代码。因为file_get_contents() 是否在控制器、实体或它正在使用的服务中并不重要。每次返回一个空字符串。
附带说明,这是一个开发服务器。这是生产的精确镜像(他们只是制作了生产服务器的映像)。整个 API 在生产环境以及我的本地开发环境和它部署到的其他环境中都可以正常工作。所以我完全不知道为什么它只是这个服务器,只是这个特定的应用程序。
感谢任何帮助。
==
更新 1
根据朋友的建议,我在 cli php -i 和 apache phpinfo() 中都检查了 allow_url_fopen,在这两种情况下都设置为 On
==
更新 2
按照 Pedro 的建议,我在 API 的控制器中运行了 cURL 测试。这很奏效,它检索了 WDSL 的内容,当然还有 Google。
但是,它并没有解决我的根本问题,即 SOAP 不检索 URL 的内容。也不是明显的file_get_contents() 不起作用。 PHP SOAP 客户端是否使用file_get_contents() 来检索 WSDL?
==
更新 3
对于那些好奇的人来说,这就是代码失败的地方。我不得不省略很多课程,因为它包含我公司的特定信息。
<?php
class Carrier implements CarrierInterface
{
//...omitted code
private function getSoapClient($wsdl)
{
// This line is what fails.
return new \SoapClient( $wsdl , array('trace' => true));
}
//...omitted code
public function quote(QuoteInterface $quote)
{
//Get the Soap Client
$client = $this->getSoapClient($this->quoteWSDL);
// The rest of the SOAP CALL
return $quote;
}
}
但简而言之,$this->quoteWSDL 只是一个 URL,是的,它具有我检查过的正确值。但是在尝试构造声明SOAP-ERROR: Parsing WSDL: Couldn't load from '<url>' : failed to load external entity的SOAP客户端时失败了
==
更新 4(使用 Kinda 解决方案)
重新启动 apache 修复了一切。我不知道为什么我不只是要求系统管理员尽快这样做。就像那里的 IT 101 一样。谢谢你的帮助。但现在我很好奇为什么这是一个开始的问题。很奇怪。
【问题讨论】: