PHP HTTP类

<?php

class Libs_Http_Client {

    private static $boundary = '';

    public static function get($url, $params = array(), $headers = array(), $misc = array(), $cookie='') {
        if (!empty($params)) {
            $url = $url . '?' . http_build_query($params);
        }
        return self::http($url, 'GET', null, $headers, $misc, $cookie);
    }

    public static function post($url, $params, $files = array(), $headers = array(), $misc = array()) {
        if (!$files) {
            if (is_array($params) || is_object($params)) {
                $body = http_build_query($params);
            } else {
                $body = $params;
            }
        } else {
            $body = self::build_http_query_multi($params, $files);
            $headers[] = "Content-Type: multipart/form-data; boundary=" . self::$boundary;
        }
        return self::http($url, 'POST', $body, $headers, $misc);
    }

    public static function postFiles($url, $files, $params = array(), $headers = array(), $misc = array()) {
        if (!is_array($files)) {
            return false;
        }

        foreach ($files as $key => &$val) {
            $val = '@'.$val;
        }
        $body = array_merge($files, $params);
        $headers[] = "Content-Type: multipart/form-data";

        return self::http($url, 'POST', $body, $headers, $misc);
    }

    public static function getFiles($url, $files, $params = array(), $headers = array(), $misc = array()) {
        if (!is_array($files)) {
            return false;
        }

        foreach ($files as $key => &$val) {
            $val = '@'.$val;
        }
        $body = array_merge($files, $params);
        $headers[] = "Content-Type: multipart/form-data";

        return self::http($url, 'GET', $body, $headers, $misc);
    }


    /**
     * Make an HTTP request
     *
     * @return string API results
     * @ignore
     */
    private static function http($url, $method, $postfields = NULL, $headers = array(), $misc = array(), $cookie='') {
        $ci = curl_init();
        /* Curl settings */
        curl_setopt($ci, CURLOPT_USERAGENT, 'Tdot Plum Client v0.1');       //HTTP头部user agent
        curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 30);                       //连接超时时间,单位秒
        curl_setopt($ci, CURLOPT_TIMEOUT, 30);                              //最大执行时间,单位秒
        curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);                     //避免直接输出返回值
        curl_setopt($ci, CURLOPT_ENCODING, "");                             //可接受编码类型,空串支持所有类型
        curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, 2);
        //curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader'));
        curl_setopt($ci, CURLOPT_HEADER, FALSE);

        switch ($method) {
            case 'POST':
                curl_setopt($ci, CURLOPT_POST, TRUE);
                if (!empty($postfields)) {
                    curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
                }
                break;
        }

        foreach ($misc as $key => $val) {
            $key    = strtoupper($key);
            switch ($key) {
                case 'REFERER' :
                    curl_setopt($ci, CURLOPT_REFERER, $val);
                    break;
            }
        }

        curl_setopt($ci, CURLOPT_URL, $url);
        curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
        if($cookie){
            curl_setopt ($ci, CURLOPT_COOKIE , $cookie );
        }
        curl_setopt($ci, CURLINFO_HEADER_OUT, TRUE);

        $response = curl_exec($ci);
        $httpCode = curl_getinfo($ci, CURLINFO_HTTP_CODE);
        $httpInfo = curl_getinfo($ci);
        curl_close ($ci);
        return $response;
    }

    /**
     * 发送文件时使用
     * @param array $params
     * @param array $files
     * @return string
     */
    private static function build_http_query_multi($params, $files) {
        //if (!$params) return '';

        self::$boundary = $boundary = uniqid('------------------');
        $MPboundary = '--'.$boundary;
        $endMPboundary = $MPboundary. '--';
        $multipartbody = '';

        foreach ($params as $key => $value) {
            $multipartbody .= $MPboundary . "\r\n";
            $multipartbody .= 'content-disposition: form-data; name="' . $key . "\"\r\n\r\n";
            $multipartbody .= $value."\r\n";
        }
        foreach ($files as $key => $value) {
            if (!$value) {continue;}

            if (is_array($value)) {
                $url = $value['url'];
                if (isset($value['name'])) {
                    $filename = $value['name'];
                } else {
                    $parts = explode( '?', basename($value['url']));
                    $filename = $parts[0];
                }
                $field = isset($value['field']) ? $value['field'] : $key;
            } else {
                $url = $value;
                $parts = explode( '?', basename($url));
                $filename = $parts[0];
                $field = $key;
            }
            $content = file_get_contents($url);

            $multipartbody .= $MPboundary . "\r\n";
            $multipartbody .= 'Content-Disposition: form-data; name="' . $field . '"; filename="' . $filename . '"'. "\r\n";
            $multipartbody .= "Content-Type: image/unknown\r\n\r\n";
            $multipartbody .= $content. "\r\n";
        }

        $multipartbody .= $endMPboundary;
        return $multipartbody;
    }
}

PHP HTTP类