file_get_contents()不起作用

时间:2014-12-23 02:53:05

标签: php apache curl

我有一个使用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 ..我&已经尝试了

  1. 在WHM PHP配置编辑器上设置allow_url_fopen = on但这没有用。
  2. 在发生错误的目录中使用allow_url_fopen = on创建一个php.ini文件,但这不起作用。
  3. ini_set('allow_url_fopen', 'On');添加到PHP脚本的开头但这没有用。
  4. 我知道我可以使用Curl,但我想知道为什么这不起作用..脚本在其他服务器和localhost上正常工作

    更新:

    phpinfo();
    

    给了我

    allow_url_fopen Off 
    allow_url_include   Off 
    always_populate_raw_post_data   Off
    

    这意味着我的php.ini更改没有生效..我做错了什么?

7 个答案:

答案 0 :(得分:7)

$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,无需在php ini中进行更改。

答案 1 :(得分:3)

通过ssh登录您的服务器并输入

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

在文件中,只需按"ctrl + w"并输入"allow_url_fopen"并返回,很可能您会先解释,所以重复搜索几次。现在您可以从

更改条目

allow_url_fopen=0

allow_url_fopen=1

"ctrl + x"并使用"y"确认文件保存。

然后输入

sudo service apache2 restart

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


旁注

如果找不到您的php.ini文件,您将在phpinfo()

的顶部找到加载的php.ini文件的路径

enter image description here

答案 2 :(得分: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;
}

答案 3 :(得分:2)

如果您具有超级用户权限,请修改php.ini,通常位于/etc/php.ini

如果您没有超级用户权限,请尝试添加ini_set('allow_url_fopen', 'On');ini_set('allow_url_fopen', '1');

如果您看不到php.ini,请尝试在PHP脚本中使用phpinfo()来查找php.ini位置。

答案 4 :(得分:0)

$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请求问题的最佳方法

答案 5 :(得分:0)

这项工作很完美:

function get_site($url) { 
  $file = fopen($url, 'r');
  if(!$file) return;
  $buffer='';
  while(!feof($file))   {
    $buffer .= fgets($file, 4096);
    }
  fclose($file);
  return $buffer;
}

答案 6 :(得分:0)

除了上述答案外,SELinux设置可能还不允许您从httpd连接。为此,您可以参考此链接 installing it using pip

对我有用