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(8) php 数组
Mar 05 PHP
PHP的简易冒泡法代码分享
Aug 28 PHP
PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
Dec 07 PHP
解析PHP可变函数的经典用法
Jun 20 PHP
PHP语法小结之基础和变量
Nov 22 PHP
详解js异步文件加载器
Jan 24 PHP
基于Swoole实现PHP与websocket聊天室
Aug 03 PHP
php根据年月获取当月天数及日期数组的方法
Nov 30 PHP
浅谈php中curl、fsockopen的应用
Dec 10 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
Dec 13 PHP
php intval函数用法总结
Apr 14 PHP
php的扩展写法总结
May 14 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抓取https的内容的代码
2010/04/06 PHP
使用正则去除php代码中的注释方法
2016/11/03 PHP
splice slice区别
2006/10/09 Javascript
Firebug 字幕文件JSON地址获取代码
2009/10/28 Javascript
通过上下左右键和回车键切换光标实现代码
2013/03/08 Javascript
JS中数组Array的用法示例介绍
2014/02/20 Javascript
c#程序员对TypeScript的认识过程
2015/06/19 Javascript
js随机生成字母数字组合的字符串 随机动画数字
2015/09/02 Javascript
javascript基础知识
2016/06/07 Javascript
Node.js的环境安装配置(使用nvm方式)
2016/10/11 Javascript
nodeJs链接Mysql做增删改查的简单操作
2017/02/04 NodeJs
angular.fromJson与toJson方法用法示例
2017/05/17 Javascript
vue v-on监听事件详解
2017/05/17 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
Node.js搭建小程序后台服务
2018/01/03 Javascript
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
jQuery中图片展示插件highslide.js的简单dom
2018/04/22 jQuery
vue 设置路由的登录权限的方法
2018/07/03 Javascript
vue添加class样式实例讲解
2019/02/12 Javascript
Vue打包后访问静态资源路径问题
2019/11/08 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
python使用xmlrpc实例讲解
2013/12/17 Python
Python读写Redis数据库操作示例
2014/03/18 Python
使用pygame模块编写贪吃蛇的实例讲解
2018/02/05 Python
Python创建数字列表的示例
2019/11/28 Python
Python中import导入不同目录的模块方法详解
2020/02/18 Python
浅析Python 抽象工厂模式的优缺点
2020/07/13 Python
HTML5在a标签内放置块级元素示例代码
2013/08/23 HTML / CSS
佳能德国网上商店:Canon德国
2017/03/18 全球购物
Expedia挪威官网:酒店、机票和租车
2018/03/03 全球购物
国际旅客访问北美最大的汽车租赁提供商:Alamo Rent A Car
2018/06/13 全球购物
老师给学生的表扬信
2014/01/17 职场文书
冰淇淋开店创业计划书
2014/02/01 职场文书
复制别人的成功真的会成功吗?
2019/10/17 职场文书
基于python制作简易版学生信息管理系统
2021/04/20 Python
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸