7,CURL工具类

前言

PHP 提供了大量的扩展以供使用,这使许多底层功能,甚至是与其他程序交互的接口,都得到了封装,开发者可以很方便的直接使用。
curl就是其中之一。
有了curl扩展,我们只需要使用少数几个函数就可以完成一次网络通信,我们不需要去TCP上开一条通道出来,甚至去监听通信状态。

一张图,说说PHP的CURL

《7,CURL工具类》 PHP CURL.png

可能刚入门的时候,各种各样的文章,教程,会让人有些乱。但不要慌,其实总结下来,也就那么回事。只是设置不同的参数,来达到不同的效果而已。
理一张图,让给脑子清晰一点。
我想,应该没有人能够把函数记得十分清晰,所以,还是得看看手册。
PHP官方CURL参考手册

说好的从0到1

<?php 
// +----------------------------------------------------------------------
// | OCMS v1.1 http://blog.vsonweb.com
// +----------------------------------------------------------------------
// | Copyright (c) 2016 VSONWEB All rights reserved.
// +----------------------------------------------------------------------
// | File: Curl.class.php Curl工具类
// +----------------------------------------------------------------------
// | Author: Object <2252390865@qq.com>
// +----------------------------------------------------------------------
// | Date: 2016年11月10日
// +----------------------------------------------------------------------

class Curltool{
    public $header; // 请求头

    public function __construct($header = array()){
        if (empty($header)) {
            $this->header[] = "Accept : text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01";
            // $this->header[] = "Accept-Encoding : gzip, deflate, br";
            $this->header[] = "Accept-Language : zh,zh-CN;q=0.8,en-US;q=0.5,en;q=0.3";
            $this->header[] = "Referer : http://blog.vsonweb.com";
            $this->header[] = "User-Agent : Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0";
            // $this->header[] = "content-type: application/x-www-form-urlencoded; charset=UTF-8";
        }
    }

    /**
     * 发送GET请求
     * @author  Object
     * @date    2016-11-10
     * @param   string      $url    请求地址
     * @return      mixed
     *
     * 使用案例 :
     * 
     *         include_once 'Curl.class.php';
     *  $curl = new Curltool();
     *  $c = $curl->sendGet('https://blog.vsonweb.com');
     *  $c['content'] = htmlspecialchars($c['content']); // 转义输出
     *  p($c);
     *  
     */
    public function sendGet($url){
        $ch = curl_init(); // 创建一个curl句柄
        curl_setopt($ch,CURLOPT_HTTPHEADER,$this->header); // 设置请求头

        if (preg_match("#^https://#i",$url) == 1) {
            # https时,不严格认证
            curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); // 不自动验证证书,则信任任何证书
            curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2); // 检查证书中是否设置域名, 该值不能填true和1,要用2来代替。

            # https时,严格校验证书
            /*
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);   // 只信任CA颁布的证书 
            curl_setopt($ch, CURLOPT_CAINFO, $cacert); // CA根证书(用来验证的网站证书是否是CA颁布) 
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 检查证书中是否设置域名,并且是否与提供的主机名匹配  
            */
        }

        curl_setopt($ch,CURLOPT_URL,$url); // 设置请求地址
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设置 curl_exec 时,以字符串接收返回的信息,不直接输出

        $data['content'] = curl_exec($ch); // 执行请求
        $data['getinfo'] = curl_getinfo($ch); // 获取请求状态
        curl_close($ch); // 释放请求资源

        if ($data['getinfo']['http_code'] == 200) {
            return $data; // 注意:此处返回数据的格式,可能是json,也可能是文本接收处可另行转换
        }else{
            return false;
        }
    }

    /**
     * 发送POST请求
     * @author  Object
     * @date    2016-11-11
     * @param   string          $url        请求地址
     * @param   array       $params     post参数
     * @return  mixed
     */
    public function sendPost($url,$params = array()){
        $ch = curl_init();

        if (preg_match("#^https://#i",$url) == 1) {
            # https时,不严格认证
            curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); // 不自动验证证书,则信任任何证书
            curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2); // 检查证书中是否设置域名, 该值不能填true和1,要用2来代替。

            # https时,严格校验证书
            /*
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);   // 只信任CA颁布的证书 
            curl_setopt($ch, CURLOPT_CAINFO, $cacert); // CA根证书(用来验证的网站证书是否是CA颁布) 
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 检查证书中是否设置域名,并且是否与提供的主机名匹配  
            */
        }

        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 字符串形式返回
        curl_setopt($ch, CURLOPT_POST, true); // 设置为post请求
        curl_setopt($ch,CURLOPT_POSTFIELDS,$params); // 设置post附带参数

        $data['content'] = curl_exec($ch); // 执行请求
        $data['getinfo'] = curl_getinfo($ch); // 获取请求状态
        curl_close($ch); // 释放请求资源

        if ($data['getinfo']['http_code'] == 200) {
            return $data; // 注意:此处返回数据的格式,可能是json,也可能是文本接收处可另行转换
        }else{
            return false;
        }
    }
}
?>

注释比代码还多……因为这是对自己最好的学习方式。

结语

curl在开发项目中的应用,咱不多说了,总之很常见,特别是在这个互联网共享经济时代,以供调用的接口数不胜数。
上述的代码,只是一个比较简单的案例,以供入门。

本文出自半醒的狐狸博客

    原文作者:o半醒的狐狸
    原文地址: https://www.jianshu.com/p/2dd2a8390d1b
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞