带有https的PHP file_get_contents参数返回false

时间:2017-10-12 14:58:48

标签: php https file-get-contents

php.net中关于url的所有示例都只使用http而非https进行了演示。我真的不明白为什么用https没有证明这一点。 file_get_contents对于http URL返回true,对于https返回false URL。

  1. 我是否需要在正在执行此功能的服务器中启用某些功能?
  2. 我知道这是一个逻辑错误,但这个逻辑错误发生在内置函数中。我没有任何语法错误。我在这里错过了什么?
  3. 我的预期输出是,当传入https网址时,从file_get_contents获得true返回。
  4. 代码:

    function connectMe() {
       $urlHeader = $_REQUEST['urlHeader'];
       // if this is a http url it's working for file_get_contents returns true
       // if this is a https url it's not working file_get_contents gives false
       $status = send($urlHeader);
       var_dump($status);
       echo $status ? 'success' : 'failed';
       exit;
    }
    
    function send($url) {
        $ctx = stream_context_create(
            array(
            'http'=>array(
            'header'=>"Content-type: application/x-www-form-urlencoded",
            'method'=>'POST',
            'content'=>NULL
            )
          )
        );
    var_dump(stream_get_wrappers());
    $w = stream_get_wrappers();
    echo 'openssl: ',  extension_loaded  ('openssl') ? 'yes':'no', "\n";
    echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', "\n";
    echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', "\n";
    echo 'wrappers: ', var_export($w);
    return file_get_contents($url, 0, $ctx);
    }
    

    注意:  1.上面的代码已根据stackoverflow中给出的解决方案进行了集成,其中结果中没有任何变化。  2. openssl已启用且allow_url_fopen已启用。

    我得到的输出:

    array(9){[0] => string(5)" https" [1] => string(4)" ftps" [2] => string(3)" php" [3] => string(4)" file" [4] => string(4)" glob" [5] => string(4)" data" [6] => string(4)" http" [7] => string(3)" ftp" [8] => string(4)" phar" }

    openssl:是http包装器:是https包装器:是包装器:数组(0 =>' https',1 =>' ftps',2 =>&# 39; php',3 =>' file',4 =>' glob',5 =>'数据',6 => ' http',7 =>' ftp',8 =>' phar',)

    警告:file_get_contents():php_network_getaddresses:gethostbyname失败。第40行的FILENAME.PHP中的errno = 0

    警告:file_get_contents(https://someIPhere或网站):无法打开流:php_network_getaddresses:gethostbyname失败。第40行的FILENAME.PHP中的errno = 0

    布尔(假)失败

1 个答案:

答案 0 :(得分:0)

您可能会指向自签名的ssl。如果是这样,那可能就是原因。检查以确保URL具有有效的SSL证书。

如果您想绕过SSL验证,则需要添加stream_context_create来设置' verify_peer' =>假的。

请参阅: file_get_contents(): SSL operation failed with code 1 (certificate verify failed)