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的作用,對返回數據的處理交給其他代碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM