PHP抓取HTTPS内容和错误处理的方法

问题

在研究Hacker News API的时候遇到一个HTTPS问题。因为所有的Hacker News API都是通过加密的HTTPS协议访问的,跟普通的HTTP协议不同,当使用PHP里的函数 file_get_contents() 来获取API里提供的数据时,出现错误

使用的代码是这样的:

<?php
$data = file_get_contents("/http://blog.it985.com/");
?>

当运行上面的代码是遇到下面的错误提示:

PHP Warning: file_get_contents(): Unable to find the wrapper “https” – did you forget to enable it when you configured PHP?

为什么会出现这样的错误?

在网上经过一番搜索,发现遇到这样错误的人还不少,问题很直接,是因为在PHP的配置文件里没有开启一个参数,在我本机上是 /apache/bin/php.ini 里的 ;extension=php_openssl.dll 这一项,需要将前面的分号去掉。

你可以用下面的脚本来检查你的PHP环境的配置:

<?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);

运行上面的这个脚本片段,在我的机器上得到的结果是:

<?php
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能有所帮助,如果有疑问大家可以留言交流。

(0)

相关推荐

  • PHP 错误处理机制

    在日常的项目开发过程中,总是会出现一些我们意想不到的异常错误,如果我们对此没有进行相对完善的处理,那么程序看上去也很不专业,也很可能就会成为别人攻击系统的有效信息:有些错误异常会终止脚本执行,这个时候如果没有一些错误提示信息的话,那么我们只能从头开始看代码了,要知道项目中成百上千行的代码对我们来说是件多么恐怖的事情啊,那么我们如何在项目开发的过程中快速准确地定位到异常.错误呢,并进行相应的处理,本文由自己对错误.异常处理的了解,再此分享与大家相互学习交流,并作为一个备忘. 系统错误处理器: PH

  • PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法

    异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程.这种情况称为异常. PHP 5 添加了类似于其它语言的异常处理模块.在 PHP 代码中所产生的异常可被 throw 语句抛出并被 catch 语句捕获.需要进行异常处理的代码都必须放入 try 代码块内,以便捕获可能存在的异常.每一个 try 至少要有一个与之对应的 catch.使用多个 catch 可以捕获不同的类所产生的异常.当 try 代码块不再抛出异常或者找不到 catch 能匹配所抛出的异常时,PHP 代码就会在跳转到最后一

  • php一些错误处理的方法与技巧总结

    1:为什么我得不到变量 我在一网页向另一网页POST数据name,为什么输出$name时却得不到任何值? 在PHP4.2以后的版本中register_global默认为off 若想取得从另一页面提交的变量: 方法一:在PHP.ini中找到register_global,并把它设置为on. 方法二:在接收网页最前面放上这个extract($_POST);extract($_GET);(注意extract($_SESSION)前必须要有Session_Start()). 方法三:一个一个读取变量$a

  • PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function

    1.错误类型:PHP致命错误 Error type: PHP Fatal error Fatal error: Cannot redeclare (a) (previously declared in (b)) in (c) on line (d) 2.错误描述: 该错误报告表示你正企图对已经定义过的函数进行再次定义,其中 a----表示重复定义的函数名: b----第一次定义该函数时的文件名称及行号: c----第二次定义该函数时的文件名称: d----第二次定义该函数时的行号. 3.原因及解

  • PHP 自定义错误处理函数的使用详解

    复制代码 代码如下: function myErrorHandler($errno, $errstr, $errfile, $errline){    if(!(error_reporting() &$errno)){return;}    switch ($errno){    case E_USER_ERROR:        echo "<b>My ERROR</b> [$errno] $errstr<br/>";        ech

  • php自定义错误处理用法实例

    本文实例讲述了php自定义错误处理用法.分享给大家供大家参考.具体如下: <?php error_reporting(E_ALL); function ErrHandler($errorno, $errorstr, $errorfile, $errorline) { $display = true; $notify = false; $halt_script = false; $error_msg = "<br>The $errorno error is occurring a

  • 浅谈PHP中的错误处理和异常处理

    错误处理:          1. 语法错误     2. 运行时的错误     3. 逻辑错误 错误报告:                  错误E_ERROR         警告E_WARNING         注意E_NOTICE 开发阶段:开发时输出所有的错误报告,有利于我们进行调试 运行阶段:不要让程序输出任何一种错误报告 将错误报告写入日志中 一.   指定错误报告error_reporting=E_ALL(在php.inn) 二.   关闭错误输出display_errors=

  • PHP中PDO的错误处理

    面向对象的方式 先看看如果连接错误等的处理,PHP中PDO的错误处理,使用面向对象的方式来处理: 复制代码 代码如下: <?php try { $db = new PDO('mysql:host=localhost;dbname=test', $user, $pass); $db = null; } catch (PDOException $e) { print "Error: " . $e->getMessage() . "<br/>";

  • PHP 自定义错误处理函数trigger_error()

    定义和用法trigger_error() 函数创建用户定义的错误消息. trigger_error() 用于在用户指定的条件下触发一个错误消息.它与内建的错误处理器一同使用,也可以与由 set_error_handler() 函数创建的用户自定义函数使用. 如果指定了一个不合法的错误类型,该函数返回 false,否则返回 true. 语法trigger_error(error_message,error_types) 参数描述error_message必需.规定错误消息.长度限制为 1024 个

  • PHP的全局错误处理详解

    本文目的 PHP的全局错误处理,在开发项目的时候很有用,可以帮助开发者快速定位一些问题,提高工作效率.默认情况下,全局错误会直接输出,但是最近开发时使用的一个框架库对全局错误处理进行了设定,导致很多错误信息没有输出,在定位问题上有一定的耗时.所以,研究了一下此库的实现,发现它设定了error_reporting和set_error_handler,导致此现象.现在记录一下这两个函数的用法,作为备忘录. 背景 PHP没有类型检测,开发人员比较容易输入错误单词,引起致命错误,最终导致脚本停止执行.如

  • PHP中的错误处理、异常处理机制分析

    例: 复制代码 代码如下: <?php $a = fopen('test.txt','r'); //这里并没有对文件进行判断就打开了,如果文件不存在就会报错 ?> 那么正确的写法应该如下: 复制代码 代码如下: <?php if(file_exists('test.txt')){ $f=fopen('test.txt','r'); //使用完后关闭 fclose($f); } ?> 一.PHP错误处理的三种方式A.简单的die()语句: 等价于exit(); 例: 复制代码 代码如

  • php实现的错误处理封装类实例

    本文实例讲述了php实现的错误处理封装类.分享给大家供大家参考,具体如下: 1.创建MyErrorHandler.php文件 代码如下: <?php class MyErrorHandler { public $message; public $filename; public $line; public $vars = array(); protected $_noticeLog = 'F:\root\noticeLog.log'; public function __construct ($

随机推荐