PHP实现抓取HTTPS内容


Posted in PHP onDecember 01, 2014

最近在研究Hacker News API时遇到一个HTTPS问题。因为所有的Hacker News API都是通过加密的HTTPS协议访问的,跟普通的HTTP协议不同,当使用PHP里的函数 file_get_contents() 来获取API里提供的数据时,出现错误,使用的代码是这样的:

<?php
$data = file_get_contents("https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty");
......

当运行上面的代码是遇到下面的错误提示:

PHP Warning:  file_get_contents(): Unable to find the wrapper "https" - did you forget to enable it when you configured PHP?

下面是截图:

PHP实现抓取HTTPS内容

为什么会出现这样的错误?

在网上经过一番搜索,发现遇到这样错误的人还不少,问题很直接,是因为在PHP的配置文件里没有开启一个参数,在我本机上是 /apache/bin/php.ini 里的 ;extension=php_openssl.dll 这一项,需要将前面的分号去掉。你可以用下面的脚本来检查你的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_dump($w);

运行上面的这个脚本片段,在我的机器上得到的结果是:

openssl: no
http wrapper: yes
https wrapper: no
wrappers: array(10) {
  [0]=>
  string(3) "php"
  [1]=>
  string(4) "file"
  [2]=>
  string(4) "glob"
  [3]=>
  string(4) "data"
  [4]=>
  string(4) "http"
  [5]=>
  string(3) "ftp"
  [6]=>
  string(3) "zip"
  [7]=>
  string(13) "compress.zlib"
  [8]=>
  string(14) "compress.bzip2"
  [9]=>
  string(4) "phar"
}

替代方案

发现错误,改正错误,这很简单,困难的是,发现错误后无法改正错误。我原本是想将这个脚本方法远程主机上,但我无法修改远程主机的PHP配置,结果是,我无法使用这一方案,但我们不能在一棵树上吊死,这条路走不通,看看有没有其它路。

另外一个我经常用的PHP里抓取内容的函数是 curl ,它比 file_get_contents() 更强大,提供了很多的可选参数。对于访问 HTTPS 内容的问题,我们需要使用的 CURL 配置参数是:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

你可以从语义上看出,它是忽略/跳过了SSL安全验证。也许这不是一个很好的做法,但对于普通的场景中,这几经足够了。

下面是利用 Curl 封装的一个能访问HTTPS内容的函数:

function getHTTPS($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;
}

以上就是php获取https内容的全部过程了,很简单很实用,推荐给有相同项目需求的小伙伴。

PHP 相关文章推荐
phpBB BBcode处理的漏洞
Oct 09 PHP
基于mysql的论坛(6)
Oct 09 PHP
PHP ajax 分页类代码
Nov 13 PHP
探讨php中header的用法详解
Jun 07 PHP
php empty()与isset()区别的详细介绍
Jun 17 PHP
基于PHP的简单采集数据入库程序
Jul 30 PHP
zend framework框架中url大小写问题解决方法
Aug 19 PHP
php设置静态内容缓存时间的方法
Dec 01 PHP
详解PHP中的Traits
Jul 29 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
Dec 31 PHP
PHPCMS忘记后台密码的解决办法
Oct 30 PHP
laravel框架邮箱认证实现方法详解
Nov 22 PHP
php设置静态内容缓存时间的方法
Dec 01 #PHP
thinkphp实现发送邮件密码找回功能实例
Dec 01 #PHP
PHP清除字符串中所有无用标签的方法
Dec 01 #PHP
php防止网站被刷新的方法汇总
Dec 01 #PHP
phpstorm编辑器乱码问题解决
Dec 01 #PHP
php获取文章上一页与下一页的方法
Dec 01 #PHP
CI框架给视图添加动态数据
Dec 01 #PHP
You might like
PHP QRCODE生成彩色二维码的方法
2016/05/19 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
2016/05/22 PHP
smarty的section嵌套循环用法示例
2016/05/28 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
为指定元素增加样式的js代码
2009/12/09 Javascript
Jquery replace 字符替换实现代码
2010/12/02 Javascript
基于jquery的复制网页内容到WORD的实现代码
2011/02/16 Javascript
JS特权方法定义作用以及与公有方法的区别
2013/03/18 Javascript
jQuery获得内容和属性方法及示例
2013/12/02 Javascript
js showModalDialog弹出窗口实例详解
2014/01/07 Javascript
Jquery搜索父元素操作方法
2015/02/10 Javascript
js实现温度计时间样式代码分享
2015/08/21 Javascript
JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)
2016/06/17 Javascript
KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
2016/10/11 Javascript
解决VUEX兼容IE上的报错问题
2018/03/01 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
2018/04/28 Javascript
微信小程序wx:for循环的实例详解
2018/10/07 Javascript
extjs图表绘制之条形图实现方法分析
2020/03/06 Javascript
Python中用startswith()函数判断字符串开头的教程
2015/04/07 Python
使用Python编写一个在Linux下实现截图分享的脚本的教程
2015/04/24 Python
Python数据结构与算法之图结构(Graph)实例分析
2017/09/05 Python
Python函数中不定长参数的写法
2019/02/13 Python
java判断三位数的实例讲解
2019/06/10 Python
Pytorch上下采样函数--interpolate用法
2020/07/07 Python
Python爬虫之Selenium实现关闭浏览器
2020/12/04 Python
浅析几个CSS3常用功能的写法
2014/06/05 HTML / CSS
Canvas引入跨域的图片导致toDataURL()报错的问题的解决
2018/09/19 HTML / CSS
HTML5 weui使用笔记
2019/11/21 HTML / CSS
SportsDirect.com马来西亚:英国第一体育零售商
2018/11/21 全球购物
音乐器材管理制度
2014/01/31 职场文书
会计专业职业规划:规划自我赢取未来
2014/02/12 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
延安红色之旅心得体会
2014/10/07 职场文书
2014年保育员工作总结
2014/12/02 职场文书
国情备忘录观后感
2015/06/04 职场文书
Go 通过结构struct实现接口interface的问题
2021/10/05 Golang