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

我正在设置信用卡处理,并需要使用CURL的解决方法。 当我使用testing服务器(不调用SSL URL)时,下面的代码工作正常,但是现在当我使用HTTPS在工作服务器上testing它时,失败并显示“未能打开stream”错误消息。

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

尝试下面的脚本,看看是否有一个HTTPS包装可用于您的PHP脚本。

 $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) { [...] } 

要允许https封装器:

  • php_openssl扩展名必须存在并被启用
  • allow_url_fopen必须设置为on

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

 extension=php_openssl.dll allow_url_fopen = On 

尝试以下操作:

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

这将允许您从url中获取内容,无论它是否是HTTPS

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

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

extension=php_openssl.dll

allow_url_include = On

它为我工作。

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

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

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

有时服务器会根据在http请求标头中看到或没有看到的内容(例如合适的用户代理)select不作出响应。 如果你可以连接到浏览器,抓住它发送的头文件,并在你的stream上下文中模仿它们。

检查URL是否存在

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

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