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源代码数组统计count分析
Aug 02 PHP
php中使用cookie来保存用户登录信息的实现代码
Mar 08 PHP
浅谈php serialize()与unserialize()的用法
Jun 05 PHP
Linux中用PHP判断程序运行状态的2个方法
May 04 PHP
利用PHP脚本在Linux下用md5函数加密字符串的方法
Jun 29 PHP
解析WordPress中函数钩子hook的作用及基本用法
Dec 22 PHP
PHP串行化与反串行化实例分析
Dec 27 PHP
PHP实现登陆表单提交CSRF及验证码
Jan 24 PHP
php中通过eval实现字符串格式的计算公式
Mar 18 PHP
PHPExcel中文帮助手册|PHPExcel使用方法(分享)
Jun 09 PHP
Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证操作
Jun 30 PHP
php代码调试利器firephp安装与使用方法分析
Aug 21 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实现文件上传二法
2006/10/09 PHP
php session 错误
2009/05/21 PHP
php验证手机号码(支持归属地查询及编码为UTF8)
2013/02/01 PHP
解析posix与perl标准的正则表达式区别
2013/06/17 PHP
php过滤HTML标签、属性等正则表达式汇总
2014/09/22 PHP
简介PHP的Yii框架中缓存的一些高级用法
2016/03/29 PHP
PHP实现websocket通信的方法示例
2018/08/28 PHP
一个原生的用户等级的进度条
2010/07/03 Javascript
基于jQuery的倒计时实现代码
2012/05/30 Javascript
jQuery简单实现隐藏以及显示特效
2015/02/26 Javascript
JavaScript限定图片显示大小的方法
2015/03/11 Javascript
js生成随机数的方法实例
2015/10/16 Javascript
JavaScript的MVVM库Vue.js入门学习笔记
2016/05/03 Javascript
Vue filters过滤器的使用方法
2017/07/14 Javascript
深入浅析Vue.js中 computed和methods不同机制
2018/03/22 Javascript
详解redis在nodejs中的应用
2018/05/02 NodeJs
JS中移除非数字最多保留一位小数
2018/05/09 Javascript
jQuery使用bind动态绑定事件无效的处理方法
2018/12/11 jQuery
jQuery无冲突模式详解
2019/01/17 jQuery
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
2020/05/12 Javascript
[02:22]《新闻直播间》2017年08月14日
2017/08/15 DOTA
Python实现自动发送邮件功能
2021/03/02 Python
HTML5的一个显示电池状态的API简介
2015/06/18 HTML / CSS
《蒲公英》教学反思
2014/02/28 职场文书
元旦寄语大全
2014/04/10 职场文书
爱心捐款倡议书
2014/04/14 职场文书
安全标兵事迹材料
2014/08/17 职场文书
学习十八届四中全会精神思想汇报
2014/10/23 职场文书
酒店服务员岗位职责
2015/02/09 职场文书
道歉信怎么写
2015/05/12 职场文书
2016年社区服务活动总结
2016/04/06 职场文书
用Python selenium实现淘宝抢单机器人
2021/06/18 Python
关于maven依赖 ${xxx.version}报错问题
2022/01/18 Java/Android
实现AJAX异步调用和局部刷新的基本步骤
2022/03/17 Javascript
德生TECSUN S-2000使用手册文字版
2022/05/10 无线电