修复了file_get_contents权限被拒绝的错误

时间:2018-02-17 19:20:58

标签: php json curl

大家好我有一个与JSON和PHP相关的问题。因此,如果您访问此网站:http://air.moepp.gov.mk/graphs/site/pages/MakeGraph.php?station=SkopjeRegion&parameter=PM10D&beginDate=2018-02-10&beginTime=19:00&endDate=2018-02-17&endTime=19:00&i=1518893212453&lang=en

作为一个返回,你得到HTML,但是如果你去回复,响应是纯JSON,所以我试图获取JSON数据,但是我失败了。可能我做错了什么,但我不知道是什么。我尝试使用file_get_contents()curl,但我从中得不到任何东西......所以这就是我要做的事情:

<?php
$content = file_get_contents('http://air.moepp.gov.mk/graphs/site/pages/MakeGraph.php?station=SkopjeRegion&parameter=PM10D&beginDate=2018-02-10&beginTime=12:00&endDate=2018-02-17&endTime=12:00&i=1518865590001&lang=en');  
$contents = json_decode($content, true);  
var_dump($contents);

作为回报,我得到NULL

这是编辑!!!

所以,感谢stackoverflow的那些人,我发现我的PHP函数file_get_contents()由于权限问题而无法正常工作,问题是:

file_get_contents('url'): failed to open stream: Permission denied in /var/www/html/xxx.php on line X

在谷歌搜索和来自@geoidesic的建议后,我发现SELinux(安全增强型Linux)阻止了Apache(默认情况下,httpd(Apache)的网络连接被禁用。所以我按照{{{}的分步教程进行了操作。最后,如果有人需要它,这就是解决方案:

  1. 请确保您的php.ini文件中包含allow_url_fopen=On。 (如果有人不知道你的php.ini文件在哪里,快速检查phpinfo()可以得到你所有的东西。
  2. 检查SELinux的状态:

    sudo sestatus

    如果状态为启用,则可以检查是否启用了布尔标志 httpd_can_network_connect httpd_unified ,设置为1:

    sudo sestatus -b | grep httpd_can_network_connectsudo sestatus -b | grep httpd_unified

    如果它们已关闭,请运行此命令将其设置为:

    sudo setsebool -P httpd_can_network_connect 1 sudo setsebool -P httpd_unified 1

    然后重启,或重启httpd。所以,再一次,非常感谢http://drib.tech/programming/php-file_get_contents-not-working的那个人。

3 个答案:

答案 0 :(得分:4)

我刚才遇到了同样的问题,这是由selinux引起的。

通过运行解决:

sudo setsebool -P httpd_can_network_connect 1
sudo setsebool -P httpd_unified 1

答案 1 :(得分:0)

检查您的PHP错误日志。可能您遇到网络问题,您的PHP实例无法访问该URL。例如,您可能是从没有外部网络访问权限的虚拟环境中运行它。

file_get_contents('google.com')为例,看看你得到了什么。

我尝试了你的代码,它对我来说很有效。我收回了JSON。

我不知道你为什么这么说&#34;如果你访问这个网站......你会得到HTML&#34;因为你没有,你得到JSON。

答案 2 :(得分:-1)

使用$content = readfile('url');,应该没有错误。

我也遇到了这个问题,但是仍然有效,而且readfile is faster than file_get_contents

相关问题