我有一个最奇怪的,头部分裂的问题。真正的问题是我收到了SOAP错误SOAP-ERROR: Parsing WSDL: Couldn't load from 'some website' : failed to load external entity
过去它是由主机没有响应,网址错误等引起的。但今天我连接到主机没有问题。
我正在使用Symfony来运行API。我从API中删除了所有的soap代码,创建了一个简单的test.php文件,并在运行API的确切服务器上从命令行运行它,它运行得很好!
所以我回到了Symfony,刷新了缓存。仍然没有工作。
接下来,我决定测试我能做的最简单的方法,然后在服务的最顶层制作这个SOAP文件_get_contents(' url到WSDL')`呼叫。它返回一个空字符串。错误日志中没有错误。
接下来我尝试将其移至Controller。仍然是一个空字符串。
我试过了file_get_contents('https://google.com')
。无论我在控制器或服务中的哪个地方,它都是空字符串。但是,如果在同一台服务器上我从命令行运行PHP脚本,它没有问题。
我甚至不知道从哪里开始向我展示我的代码。因为file_get_contents()
位于控制器,实体或其使用的服务中并不重要。每次返回一个空字符串。
作为旁注,这是一个开发服务器。这是生产的精确镜像(他们只是制作了生产服务器的图像)。整个API在生产中以及在我的本地开发环境以及已部署到的其他环境中都能正常工作。所以我完全不知道为什么它只是这个服务器,而只是这个特定的应用程序。
感谢任何帮助。
==
根据朋友的建议,我在cli allow_url_fopen
和apache php -i
中检查了phpinfo()
,在这两种情况下,它都设置为On
==
Pedro建议我在API的控制器中运行cURL测试。这很有效,它检索了WDSL的内容,当然还有谷歌。
然而,它并没有解决我的根本问题,即SOAP没有检索URL的内容。明显的file_get_contents()
也不起作用。 PHP SOAP客户端是否使用file_get_contents()
来检索WSDL?
==
对于那些好奇的人来说,这就是代码失败的地方。我必须省略很多课程,因为它包含了我公司特有的信息。
<?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
只是一个网址,是的,它有一个我检查过的正确值。但是在尝试构建声明SOAP-ERROR: Parsing WSDL: Couldn't load from '<url>' : failed to load external entity
==
重启apache修复了一切。我不确定为什么我不能让SysAdmin尽快这样做。那就像IT 101那样。谢谢你的帮助。但现在我很好奇为什么这是一个问题。怪异。
答案 0 :(得分:2)
我猜是allow_url_fopen被禁用了
要启用它,您必须在allow_url_fopen=1
上设置php.ini
。
重新启动Apache服务器以重新加载配置。
您是否考虑过使用curl?这是一个例子:
$url = "http://google.com";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$contents = curl_exec($ch);
curl_close($ch);
PS:对于将来的用户:请务必阅读以下评论。