如何让file_get_contents()与HTTPS一起使用?

时间:2009-12-29 16:23:29

标签: php curl https file-get-contents

我正在设置信用卡处理,需要使用CURL的解决方法。当我使用测试服务器(没有调用SSL URL)时,以下代码工作正常,但现在当我在使用HTTPS的工作服务器上测试它时,它失败并显示错误消息“无法打开流”。

function send($packet, $url) {
  $ctx = stream_context_create(
    array(
      'http'=>array(
        'header'=>"Content-type: application/x-www-form-urlencoded",
        'method'=>'POST',
        'content'=>$packet
      )
    )
  );
  return file_get_contents($url, 0, $ctx);
}

13 个答案:

答案 0 :(得分:112)

允许https包装:

  • php_openssl扩展必须存在且已启用
  • allow_url_fopen必须设为on

在php.ini文件中,如果不存在,则应添加以下行:

extension=php_openssl.dll

allow_url_fopen = On

答案 1 :(得分:86)

尝试使用以下脚本来查看是否有适用于您的php脚本的https包装器。

$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);

输出应该是

openssl: yes
http wrapper: yes
https wrapper: yes
wrappers: array(11) {
  [...]
}

答案 2 :(得分:50)

请尝试以下操作。

function getSslPage($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_REFERER, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}
  

注意:这会禁用SSL验证,这意味着提供的安全性   通过HTTPS丢失。仅使用此代码进行测试/本地   发展,从不在互联网上或其他面向公众的   网络。如果此代码有效,则表示SSL证书不起作用   信任或无法验证,你应该考虑修复为   单独的问题。

答案 3 :(得分:35)

$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

答案 4 :(得分:9)

这可能是由于您的目标服务器没有有效的SSL证书。

答案 5 :(得分:6)

只需在php.ini文件中添加两行。

extension=php_openssl.dll

allow_url_include = On

它为我工作。

答案 6 :(得分:5)

如果您已编译支持OpenSSL,则从PHP 4.3.0开始支持HTTPS。 此外,确保目标服务器具有有效证书,防火墙允许出站连接,并且php.ini中的allow_url_fopen设置为true。

答案 7 :(得分:5)

我有同样的错误。在allow_url_include = On中设置php.ini为我修复了它。

答案 8 :(得分:3)

在我的情况下,问题是由于WAMP使用不同于php的php.ini而不是Apache,因此通过WAMP菜单进行的设置不适用于CLI。只需修改CLI php.ini即可。

答案 9 :(得分:1)

有时,服务器会根据它在http请求标头中看到或看不到的内容(例如适当的用户代理)选择不响应。如果您可以使用浏览器进行连接,请抓住它发送的标题并在流上下文中模仿它们。

答案 10 :(得分:1)

使用以下代码:

$homepage = file_get_contents("https://www.google.com",false,
                             stream_context_create([
                                'ssl'  => [
                                    'verify_peer'      => false,
                                    'verify_peer_name' => false,
                                ]
                            ])
            );
    
 echo $homepage;

答案 11 :(得分:0)

我在IIS上无法正常使用https。解决:

file_get_contents('https ..)将不会加载。

  • 下载https://curl.haxx.se/docs/caextract.html
  • 在..phpN.N / extras / ssl下安装
  • 使用以下命令编辑php.ini:

    curl.cainfo =“ C:\ Program Files \ PHP \ v7.3 \ extras \ ssl \ cacert.pem” openssl.cafile =“ C:\ Program Files \ PHP \ v7.3 \ extras \ ssl \ cacert.pem”

最后!

答案 12 :(得分:-1)

检查网址是否已启用

您问题中的代码可以重写为工作版本:

function send($packet=NULL, $url) {
// Do whatever you wanted to do with $packet
// The below two lines of code will let you know if https url is up or not
$command = 'curl -k '.$url;
return exec($command, $output, $retValue);
}