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的作用,对返回数据的处理交给其他代码。

  • 相关阅读:
    LeetCode 1245. Tree Diameter
    LeetCode 1152. Analyze User Website Visit Pattern
    LeetCode 1223. Dice Roll Simulation
    LeetCode 912. Sort an Array
    LeetCode 993. Cousins in Binary Tree
    LeetCode 1047. Remove All Adjacent Duplicates In String
    LeetCode 390. Elimination Game
    LeetCode 1209. Remove All Adjacent Duplicates in String II
    LeetCode 797. All Paths From Source to Target
    LeetCode 1029. Two City Scheduling
  • 原文地址:https://www.cnblogs.com/freephp/p/4962591.html
Copyright © 2011-2022 走看看