已掉线,重新登录

首页 > 绿虎论坛 > 历史版块 > 编程 > PHP > 源码

标题: Php curl可扩展封装函数1.1

作者: @Ta

时间: 2017-11-04发布,2017-11-05修改

点击: 6484

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

1.1增加了自动解压编码格式和保存cookie文件...

用这个函数实现的HTTP模拟访问工具https://tool.phpe.top/

欢迎访问我的博客https://3ghh.cn

用法1
curl($url)->result;
用法2
curl($url,$post)->result;
用法3
curl($url,'',['USERAGENT'=>'要设定的ua','REFERER'=>'要设定的来源地址','HTTP_HEADER'=>['Accept: */*','Accept-Language: en-us
']])->result; //除了这些还能设定其他的,具体请参考CURL教程

最后一个参数$default如果设为false则关闭默认选项设置


function curl($url, $post = '', $option = [], $default = true)
{
    /*
     * curl 1.1 3ghh.cn
     * @param string                    $url:url地址
     * @param string|array	            $post:post数据(可选)
     * @param null|array                $option:扩展选项(可选)
     * @param bool                      $default:默认选项(可选)
     * @return ArrayObject              echo curl('http://3ghh.cn','',['CONNECTTIMEOUT'=>1])->result;
     */
    #初始化
    $ch = curl_init();
    #选项
    //请求的URL
    curl_setopt($ch, CURLOPT_URL, $url);
    //POST数据
    $post == '' ?: curl_setopt($ch, CURLOPT_POST, true) && curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
    #固定选项
    //不自动打印结果
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    //info中包含请求头 return array
    curl_setopt($ch, CURLINFO_HEADER_OUT, true);
    //验证证书
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    //指定协议
    curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
    //自动解压编码格式
    curl_setopt($ch, CURLOPT_ACCEPT_ENCODING, '');
    if ($default == true) {
        #默认选项
        //使用浏览器者UA
        curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
        //请求超时时间,单位秒
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
        //重定向跟踪
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        //result中包含响应头部内容
        curl_setopt($ch, CURLOPT_HEADER, false);
        //result中不包含响应主体内容
        curl_setopt($ch, CURLOPT_NOBODY, false);
        //设置Cookie文件保存位置
        $cookie_file = getcwd() . '/cookie.tmp';//函数调用代码所在脚本的目录
        //将请求时得到的Cookie保存 (要保存请将fasle改为$cookie_file)
        curl_setopt($ch, CURLOPT_COOKIEJAR, false);
    }
    if ($option != null && is_array($option)) {
        #扩展选项
        foreach ($option as $key => $value) {
            curl_setopt($ch, constant('CURLOPT_' . $key), $value);
        }
    }
    #执行
    $result = curl_exec($ch);
    $info = curl_getinfo($ch);
    //错误处理
    $error = $errno = NULL;
    if ($errno = curl_errno($ch)) {
        $result = $error = curl_error($ch);
    }
    #关闭
    curl_close($ch);
    //创建数组对象
    $out = new ArrayObject();
    #结果
    $out->result = $result;
    #信息
    $out->info = $info;
    #错误代码
    $out->errno = $errno;
    #错误提示
    $out->error = $error;
    //返回数组对象
    return $out;
}

[隐藏样式|查看源码]


『回复列表(11|隐藏机器人聊天)』

1.

@灰色头像,第43行那个eval可以换成这样:

curl_setopt($ch, constant('CURLOPT_'.$key), $value);

(/@Ta/2017-11-05 13:18//)

2. @老虎会游泳,好的,已改进
(/@Ta/2017-11-05 14:06//)

3. 有我的实用?我这可是在项目中实战过的。https://github.com/haowen100/caiji

caiji

一个使用PHP编写的采集类

快速开始

引入文件

require_once 'Caiji.php';
初始化对象

$caiji = new CaiJi($url);
设置相关采集参数

设置浏览器agent

$caiji->setAgent('Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)');
设置cookie

$caiji->setCookieFile('cookie.txt');
设置ip

$caiji->setIp('220.181.68.'.rand(100,200));
设置超时时间

$caiji->setTime($ruleConfig['timeOut']);
设置来源

$caiji->setRefer('http://www.baidu.com');
如果采集https网页内容,需要加上下面的代码

$caiji->setSsl(true);
获的采集数据

echo $caiji->getRes();
(/@Ta/2017-11-05 14:59//)

4. @kugui,我只要简简单单一个函数就够了,采集有专业的Snoopy类
(/@Ta/2017-11-05 15:32//)

5. https://hu60.net/q.php/bbs.topic.80895.html
(/@Ta/2017-11-07 09:16//)

7. @堂妹妹的, 这个6 <( ̄ˇ ̄)/ 之前有想过写个类似的 写了一些功能后总感觉效率不高 影响速度
(/@Ta/2017-11-07 16:23//)

8. @唯一丶,其实我写这个函数之前也看了你写的那个,总觉得有不足而且用起来还有点复杂。因为要打CURLOPT
(/@Ta/2017-11-07 18:12//)

9. @灰色头像,因为有些参数不是curlopt开头的 所以我就没有强制,<(ˉ^ˉ)>。我还专门写了个采集用的封装类。没有公开
(/@Ta/2017-11-07 18:41//)

10. @唯一丶,只要很少一部分不是curlopt开头吧,而且那些我感觉好像用不上,我把这函数更新了2.2,在我博客
(/@Ta/2017-11-07 19:44//)

11. @老虎会游泳,这个可以mark一下
(/@Ta/2017-11-07 23:15//)

12. @灰色头像,<( ̄ˇ ̄)/这倒没注意过具体的 ,因为之前看文档看到的 不过你这个想法也不错 省去了一部分
(/@Ta/2017-11-07 23:16//)

回复需要登录

7月15日 01:55 星期二

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1