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 相关文章推荐
一个简易需要注册的留言版程序
Oct 09 PHP
Phpbean路由转发的php代码
Jan 10 PHP
PHP OPCode缓存 APC详细介绍
Oct 12 PHP
PHPMailer使用教程(PHPMailer发送邮件实例分析)
Dec 06 PHP
thinkphp中连接oracle时封装方法无法用的解决办法
Jun 17 PHP
php一行代码获取文件后缀名实例分析
Nov 12 PHP
php中mkdir函数用法实例分析
Nov 15 PHP
php ajax实现文件上传进度条
Mar 29 PHP
PHP之将POST数据转化为字符串的实现代码
Nov 03 PHP
PHP中递归的实现实例详解
Nov 14 PHP
PHP+Session防止表单重复提交的解决方法
Apr 09 PHP
php对微信支付回调处理的方法
Aug 23 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
在Windows XP下安装Apache+MySQL+PHP环境
2015/02/22 PHP
php通过asort()给关联数组按照值排序的方法
2015/03/18 PHP
在php和MySql中计算时间差的方法详解
2015/03/27 PHP
php结合md5的加密解密算法实例
2016/09/30 PHP
php导出csv文件,可导出前导0实例代码
2016/11/16 PHP
thinkPHP5 tablib标签库自定义方法详解
2017/05/10 PHP
实例解析php的数据类型
2018/10/24 PHP
Yii框架视图、视图布局、视图数据块操作示例
2019/10/14 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
用roll.js实现的图片自动滚动+鼠标触动的特效
2007/03/18 Javascript
弹出层之1:JQuery.Boxy (一) 使用介绍
2011/10/06 Javascript
基于jquery插件实现常见的幻灯片效果
2013/11/01 Javascript
js实现简洁的TAB滑动门效果代码
2015/09/06 Javascript
Vue 父子组件、组件间通信
2017/03/08 Javascript
webstorm中vue语法的支持详解
2018/05/09 Javascript
微信小程序ibeacon三点定位详解
2018/10/31 Javascript
Koa从零搭建到Api实现项目的搭建方法
2019/07/30 Javascript
JS实现图片切换特效
2019/12/23 Javascript
微信小程序实现吸顶效果
2020/01/08 Javascript
[54:10]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
[01:04:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第二场 1月31日
2021/03/11 DOTA
使用Python下载歌词并嵌入歌曲文件中的实现代码
2015/11/13 Python
Python网络爬虫出现乱码问题的解决方法
2017/01/05 Python
python决策树之C4.5算法详解
2017/12/20 Python
python实现图像识别功能
2018/01/29 Python
浅谈numpy数组中冒号和负号的含义
2018/04/18 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
2018/10/14 Python
python之pymysql模块简单应用示例代码
2019/12/16 Python
python中scipy.stats产生随机数实例讲解
2021/02/19 Python
教育学专业实习生的自我鉴定
2013/11/26 职场文书
农民工工资支付承诺函
2014/03/31 职场文书
《理想的风筝》教学反思
2014/04/11 职场文书
2014年小学体育工作总结
2014/12/11 职场文书
行政文员岗位职责
2015/02/04 职场文书
MySql 8.0及对应驱动包匹配的注意点说明
2021/06/23 MySQL
java版 联机五子棋游戏
2022/05/04 Java/Android