CURL可扩展封装函数5.0

在网上找了很多curl封装函数和类,发现不是太复杂就是太简单或者功能不全,要么就是命名规范和程序设定以及函数用法不是自己喜欢的风格,我又懒得再去找,所以就花了点时间自己封装了个自认为超级完美且用法简单的curl函数,现在分享出来,希望有人喜欢

此CURL函数以使用简便为主, 若要实现复杂的功能且高效率请移步至 CURL类

要求: php版本 >= 5.3
用法
--
get提交并打印返回的结果
echo curl('http://3ghh.cn')->result;
post提交并打印返回的结果
echo curl(['http://3ghh.cn','user=123456&pass=123456'])->result;
get提交并模拟UA和Cookie且打印返回的结果
echo curl('http://3ghh.cn',['USERAGENT'=>'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36','COOKIE'=>'sid=adb; s=123'])->result;
post提交并模拟UA和Cookie且打印返回的结果
echo curl(['http://3ghh.cn','user=123456&pass=123456'],['USERAGENT'=>'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36','COOKIE'=>'sid=adb; s=123'])->result;

一些例子

//FTP上传:
$url='ftp://user:pass@host/upload_of_file_name.txt';
$src='upload_of_file_name.txt';//本地文件路径
echo curl($url,['UPLOAD'=>true,'INFILE'=>fopen($src, 'r')])->errno;//返回0就成功了

5.01版本

/*
* curl 5.01
* @param $url string|array $url:url地址&post数据
* @param $opt null|array $option:设置一个或多个选项
* @return ArrayObject
*/

function curl($url, $option = array())
{
    $defaultOpt = array(#默认设置
        CURLOPT_RETURNTRANSFER => true,//不直接打印结果
        CURLINFO_HEADER_OUT => true,//info中包含请求头
        CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4,//指定协议
        CURLOPT_ACCEPT_ENCODING => '',//接受所有编码格式
        CURLOPT_FOLLOWLOCATION => true,//跟随重定向
        CURLOPT_CONNECTTIMEOUT => 3,//请求超时秒数
        CURLOPT_TIMEOUT => 30,//Curl执行超时秒数
        CURLOPT_HEADER => false,//result中包含响应头部
        CURLOPT_NOBODY => false,//result中不包含响应主体
        CURLOPT_SSL_VERIFYPEER => false,//验证SSL证书
        CURLOPT_USERAGENT => '',//设置浏览器标识串
        CURLOPT_AUTOREFERER => true//自动设置来源地址
    );
    $ch = curl_init();
    is_array($url) ? curl_setopt_array($ch, array(CURLOPT_URL => $url[0], CURLOPT_POST => true, CURLOPT_POSTFIELDS => $url[1])) : curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt_array($ch, $defaultOpt);
    foreach ($option as $key => $value)
        if (gettype($key) == 'string') curl_setopt($ch, constant('CURLOPT_' . $key), $value); else curl_setopt($ch, $key, $value);
    $response = curl_exec($ch);
    $info = curl_getinfo($ch);
    if ($errno = curl_errno($ch)) $response = curl_error($ch);
    curl_close($ch);
    $obj = new ArrayObject();
    #连接信息
    $obj->info = $info;
    #执行结果
    $obj->result = $response;
    #错误代码 无错时返回0
    $obj->errno = $errno;
    return $obj;
}

4.0版本

<?php
/*
* curl 4.0
* @param string|array               $url:url地址&post数据
* @param null|array                 $option:设置一个或多个选项(可选)
* @return ArrayObject
*/
function curl($url, $option = array())
{
    $defaultOpt = array(#默认设置
        CURLOPT_RETURNTRANSFER => true,//不直接打印结果
        CURLINFO_HEADER_OUT => true,//info中包含请求头
        CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4,//指定协议
        CURLOPT_ACCEPT_ENCODING => '',//接受所有编码格式
        CURLOPT_FOLLOWLOCATION => true,//跟随重定向
        CURLOPT_CONNECTTIMEOUT => 3,//请求超时秒数
        CURLOPT_TIMEOUT => 30,//Curl执行超时秒数
        CURLOPT_HEADER => false,//result中包含响应头部
        CURLOPT_NOBODY => false,//result中不包含响应主体
        CURLOPT_SSL_VERIFYPEER => false,//验证SSL证书
        CURLOPT_USERAGENT => $_SERVER['HTTP_USER_AGENT'],//使用浏览者UA
        CURLOPT_AUTOREFERER => true//自动设置来源地址
    );
    $ch = curl_init(!is_array($url) ? $url : $url[0]);
    is_array($url) and array_key_exists(1, $url) ? curl_setopt($ch, CURLOPT_POST, true) && curl_setopt($ch, CURLOPT_POSTFIELDS, $url[1]) : '';
    curl_setopt_array($ch, $defaultOpt);
    if ($option != null && is_array($option)) {
        foreach ($option as $key => $value) {
            if (gettype($key) == 'string')
                curl_setopt($ch, constant('CURLOPT_' . $key), $value);
            else curl_setopt($ch, $key, $value);
        }
    }
    $result = curl_exec($ch);
    $info = curl_getinfo($ch);
    if ($errno = curl_errno($ch)) $result = curl_error($ch);
    curl_close($ch);
    $obj = new ArrayObject();
    //当设置“result中包含响应头部内容”为true或1时的处理
    if ((array_key_exists('HEADER', $option) or array_key_exists(CURLOPT_HEADER, $option)) && ($option['HEADER'] == true || $option['HEADER'] == 1 || $option[CURLOPT_HEADER] == true || $option[CURLOPT_HEADER] == 1)) {
        $result_header_str = substr($result, 0, $info['header_size']);
        $result_headers_index = explode("\r\n\r\n", $result_header_str);
        $result_header = array();
        for ($i = 0; $i <= $info['redirect_count']; $i++) {
            $result_header_index = explode("\r\n", $result_headers_index[$i]);
            $result_header[$i] = array();
            foreach ($result_header_index as $value) {
                $kv = explode(': ', $value);
                if ($kv[0] == 'Set-Cookie') $result_header[$i]['Set-Cookie'][] = $kv[1];
                else $result_header[$i][$kv[0]] = @$kv[1];
            }
        }
        #响应头部 string
        $obj->result_header_str = $result_header_str;
        #响应头部 array
        $obj->result_header = $result_header;
        #响应主体 string
        $obj->result_body = substr($result, $info['header_size']);
    }
    #连接信息
    $obj->info = $info;
    #执行结果
    $obj->result = $result;
    #错误代码 无错时返回0
    $obj->errno = $errno;
    return $obj;
}

/*
 * Curl多线程
 */
function curl_multi($arr)
{
    $mh = curl_multi_init();
    foreach ($arr as $k => $opt) {
        $conn[$k] = curl_init();
        $_option = array(
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4,
            CURLOPT_CONNECTTIMEOUT => 3,
            CURLOPT_TIMEOUT => 3,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_NOBODY => true,
        );
        curl_setopt_array($conn[$k], $_option + $opt);
        curl_multi_add_handle($mh, $conn[$k]);
    }
    $active = null;
    do {
        $mrc = curl_multi_exec($mh, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    while ($active && $mrc == CURLM_OK) {
        //if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
        //}
    }
    $result = array();
    $info = array();
    $errno = array();
    foreach ($arr as $k => $opt) {
        if ($errno[$k] = curl_errno($conn[$k])) $result = curl_error($conn[$k]);
        $result[$k] = curl_multi_getcontent($conn[$k]);
        $info[$k] = curl_getinfo($conn[$k]);
        curl_close($conn[$k]);
        curl_multi_remove_handle($mh, $conn[$k]);
    }
    curl_multi_close($mh);
    $obj = new ArrayObject();
    $obj->result = $result;
    $obj->info = @$info;
    $obj->errno = @$errno;
    return $obj;
}

猜你喜欢

转载自www.cnblogs.com/liujiuzhou/p/11547143.html