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 相关文章推荐
Zend公司全球首推PHP认证
Oct 09 PHP
PHP的中问验证码
Nov 25 PHP
使用bcompiler对PHP文件进行加密的代码
Aug 29 PHP
php中通过虚代理实现延迟加载的实现代码
Jun 10 PHP
PHP多线程批量采集下载美女图片的实现代码(续)
Jun 03 PHP
php中chdir()函数用法实例
Nov 13 PHP
php使用类继承解决代码重复的问题
Feb 11 PHP
PHP实现的memcache环形队列类实例
Jul 28 PHP
php处理单文件、多文件上传代码分享
Aug 24 PHP
PHP多线程模拟实现秒杀抢单
Feb 07 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
Apr 15 PHP
tp5递归 无限级分类详解
Oct 18 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
一个ftp类(ini.php)
2006/10/09 PHP
php递归实现无限分类生成下拉列表的函数
2010/08/08 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
2012/04/02 PHP
PHP面相对象中的重载与重写
2017/02/13 PHP
Yii2框架操作数据库的方法分析【以mysql为例】
2019/05/27 PHP
csdn 论坛技术区平均给分功能
2009/11/07 Javascript
根据对象的某一属性进行排序的js代码(如:name,age)
2010/08/10 Javascript
jquery中防刷IP流量软件影响统计的一点对策
2011/07/10 Javascript
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
2013/04/01 Javascript
jquery可见性过滤选择器使用示例
2013/06/24 Javascript
JS小功能(列表页面隔行变色)简单实现
2013/11/28 Javascript
javascript实现日期格式转换
2014/12/16 Javascript
Javascript验证方法大全
2015/09/21 Javascript
JavaScript实现通过select标签跳转网页的方法
2016/09/29 Javascript
微信小程序开发(二)图片上传+服务端接收详解
2017/01/11 Javascript
JS 组件系列之BootstrapTable的treegrid功能
2017/06/16 Javascript
JS模拟超市简易收银台小程序代码解析
2017/08/18 Javascript
说说AngularJS中的$parse和$eval的用法
2017/09/14 Javascript
信息滚动效果的实例讲解
2017/09/18 Javascript
ES6中Class类的静态方法实例小结
2017/10/28 Javascript
vue使用vue-i18n实现国际化的实现代码
2018/04/08 Javascript
vue mounted组件的使用
2018/06/18 Javascript
vue2.0 使用element-ui里的upload组件实现图片预览效果方法
2018/09/04 Javascript
详解python使用Nginx和uWSGI来运行Python应用
2018/01/09 Python
Python通过递归获取目录下指定文件代码实例
2019/11/07 Python
python3代码输出嵌套式对象实例详解
2020/12/03 Python
瑞典最好的运动鞋专卖店:Sneakersnstuff
2016/08/29 全球购物
巴西体育用品商店:Lojão dos Esportes
2018/07/21 全球购物
HelloFresh奥地利:立即订购烹饪盒
2019/02/22 全球购物
美国最佳在线航班预订网站:LookupFare
2019/03/26 全球购物
最新党员的自我评价分享
2013/11/04 职场文书
报关专员求职信范文
2014/02/22 职场文书
餐厅采购员岗位职责
2014/03/06 职场文书
30岁前绝不能错过的10本书
2019/08/08 职场文书
Redis源码阅读:Redis字符串SDS详解
2021/07/15 Redis
springboot中rabbitmq实现消息可靠性机制详解
2021/09/25 Java/Android