zoukankan      html  css  js  c++  java
  • php的curl封装类

    之前一直做爬虫相关的,每次自己去写一系列curl_setopt()函数太繁琐,我于是封装了如下curl请求类。

    <?php
    /**
     * @author freephp
     * @date 2015-11-13
     *
     */
    class MyCurl {    
        private static  $url = ''; // 访问的url
        private static $oriUrl = ''; // referer url
        private static $data = array(); // 可能发出的数据 post,put
        private   static $method; // 访问方式,默认是GET请求
        
        public static function send($url, $data = array(), $method = 'get') {
            if (!$url) exit('url can not be null');
            self::$url = $url;
            self::$method = $method;
            $urlArr = parse_url($url);
            self::$oriUrl = $urlArr['scheme'] .'://'. $urlArr['host'];
            self::$data = $data;
            if ( !in_array(
                    self::$method,
                    array('get', 'post', 'put', 'delete')
                 )
               ) {
                        exit('error request method type!');
                 }
            
                    $func = self::$method . 'Request';
                    return self::$func(self::$url);
        }
        /**
         * 基础发起curl请求函数
         * @param int $is_post 是否是post请求
         */
        private  function doRequest($is_post = 0) {
            $ch = curl_init();//初始化curl
            curl_setopt($ch, CURLOPT_URL, self::$url);//抓取指定网页
            curl_setopt($ch, CURLOPT_AUTOREFERER, true);
            // 来源一定要设置成来自本站
            curl_setopt($ch, CURLOPT_REFERER, self::$oriUrl);
            
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
            if($is_post == 1) curl_setopt($ch, CURLOPT_POST, $is_post);//post提交方式
            if (!empty(self::$data)) {
                self::$data = self::dealPostData(self::$data);
                curl_setopt($ch, CURLOPT_POSTFIELDS, self::$data);
            }
            
            $data = curl_exec($ch);//运行curl    
            curl_close($ch);
            return $data;
        }
        /**
         * 发起get请求
         */
        public function getRequest() {
            return self::doRequest(0);
        }
        /**
         * 发起post请求
         */
        public function postRequest() {
            return self::doRequest(1);
        }
        /**
         * 处理发起非get请求的传输数据
         * 
         * @param array $postData
         */
        public function dealPostData($postData) {
            if (!is_array($postData)) exit('post data should be array');
            foreach ($postData as $k => $v) {
                $o .= "$k=" . urlencode($v) . "&";
            }
            $postData = substr($o, 0, -1);
            return $postData;
        }
        /**
         * 发起put请求
         */
        public function putRequest($param) {
            return self::doRequest(2);
        }
        
        /**
         * 发起delete请求
         */
        public function deleteRequest($param) {
            return self::doRequest(3);
        }
        
    }
    /* $curl = new MyCurl('http://www.jumei.com',array(), 'get');
    $res = $curl->send(); */
    $res = MyCurl::send('http://www.ipip.net/ip.html',array('ip' => '61.142.206.145'),'post');
    
    var_dump($res);die();

    考虑到可能会有循环调用的可能和高并发,为了减少内存堆的不必要消耗,我只对客户端调用提供静态方法。为了类的单一职责,MyCurl只做发请求和返回data的作用,对返回数据的处理交给其他代码。

  • 相关阅读:
    第 01 组 Alpha 事后诸葛亮
    第 01 组 Alpha 冲刺(4/4)
    第 01 组 Alpha 冲刺(3/4)
    第 01 组 Alpha 冲刺(2/4)
    第 01 组 Alpha 冲刺(1/4)
    学习日志-2021.11.08
    论文阅读-2021.11.06
    学习日志-2021.10.25
    学习日志-2021.10.24
    学习日志-2021.10.18
  • 原文地址:https://www.cnblogs.com/freephp/p/4962591.html
Copyright © 2011-2022 走看看