我有一个脚本,使用file_get_contents()从远程服务器获取json响应。
虽然file_get_contents()在本地文件上正常工作,但不能与http或https一起使用,但它给了我以下错误file_get_contents(): http:// wrapper is disabled in the server configuration by allow_url_fopen=0 infile_get_contents(https://api.domain.com/resolve.json?url=blablabla): failed to open stream: no suitable wrapper could be found ..它是一台专用服务器我有WHM ..我已经尝试过在WHM PHP配置编辑器上设置allow_url_fopen = on,但这没有用。
allow_url_fopen = on中创建一个php.ini文件错误发生的目录,但此目录不起作用。
在PHP脚本的开头添加了ini_set('allow_url_fopen', 'On');,但此目录不起作用。

我知道我可以改用Curl,但我想要知道为什么它不起作用..该脚本在其他服务器和本地主机上正常工作

update:

phpinfo();


给我
/>
allow_url_fopen Off 
allow_url_include   Off 
always_populate_raw_post_data   Off


,这意味着我的php.ini更改未生效..我在做什么错了?

评论

allow_url_fopen可能已被覆盖,因此您无法打开它。即使使用了php.ini等,也可以运行phpinfo()来查看它是否真的被更改了。我的建议是使用卷发。

重新启动Web服务器服务httpd重新启动后,在/ etc /中编辑php.ini

#1 楼

通过ssh登录到服务器,然后在文件中输入

sudo nano /etc/php5/apache2/php.ini //<<<< ubuntu/debian server, might differ for you


,只需按"ctrl + w"并输入"allow_url_fopen"和Return,很可能您会首先进行解释,因此重复搜索几次。现在,您可以将条目从

allow_url_fopen=0
更改为

allow_url_fopen=1

"ctrl + x"并确认文件保存为"y"

然后键入

sudo service apache2 restart


这将重新启动apache,以便可以加载新的php.ini配置。完成这些步骤后,您应该可以从外部使用file_get_contents


SIDENOTE

如果找不到php.ini文件,则会找到phpinfo()顶部的部分中已加载的php.ini文件的路径



评论


谢谢..我忘了检查加载的配置文件..达到目的了..我有一个旧的php.ini public_html文件夹..但是子文件夹中的文件不应该覆盖它吗?

–卡马尔·萨利赫(Kamal Saleh)
2014年12月23日在3:23

这些文件放在我放置新php.ini的子目录中

–卡马尔·萨利赫(Kamal Saleh)
2014年12月23日下午3:26

嗯,我认为主要加载的配置文件将始终在上述位置。

– baao
2014年12月23日下午3:27

#2 楼

$url= 'https://example.com';

$arrContextOptions=array(
      "ssl"=>array(
            "verify_peer"=>false,
            "verify_peer_name"=>false,
        ),
    );  

$response = file_get_contents($url, false, stream_context_create($arrContextOptions));


这将使您无论是HTTPS还是从URL中获取内容,无需更改php ini。

评论


谢谢。这个额外的配置正是解决我们问题的方法。我在这里写了另一个问题的答案(关注问题的突发性)。我引用了您的回答作为我的资料来源:stackoverflow.com/a/48305167/1385429

–克里斯蒂安·韦斯特贝克(Christiaan Westerbeek)
18年1月17日在16:03

不同意,MPDF也使用file_get_contents和许多其他库,您是否为将更改作为其核心代码而推荐更改?

–费尔南多·托雷斯(Fernando Torres)
1月29日19:59

#3 楼

使用curl作为file_get_contents()的替代方法,这是我正在使用的功能

function url_get_contents ($Url) {
    if (!function_exists('curl_init')){ 
        die('CURL is not installed!');
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $Url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $output = curl_exec($ch);
    curl_close($ch);
    return $output;
}


#4 楼

如果您具有root用户访问权限,请编辑php.ini(通常位于/etc/php.ini。)。

如果您没有root用户访问权限,请尝试添加ini_set('allow_url_fopen', 'On');ini_set('allow_url_fopen', '1');php.ini,尝试在PHP脚本中使用phpinfo()来找到php.ini的位置。

#5 楼

$id = $_GET['id'] ;
$api_url = "http://localhost/../API.php?id='$id' ";
$port = 80;
$ch = curl_init( );
curl_setopt ( $ch, CURLOPT_URL, $api_url );
curl_setopt ( $ch, CURLOPT_PORT, $port );
curl_setopt ( $ch, CURLOPT_POST, 1 );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
// Allowing cUrl funtions 20 second to execute
curl_setopt ( $ch, CURLOPT_TIMEOUT, 5 );
// Waiting 20 seconds while trying to connect
curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 5 );                                 
$response_string = curl_exec( $ch );

echo $response_string;


这是解决Web请求问题的最佳方法

#6 楼

这项工作很完美:
function get_site($url) { 
  $file = fopen($url, 'r');
  if(!$file) return;
  $buffer='';
  while(!feof($file))   {
    $buffer .= fgets($file, 4096);
    }
  fclose($file);
  return $buffer;
}


#7 楼

除了上述答案外,SELinux设置可能还不允许您从httpd连接。为此,您可以参考此链接
https://drib.tech/programming/php-file_get_contents-not-working
它对我有用