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 相关文章推荐
PHP一些有意思的小区别
Dec 06 PHP
php Undefined index的问题
Jun 01 PHP
php设计模式 Factory(工厂模式)
Jun 26 PHP
深入解析PHP的引用计数机制
Jun 14 PHP
php+js实现图片的上传、裁剪、预览、提交示例
Aug 27 PHP
PHP中执行MYSQL事务解决数据写入不完整等情况
Jan 07 PHP
php mysql_list_dbs()函数用法示例
Mar 29 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
Feb 06 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
Aug 20 PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
May 25 PHP
php 的多进程操作实践案例分析
Feb 28 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
May 02 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
模仿OSO的论坛(一)
2006/10/09 PHP
PHP 采集心得技巧
2009/05/15 PHP
php接口数据加密、解密、验证签名
2015/03/12 PHP
PHP中使用foreach()遍历二维数组的简单实例
2016/06/13 PHP
JavaScript 常用函数
2009/12/30 Javascript
js中将具有数字属性名的对象转换为数组
2011/03/06 Javascript
原生js实现查找/添加/删除/指定元素的class
2013/04/12 Javascript
浅析Node.js查找字符串功能
2014/09/03 Javascript
jQuery实现仿美橙互联两级导航菜单的方法
2015/03/09 Javascript
14款经典网页图片和文字特效的jQuery插件-前端开发必备
2015/08/25 Javascript
javascript巧用eval函数组装表单输入项为json对象的方法
2015/11/25 Javascript
基于JavaScript实现一定时间后去执行一个函数
2015/12/14 Javascript
javascript实现的左右无缝滚动效果
2016/09/19 Javascript
JavaScript获取ul中li个数的方法
2017/02/13 Javascript
老生常谈js-react组件生命周期
2017/05/02 Javascript
JavaScript实现无穷滚动加载数据
2017/05/06 Javascript
jQuery实现checkbox的简单操作
2017/11/18 jQuery
详解Webpack loader 之 file-loader
2018/11/07 Javascript
JavaScript碎片—函数闭包(模拟面向对象)
2019/03/13 Javascript
微信小程序rich-text富文本用法实例分析
2019/05/20 Javascript
微信小程序如何调用json数据接口并解析
2019/06/29 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
2019/10/10 jQuery
微信小程序入门之指南针
2020/10/22 Javascript
Python之str操作方法(详解)
2017/06/19 Python
Python小进度条显示代码
2019/03/05 Python
树莓派动作捕捉抓拍存储图像脚本
2019/06/22 Python
python实现日志按天分割
2019/07/22 Python
Django xadmin开启搜索功能的实现
2019/11/15 Python
浅谈Tensorflow 动态双向RNN的输出问题
2020/01/20 Python
Python实现封装打包自己写的代码,被python import
2020/07/12 Python
Huda Beauty官方商店:化妆和美容产品
2020/09/05 全球购物
27个经典Linux面试题及答案,你知道几个?
2014/03/11 面试题
煤矿安全生产标语
2014/06/06 职场文书
倡议书范文大全
2015/04/28 职场文书
2015年安置帮教工作总结
2015/05/22 职场文书
小学教师师德培训心得体会
2016/01/09 职场文书