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的类树(支持无限分类)
Oct 09 PHP
PHP4之COOKIE支持详解
Oct 09 PHP
同时提取多条新闻中的文本一例
Oct 09 PHP
PHP自动生成后台导航网址的最佳方法
Aug 27 PHP
ThinkPHP中处理表单中的注意事项
Nov 22 PHP
ThinkPHP入口文件设置及相关注意事项分析
Dec 05 PHP
php编写的抽奖程序中奖概率算法
May 14 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
Nov 09 PHP
学习php设计模式 php实现模板方法模式
Dec 08 PHP
Yii2学习笔记之汉化yii设置表单的描述(属性标签attributeLabels)
Feb 07 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
Apr 01 PHP
PHP查询分页的实现代码
Jun 09 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实现维护文件代码
2007/06/14 PHP
PHP中如何调用webservice的实例参考
2013/04/25 PHP
详解PHP安装mysql.so扩展的方法
2016/12/31 PHP
PHP实现基于3DES算法加密解密字符串示例
2018/08/24 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
javascript 当前日期转化为中文的实现代码
2010/05/13 Javascript
javascript中Date对象的getDay方法使用指南
2014/12/22 Javascript
jquery在ie7下选择器的问题导致append失效的解决方法
2016/01/10 Javascript
jQuery给指定的table动态添加删除行的操作方法
2016/10/12 Javascript
微信公众号  提示:Unauthorized API function 问题解决方法
2016/12/05 Javascript
用vue写一个仿简书的轮播图的示例代码
2018/03/13 Javascript
vue文件树组件使用详解
2018/03/29 Javascript
JS关于刷新页面的相关总结
2018/05/09 Javascript
vue+element-ui JYAdmin后台管理系统模板解析
2020/07/28 Javascript
详解三种方式在React中解决绑定this的作用域问题并传参
2020/08/18 Javascript
python中正则表达式的使用详解
2014/10/17 Python
详解 Python 读写XML文件的实例
2017/08/02 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
2018/03/22 Python
python下载库的步骤方法
2019/10/12 Python
Django 自定义权限管理系统详解(通过中间件认证)
2020/03/11 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
2020/10/26 Python
实例讲解HTML5的meta标签的一些应用
2015/12/08 HTML / CSS
Pedro官网:新加坡时尚品牌
2019/08/27 全球购物
高一化学教学反思
2014/02/05 职场文书
幼儿园儿童节活动主持词+串词大全
2014/03/21 职场文书
药店采购员岗位职责
2014/09/30 职场文书
2014业务员年终工作总结
2014/12/09 职场文书
我们的节日元宵节活动总结
2015/02/06 职场文书
班主任寄语2015
2015/02/26 职场文书
农民工工资支付承诺书
2015/05/04 职场文书
雷锋观后感
2015/06/10 职场文书
中小学生安全教育观后感
2015/06/17 职场文书
2016年小学优秀班主任事迹材料
2016/02/29 职场文书
职工的安全责任书范文!
2019/07/02 职场文书
百善孝为先:关于孝道的经典语录
2019/10/18 职场文书
Win11 Beta 预览版 22621.575 和 22622.575更新补丁KB5016694发布(附更新内容大全)
2022/08/14 数码科技