简易用的curl类,没看过curl文档也能使用

一切为了简单

<?php
/*
 * @content: 对curl进行友好封装
 * @author:wmc
 * @createtime:2015/07/22
 */
/* 功能:
 * 1.获取请求头信息
 * 2.获取响应头信息
 * 3.获取响应内容
 * 4.获取请求数据
 * 5.能请求 https
 * 6.to be continue
 */
class Curl_Class {

    /*
     * curl句柄
     * @access protected
     */
    protected $ch = null;

    /*
     * 请求头池
     * @access protected
     */
    protected $headerArr = array();

    /*
     * 默认agent
     * @access protected
     */
    protected $defaultAgent = ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36‘;

    /*
     * agent 池
     * @access protected
     */
    protected $agentArr = array();

    /*
     * 请求ip
     * @access protected
     */
    protected $reqIp = ‘‘;

    /*
     * 请求ip池
     * @access protected
     */
    protected  $reqIpArr = array();

    /*
     * curl 选项池
     * @access protected
     */
    protected $curlOpt = array();

    /*
     * cookie保存文件
     * @access protected
     */
    protected $cookieFile = ‘D:\wamp\www\test\cookie\cookie.txt‘;

    /*
     * 状态信息
     * @access public
     */
    public $info = ‘‘;

    public function __construct() {
        if(!function_exists(‘curl_init‘)) exit(‘curl扩展库未开启!‘);
        $this->ch = curl_init();
    }

    public function __destruct() {
        curl_close($this->ch);
    }

    /*
     * 读取url数据
     * @param $url string    请求url
     * @param $data array    请求参数
     * @param $refer boolean 请求来源
     * @param $type string   请求类型
     * @param $timeout int  请求超时时间
     * @return string
     * @throws Exception
     */
    public function readUrl($url, $data=array(), $refer=‘‘, $type=‘get‘, $timeout=3) {
        $url = trim($url);
        if(!$this->isUrl($url)) throw new Exception($this->errMsg(4));
        $type = strtolower($type);
        $rst = false;
        try{
            //判断请求方式
            if($type == ‘get‘) {
                if(!empty($data)) {
                    $url .= (substr($url, -1) == ‘?‘)? http_build_query($data) : ‘?‘ . http_build_query($data);
                }
                curl_setopt($this->ch, CURLOPT_POSTFIELDS, null);  //为GET请求时,去除POSTFIELDS
                curl_setopt($this->ch, CURLOPT_POST, false);       //关闭post请求
                curl_setopt($this->ch, CURLOPT_HTTPGET, true);       //开启GET请求
            } elseif($type == ‘post‘) {
                curl_setopt($this->ch, CURLOPT_HTTPGET, false);      //关闭 get 请求
                curl_setopt($this->ch, CURLOPT_POST, true);          //开启 post 请求
                if(!empty($data)) {
                    curl_setopt($this->ch, CURLOPT_POSTFIELDS, http_build_query($data));      //post参数
                }
            }

            //cookie文件处理
            if($this->cookieFile == ‘‘) {
                $this->cookieFile = tempnam(‘./cookie‘, ‘cookie‘);
            } elseif(!file_exists($this->cookieFile)) {
                $oldMask = umask(0);
                $fh = fopen($this->cookieFile, ‘w+‘, 0777);
                if($fh == false) throw new Exception($this->errMsg(7));
                fclose($fh);
                umask($oldMask);
            }
            if(!is_readable($this->cookieFile)) throw new Exception($this->errMsg(8));
            if(!is_writeable($this->cookieFile)) throw new Exception($this->errMsg(9));
            curl_setopt($this->ch, CURLOPT_COOKIEFILE, $this->cookieFile);
            curl_setopt($this->ch, CURLOPT_COOKIEJAR, $this->cookieFile);

            //https 处理
            curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER,false);           // 跳过证书检查
            curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, false);           // 从证书中检查SSL加密算法是否存在
            curl_setopt($this->ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );  //强制使用ipv4

            //防止内存泄漏,使用代理服务器
            curl_setopt($this->ch, CURLOPT_HTTPPROXYTUNNEL, true);

            //添加头信息
            if(!empty($this->headerArr)) {
                curl_setopt($this->ch, CURLOPT_HTTPHEADER, $this->headerArr);
            }

            //refer 来源
            if($refer == ‘‘) {
                curl_setopt($this->ch, CURLOPT_AUTOREFERER, true); //当根据Location:重定向时,自动设置header中的Referer:信息。
            } else {
                curl_setopt($this->ch, CURLOPT_REFERER, $refer);
            }

            curl_setopt($this->ch, CURLOPT_URL, $url);  //设置url
            curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true); //不直接输出返回
            curl_setopt($this->ch, CURLOPT_REFERER, $timeout);    //设置超时时间
            curl_setopt($this->ch, CURLOPT_USERAGENT, $this->defaultAgent);    //设置浏览器信息
            curl_setopt($this->ch, CURLOPT_FORBID_REUSE, false);  //在完成交互以后强迫断开连接,不能重用。
            curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, true);  //抓取后是否跳转
            curl_setopt($this->ch, CURLOPT_HEADER, true);  //返回响应头信息
            curl_setopt($this->ch, CURLINFO_HEADER_OUT, true);  //返回请求头信息
            curl_setopt($this->ch, CURLINFO_FILETIME, true);  //返回修改远程文档的信息

            //用户自定义选项
            if(!empty($this->curlOpt)) {
                foreach ($this->curlOpt as $key => $value) {
                    if(!defined($key)) throw new Exception($this->errMsg(10) . "($key)");
                    curl_setopt($this->ch, $key, $value);
                }
            }
            $rst = curl_exec($this->ch);
            if(curl_errno($this->ch)) throw new Exception(curl_error($this->ch), curl_errno($this->ch));
            $this->info = curl_getinfo($this->ch);
            $this->info[‘request_params‘] = $data;
            $this->info[‘response_header‘] = substr($rst, 0, $this->info[‘header_size‘]);
            $rst = substr($rst, $this->info[‘header_size‘]);
        }catch (Exception $e) {
            throw new Exception($e->getMessage(), $e->getCode());
        }

        return $rst;
    }

    /*
     * 用户自定义选项
     * @param $opt array
     */
    public function addOpt($opt) {
        if(empty($opt)) throw new Exception($this->errMsg(5));
        $this->curlOpt = array_merge($this->curlOpt, $opt);
    }

    /*
     * 添加传送头信息
     * @param $header string | array (string one header)
     * @throws Exception
     */
    public function addHead($header = ‘‘) {
        if(is_string($header)) {
            $header = trim($header);
            if($header == ‘‘) throw new Exception($this->errMsg(1));
            $this->headerArr[] = $header;
        } elseif (is_array($header)) {
            if(empty($header)) throw new Exception($this->errMsg(2));
            $this->headerArr = array_merge($this->headerArr, $header);
        }
    }

    /*
     * 添加请求ip
     * @param $ipArr array
     * @throws Exception
     */
    public function addIp($ipArr) {
        if(!is_array($ipArr) || empty($ipArr)) throw new Exception($this->errMsg(3));
        $this->reqIpArr = array_merge($this->reqIpArr, $ipArr);
    }

    /*
     * 出错信息和提示码
     * @param $code int 提示码
     * @return string
     */
    protected function errMsg($code) {
        switch ($code) {
            case 1 :
                    $msg = ‘添加头信息不能为空‘;
                break;
            case 2 :
                    $msg = ‘添加头信息的数据不能为空‘;
                break;
            case 3 :
                    $msg = ‘添加IP的数据必须为数组,且不能为空‘;
                break;
            case 4 :
                    $msg = ‘url格式不正确‘;
                break;
            case 5 :
                    $msg = ‘添加的curl选项值不能为空数组‘;
                break;
            case 6 :
                    $msg = ‘当前cookie保存文件不存在‘;
                break;
            case 7 :
                    $msg = ‘当前cookie文件创建失败‘;
                break;
            case 8 :
                    $msg = ‘当前cookie文件不可读‘;
                break;
            case 9 :
                    $msg = ‘当前cookie文件不可写‘;
                break;
            case 10 :
                    $msg = ‘当前curl配置属性未定义‘;
                break;
            default :
                    $msg = ‘未知错误‘;
                break;
        }
        return $msg;
    }

    /*
     * 匹配url是否正确
     * @param $s string
     * @return boolean
     */
    protected function isUrl($s) {
        return preg_match(‘/^http[s]?:\/\/‘.
            ‘(([0-9]{1,3}\.){3}[0-9]{1,3}‘. // IP形式的URL- 199.194.52.184
            ‘|‘. // 允许IP和DOMAIN(域名)
            ‘([0-9a-z_!~*\‘()-]+\.)*‘. // 域名- www.
            ‘([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.‘. // 二级域名
            ‘[a-z]{2,6})‘.  // first level domain- .com or .museum
            ‘(:[0-9]{1,4})?‘.  // 端口- :80
            ‘((\/\?)|‘.  // a slash isn‘t required if there is no file name
            ‘(\/[0-9a-zA-Z_!~\‘
             \.;\?:@&=\+\$,%#-\/^\*\|]*)?)$/‘,
            $s) == 1;
    }

}
时间: 2024-10-11 19:57:49

简易用的curl类,没看过curl文档也能使用的相关文章

如何快速访问MSDN某一个类或方法的帮助文档

如何快速访问MSDN某一个类或方法的帮助文档? 我一般都是在Google上搜索的如"string msdn",而不是在Msdn上直接查找(你不可能知道所有的类或方法的完整命名空间) 从Google上搜索到的MSDN地址通常都是英文语言的,所以只需要将地址中的语言更改为"zh-cn"即可显示中文的帮助文档(如果没有中文对应的文档则还是会显示英文) 如果只看对应的版本的话,直接更改链接中的vs.XX即可 MSDN地址格式: http://MSDN.MICROSOFT.C

下载Lucene4.X实战类baidu搜索的大型文档海量搜索系统(分词、过滤、排序、索引)

Lucene是一个高性能.可伸缩的信息搜索(IR)库.目前最新版本是4.3.1. 它可以为你的应用程序添加索引和搜索能力.Lucene是用java实现的.成熟的开源项目,是著名的Apache Jakarta大家庭的一员,并且基于Apache软件许可 [ASF, License].同样,Lucene是当前非常流行的.免费的Java信息搜索(IR)库. Lucene4.X实战类baidu搜索的大型文档海量搜索系统(分词.过滤.排序.索引),刚刚入手,转一注册文件,视频的确不错,可以先下载看看:htt

使用 MyBatis 必看三篇文档导读:MyBatis、MyBatis_Generator 与 MyBatis-Spring

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 前一篇<使用 MyBatis 必看两篇文档导读:MyBatis 与 MyBatis-Spring>,纯手工配置的框架环境.目前使用 M

当前不会命中断点,还没有加载该文档加载任何符号

断点调试是我编程时经常用到的,但有的程序并一定有Windows界面,而是附加到其他程序中的,如ArcGIS的Addin开发.当我在代码中插入断点调试无效(断点不起作用),并警告"当前不会命中断点,还没有加载该文档加载任何符号". 网上查了说可能是Framework版本的问题,我才恍然大悟:ArcGIS 10.1的Framework版本配置是3.5,而默认VS2010新建的程序Framework版本是4.0,原来如此. 修改目标框架后,要重新清理.重新生成一下. 虽然,调试时还是如此显示

接口 ThreadMXBean 一个很好用的线程管理接口类 可以参考 jdk 帮助文档

概述  软件包   类  使用  树  已过时  索引  帮助  JavaTM Platform Standard Ed. 6  上一个类   下一个类 框架    无框架    所有类 摘要: 嵌套 | 字段 | 构造方法 | 方法 详细信息: 字段 | 构造方法 | 方法 java.lang.management  接口 ThreadMXBean public interface ThreadMXBean Java 虚拟机线程系统的管理接口. Java 虚拟机具有此接口的实现类的单一实例.实

使用 MyBatis 必看两篇文档导读:MyBatis 与 MyBatis-Spring

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. MyBatis 简介 什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避

XMLHelper类 源码(XML文档帮助类,静态方法,实现对XML文档的创建,及节点和属性的增、删、改、查)

以下是代码: using System;using System.Collections.Generic;using System.Linq;using System.Web; using System.Xml; namespace WebApplication2{ /// <summary>    /// XMLHelper XML文档操作管理器    /// </summary>    public class XMLHelper    {        public XMLH

让你能浏览谷歌网站,仔细研究androidAPI======有独立看英语谷歌文档的能力

今天老师让我们按照API上面的例子的打下代码,想着天朝的封闭就十分讨厌不过我还是可以上谷歌.首先大家可以排除我这篇是软文................ 第一方法 就是更改HOST文件  你可以百度一下 各个系统的host文件在那个位置 我的是win7 64位的 在C:\Windows\System32\drivers\etc     host文件我放在后面给大家下载 你可以直接覆盖你的host 或者将我的内容COPY过去   然后用你的浏览器 谷歌一下  第一进安卓有点慢 不过进去以后就很快了

看了vue文档之后。。。。

对于任何复杂逻辑,你都应当使用计算属性 html中的双花之内的值不一定来自data:{},还有可能来自computed:{} 原数据改变,被绑定的计算属性也会改变 可以将同一函数定义为一个方法而不是一个计算属性.两种方式的最终结果确实是完全相同的.然而,不同的是计算属性是基于它们的依赖进行缓存的.只在相关依赖发生改变时它们才会重新求值. v-bind:class 指令也可以与普通的 class 属性共存 绑定的数据对象class不必内联定义在模板里 Vue 为你提供了一种方式来表达"这两个元素是