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 相关文章推荐
第六节 访问属性和方法 [6]
Oct 09 PHP
无数据库的详细域名查询程序PHP版(3)
Oct 09 PHP
PHP学习资料汇总与网址
Mar 16 PHP
PHP 获取远程文件大小的3种解决方法
Jul 11 PHP
php的hash算法介绍
Feb 13 PHP
PHP开发微信支付的代码分享
May 25 PHP
解密ThinkPHP3.1.2版本之模板继承
Jun 19 PHP
php生成不重复随机数、数组的4种方法分享
Mar 30 PHP
总结PHP删除字符串最后一个字符的三种方法
Aug 30 PHP
遍历echsop的region表形成缓存的程序实例代码
Nov 01 PHP
php mysql获取表字段名称和字段信息的三种方法
Nov 13 PHP
laravel与thinkphp之间的区别与优缺点
Mar 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
PHP5 面向对象(学习记录)
2009/12/02 PHP
深入解析php中的foreach问题
2013/06/30 PHP
部署PHP项目应该注意的几点事项分享
2013/12/20 PHP
PHP使用CURL实现多线程抓取网页
2015/04/30 PHP
PHP弹出对话框技巧详细解读
2015/09/26 PHP
thinkPHP统计排行与分页显示功能示例
2016/12/02 PHP
AngularJS的表单使用详解
2015/06/17 Javascript
JavaScript实现图片切换效果
2017/08/12 Javascript
使用vue-aplayer插件时出现的问题的解决
2018/03/02 Javascript
Javascript实现异步编程的过程
2018/06/18 Javascript
微信内置浏览器图片查看器的代码实例
2019/10/08 Javascript
ES6 Iterator遍历器原理,应用场景及相关常用知识拓展详解
2020/02/15 Javascript
python操作数据库之sqlite3打开数据库、删除、修改示例
2014/03/13 Python
python编程培训 python培训靠谱吗
2018/01/17 Python
windows下python安装pip图文教程
2018/05/25 Python
Python unittest单元测试框架总结
2018/09/08 Python
Python qrcode 生成一个二维码的实例详解
2020/02/12 Python
利用Tensorboard绘制网络识别准确率和loss曲线实例
2020/02/15 Python
keras中的卷积层&amp;池化层的用法
2020/05/22 Python
Python实现微信表情包炸群功能
2021/01/28 Python
GAP欧盟网上商店:GAP EU
2016/09/13 全球购物
SEPHORA新西兰官方网站:购买化妆品和护肤品
2016/12/02 全球购物
Algenist奥杰尼官网:微藻抗衰老护肤品牌
2017/07/15 全球购物
世界顶级足球门票网站:Live Football Tickets
2017/10/14 全球购物
贝嫂喜欢的婴儿品牌,个性化的婴儿礼物:My 1st Years
2017/11/19 全球购物
BISSELL官网:北美吸尘器第一品牌
2019/03/14 全球购物
总务岗位职责
2013/11/19 职场文书
2014年应届大学生自我评价
2014/01/09 职场文书
心理学专业求职信
2014/06/16 职场文书
幼儿园六一活动总结
2014/08/27 职场文书
单位一把手群众路线四风问题整改措施
2014/09/25 职场文书
民间借贷协议书范本
2014/10/01 职场文书
爱牙日宣传活动总结
2015/02/05 职场文书
导游词书写之黄山
2019/08/06 职场文书
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android
在容器中使用nginx搭建上传下载服务器
2022/05/11 Servers