【问题标题】:file_get_contents() returning empty stringfile_get_contents() 返回空字符串
【发布时间】: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-&gt;quoteWSDL 只是一个 URL,是的,它具有我检查过的正确值。但是在尝试构造声明SOAP-ERROR: Parsing WSDL: Couldn't load from '&lt;url&gt;' : failed to load external entity的SOAP客户端时失败了

==

更新 4(使用 Kinda 解决方案)

重新启动 apache 修复了一切。我不知道为什么我不只是要求系统管理员尽快这样做。就像那里的 IT 101 一样。谢谢你的帮助。但现在我很好奇为什么这是一个开始的问题。很奇怪。

【问题讨论】:

    标签: php symfony soap


    【解决方案1】:

    我的猜测是 allow_url_fopen 已禁用。
    要启用它,您必须在php.ini 上设置allow_url_fopen=1。 重启 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:对于未来的用户:请务必阅读下面的 cmets。

    【讨论】:

    • 是的,实际上在您发布答案之前检查了这一点。它已启用。我不明白为什么它会被禁用,因为这个开发服务器是生产服务器的映像。
    • 我肯定会使用curl
    • 我可以使用 curl 进行测试,但最终我需要一些东西来使用 SOAP,因为这是为了与 SOAP API 对话。
    • curlfile_get_contents 更完整,您会发现大量示例。
    • file_get_contents() 并不是真正的问题。我只是以它为例来证明我无法获取 URL 的内容。实际代码使用的是 php SOAP 库。我猜想使用file_get_contents() 来检索我传递给它的WSDL。但就您而言, curl 示例确实有效。所以现在我们已经展示了这个问题在某种程度上与 SOAP 以及它用来获取 WSDL 的方法有关。
    猜你喜欢
    • 2011-05-09
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    相关资源
    最近更新 更多