跨越版本和操作系统的PHP file_get_contents行为

时间:2017-05-22 18:49:35

标签: php apache ubuntu xampp windows-10

我在PHP中使用file_get_contents来从contentDM上的客户端集合中获取信息。 CDM有一个API,因此您可以通过进行php查询来获取该信息,例如:

http://servername:port/webutilities/index.php?q=function/arguments

到目前为止,它在计算机和操作系统方面运行良好。然而,这次事情的工作方式略有不同。

http://servername/utils/collection/mycollectionname/id/myid/filename/myname

对于此查询,我使用相关值填写mycollection,myid和myname。显然,myid和mycollection必须存在于系统中。但是,myname可以是你想要的任何东西。运行查询时,它不会向浏览器返回网页或任何内容。它只是自动下载一个带有myname作为文件名的文件,并将其放在本地/下载文件夹中。

我不想下载这个文件。我只想读取它作为字符串直接返回PHP的文件的内容。我试图得到的文件只包含xml数据。

file_get_contents用于获取该文件中的数据,如果我在运行Ubuntu的笔记本电脑上使用PHP7和Apache。但是,在运行Windows 10和XAMPP(Apache和PHP5)的桌面上,我收到此错误(我用###替换了敏感数据):

  

警告:   的file_get_contents(### / utils的/收集/ ### / ID / 1110 /文件名/ 1111.cpd):   无法打开流:没有这样的文件或目录   d:\泰特斯\文档\ GitHub的\ NativeAmericanSCArchive \ NASCA现场\ API \ update.php   第18行

我的同事一直无法帮助我所以我很好奇这里是否有人可以确认或否认这是一个操作系统问题,还是PHP版本问题,以及是否有一个可靠的替代方法可能在PHP5中起作用以及Windows和Ubuntu。

1 个答案:

答案 0 :(得分:0)

file_get_contents()是一个简单的螺丝刀。通过简单的GET请求获取数据非常有用,其中标头,HTTP请求方法,超时,cookiejar,重定向和其他重要事项无关紧要。

带有流上下文的fopen()或带有setopt的cURL是powerdrills,你可以想到每个位和选项。

除此之外,由于最近的一些网站黑客攻击,我们必须更多地保护我们的网站。在这样做的过程中,我们发现file_get_contents无法正常工作,curl仍然有效。

不是100%,但我相信这个php.ini设置可能阻止了file_get_contents请求。

; Disable allow_url_fopen for security reasons
allow_url_fopen = 0

无论哪种方式,我们的代码现在都适用于curl。

参考: http://25labs.com/alternative-for-file_get_contents-using-curl/ http://phpsec.org/projects/phpsecinfo/tests/allow_url_fopen.html

因此,您可以使用PHP cURL扩展来解决此问题。这是一个与您尝试相同的示例:

function curl($url)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $data = curl_exec($ch);
        curl_close($ch);

        return $data;
    }
$url = 'your_api_url';
$data = curl($url);

最后,您可以通过print_r($ data)检查数据。希望你它会起作用,你会理解。

参考http://php.net/manual/en/book.curl.php