| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429 | <?php/** * Created by PhpStorm. * User: tandunzhao * Date: 2017/12/13 * Time: 下午2:56 */namespace App\Libs\allinpay;define('IS_DEBUG_CURL', FALSE);class CURL{    public static $instance = NULL;    public static function factory($config = NULL)    {        if (! isset(self::$instance))        {            self::$instance = new CURL($config);        }        return self::$instance;    }    private $ch = NULL;    private $timeout = 5;    public $target_ip = NULL;    public $response = '';    public $response_header = '';    public $response_body = '';    public $response_http_code = 100;    public $cookie_file = './curl_cookie.txt';    private $use_cookie = FALSE;    private $referer = NULL;    private $options = array(        CURLOPT_HEADER => TRUE,        CURLOPT_VERBOSE => 0,        CURLOPT_RETURNTRANSFER => TRUE,        CURLOPT_MAXREDIRS => 5,        CURLOPT_FOLLOWLOCATION => TRUE,        CURLOPT_ENCODING => '',        CURLOPT_USERAGENT => 'cURL API Utility/1.0 (compatible;)',        CURLOPT_DNS_CACHE_TIMEOUT => 1800    );    private $reqest_headers = array('Expect:');    private $domain = NULL;    private $append_cookie_data = array();    public function __construct($config = NULL)    {    }    /**     * 强制把域名指向到该IP地址,忽略Host、DNS服务器等域名设置     * 但是注意:     * 本处做法只能访问那些直接能访问的服务器,     * 不能经过中间层(F5、Nginx等)负载均衡过去。     * @param string $target_ip     * @return $this     */    public function force_ip($target_ip)    {        $this->target_ip = $target_ip;        return $this;    }    public function fake_ip($client_ip)    {        $this->reqest_headers[] = 'X-FORWARDED-FOR:'.$client_ip;        $this->reqest_headers[] = 'X-REAL-IP:'.$client_ip;        $this->reqest_headers[] = 'CLIENT-IP:'.$client_ip;        $this->reqest_headers[] = 'REMOTE-ADDR:'.$client_ip;        return $this;    }    private function prepare($url, $data = array(), $referrer = NULL, $timeout = 5, $headers = array())    {        $this->headers($headers);        $this->referrer($referrer);        $this->set_timeout($timeout);        $this->options[CURLOPT_REFERER] = $this->referer;        $this->options[CURLOPT_HTTPHEADER] = $this->reqest_headers;        $this->options[CURLOPT_CONNECTTIMEOUT] = $this->timeout;        return $this;    }    public function get($url, $params = array(), $referrer = NULL, $timeout = 5, $headers = array())    {        $this->prepare($url, $params, $referrer, $timeout, $headers);        $this->options[CURLOPT_URL] = $this->get_url($url, $params);        echo $this->get_url($url, $params).'<br>';        $this->options[CURLOPT_CONNECTTIMEOUT] = $this->timeout;        $this->options[CURLOPT_HTTPGET] = TRUE;        $ret = $this->execute(FALSE);        return $ret === FALSE ? FALSE : $this->response();    }    public function post($url, $data = array(), $referrer = NULL, $timeout = 5, $headers = array())    {        $this->prepare($url, $data, $referrer, $timeout, $headers);        $this->options[CURLOPT_URL] = $this->get_url($url);        $this->options[CURLOPT_POST] = TRUE;        $this->options[CURLOPT_POSTFIELDS] = $data;        $ret = $this->execute(FALSE);        return $ret === FALSE ? FALSE : $this->response();    }    public function response()    {        $response_info = curl_getinfo($this->handle());        $this->destroy_curl();        list ($this->response_header, $this->response_body) = explode("\r\n\r\n", $this->response, 2);        if ($response_info['http_code'] != 200)        {            $msg = IS_DEBUG_CURL ? $response_info['http_code'].':'.$this->response_body : '';            return $this->halt($msg, FALSE);        }        return array('header' => $this->response_header, 'body' => $this->response_body);    }    public function headers($headers = array())    {        if (empty($headers))        {            return $this->response_header;        }        else        {            $this->reqest_headers = array_merge($headers, $this->reqest_headers);            return $this;        }    }    public function cookie($name, $value, $expire = 0, $path = '/', $domain = '', $secure = FALSE, $httponly = FALSE)    {        $this->append_cookie_data[] = array(            'name' => $name,            'value' => $value,            'expire' => $expire,            'path' => $path,            'domain' => $domain,            'secure' => $secure,            'httponly' => $httponly        );        $this->use_cookie = TRUE;        return $this;    }    public function set_cookie_file($cookie_file = NULL)    {        if (! is_null($cookie_file))        {            $this->cookie_file = $cookie_file;        }        $this->use_cookie = TRUE;        return $this;    }    public function cookies($data = array())    {        foreach ($data as $d)        {            $this->append_cookie_data[] = array(                'name' => $d['name'],                'value' => $d['value'],                'expire' => isset($d['expire']) ? $d['expire'] : 0,                'path' => isset($d['path']) ? $d['path'] : '/',                'domain' => isset($d['domain']) ? $d['domain'] : '',                'secure' => (isset($d['secure']) and $d['secure']) ? 'TRUE' : 'FALSE',                'httponly' => (isset($d['httponly']) and $d['httponly']) ? 'TRUE' : 'FALSE'            );        }        $this->use_cookie = TRUE;        return $this;    }    public function append_cookie($data = array())    {    }    public function referrer($referrer = '')    {        $this->referer = $referrer;        return $this;    }    public function set_timeout($timeout = 5)    {        $this->timeout = $timeout;        return $this;    }    public function set_useragent($useragent = '')    {        if (! empty($useragent))        {            $this->options[CURLOPT_USERAGENT] = $useragent;        }        return $this;    }    private function handle()    {        if (! is_resource($this->ch))        {            $this->ch = curl_init();        }        return $this->ch;    }    private function encoder($data = array())    {        return empty($data) ? '' : http_build_query($data);    }    public function use_ssl()    {        $this->options[CURLOPT_SSL_VERIFYHOST] = 2;        $this->options[CURLOPT_SSL_VERIFYPEER] = FALSE;    }    /**     * 设置代理     *     * @param $proxy_ip     * @param $proxy_port     * @param $type 代理类型,仅仅支持 http和socks5     * @param $user     * @param $password     */    public function proxy($proxy_ip, $proxy_port, $type = 'http', $user = '', $password = '')    {        $this->options[CURLOPT_HTTPPROXYTUNNEL] = TRUE;        $this->options[CURLOPT_PROXY] = $proxy_ip . ':' . $proxy_port;        $this->options[CURLOPT_PROXYTYPE] = $type == 'http' ? CURLPROXY_HTTP : CURLPROXY_SOCKS5;        if (! empty($user))        {            $this->options[CURLOPT_PROXYUSERPWD] = $user . ':' . $password;        }        return $this;    }    private function get_url($url, $params = array())    {        $urldata = parse_url($url);        if (strtolower($urldata['scheme']) == 'https')        {            $this->use_ssl();        }        $flag_contact = $query_string = '';        if (! empty($this->target_ip))        {            $urldata['port'] = isset($urldata['port']) ? $urldata['port'] : '80';            // $this->options[CURLOPT_PROXY] = $this->target_ip.':'.$urldata['port'];            $this->proxy($this->target_ip, $urldata['port']);            if (IS_DEBUG_CURL)            {                echo $this->target_ip . ':' . $urldata['port'] . "\r\n";            }        }        if (! empty($params))        {            $query_string = $this->encoder($params);            $flag_contact = strpos($url, '?') === FALSE ? '?' : '&';        }        if (IS_DEBUG_CURL)        {            echo $url . $flag_contact . $query_string . "\r\n";        }        $this->domain = $urldata['host'];        return $url . $flag_contact . $query_string;    }    public function get_exist_cookies()    {        $exist_cookie_data = array();        if (! empty($this->append_cookie_data) and is_file($this->cookie_file))        {            $content = file_get_contents($this->cookie_file);            if (! empty($content))            {                $cookie_lines = explode("\n", str_replace("\r\n", "\n", $content));                foreach ($cookie_lines as $cookie_line)                {                    if (empty($cookie_line) or preg_match('/^#/', $cookie_line))                        continue;                    $cookie_fields = explode("\t", $cookie_line);                    $exist_cookie_data[$cookie_fields[0] . '_' . $cookie_fields[5]] = array(                        'name' => urldecode($cookie_fields[5]),                        'value' => urldecode($cookie_fields[6]),                        'expire' => $cookie_fields[4],                        'path' => urldecode($cookie_fields[2]),                        'domain' => $cookie_fields[0],                        'secure' => $cookie_fields[3],                        'httponly' => $cookie_fields[1]                    );                }            }        }        return $exist_cookie_data;    }    private function execute($halt = FALSE)    {        $this->curl_cookie();        curl_setopt_array($this->handle(), $this->options);        $this->response = curl_exec($this->handle());        $error_no = curl_errno($this->handle());        if ($error_no)        {            $msg = curl_error($this->handle());            $this->destroy_curl();            $this->halt('Error occured: NO.' . $error_no . ', ' . $msg, $halt);            return FALSE;        }    }    private function curl_cookie()    {        // echo "HostName: ".$this->domain."\n";        if (! $this->use_cookie)            return FALSE;        if (! is_file($this->cookie_file))        {            file_put_contents($this->cookie_file, '');        }        $data_cookies = array();        foreach ($this->append_cookie_data as $append_cookie)        {            $domain = $this->get_domain($append_cookie['domain']);            $data_cookies[$domain . '_' . $append_cookie['name']] = $append_cookie;        }        $data_cookies += $this->get_exist_cookies();        $output_cookie = array();        foreach ($data_cookies as $data_cookie)        {            $domain = $this->get_domain($data_cookie['domain']);            $output_cookie[] = $domain . "\t" . $data_cookie['httponly'] . "\t" . $data_cookie['path'] . "\t" . $data_cookie['secure'] . "\t" . $data_cookie['expire'] . "\t" . urlencode($data_cookie['name']) . "\t" .                urlencode($data_cookie['value']);        }        if (! empty($output_cookie))        {            $content_pre = "# Netscape HTTP Cookie File\n" . "# http://curl.haxx.se/rfc/cookie_spec.html\n" . "# This file was generated by libcurl! Edit at your own risk.\n" . "\n";            file_put_contents($this->cookie_file, $content_pre . implode("\n", $output_cookie) . "\n");        }        $this->options[CURLOPT_COOKIEJAR] = $this->cookie_file;        $this->options[CURLOPT_COOKIEFILE] = $this->cookie_file;    }    private function get_domain($domain)    {        if (is_null($domain))        {            $domain = 'localhost';        }        elseif ($domain == '')        {            $domain = $this->domain;        }        return $domain;    }    private function destroy_curl()    {        if (is_resource($this->handle()))        {            curl_close($this->handle());            $this->ch = NULL;        }    }    private function get_httpcode()    {    }    public function close()    {        $this->destroy_curl();        if (is_file($this->cookie_file))        {            unlink($this->cookie_file);        }    }    private function halt($msg = '', $is_exit = TRUE, $title = '') {        if (! empty($title) AND IS_DEBUG_CURL) {            echo "Title: $msg;;;;\r\n";        }        if (! empty($msg) AND IS_DEBUG_CURL) {            echo "Message: $msg;;;;\r\n";        }        if ($is_exit) {            exit();        } else {            return FALSE;        }    }}
 |