<?php
/**
 * Created by PhpStorm.
 * User: chendeben
 * Date: 2018/8/17
 * Time: 下午5:26
 */

namespace Heanup\Library;

use Heanup\Frame\Logger;

class Curl
{
    private static $cookie_file = "curl_cookie.log";


    /**
     * CURL-get方式获取数据
     * @param string $url URL
     * @param string $proxy 是否代理
     * @param int $timeout 请求时间
     * @param array $header header信息  array('Host: api.kingdee.meitushop.com' )设置请求的host
     * @return string
     */
    public static function get($url, $proxy = null, $timeout = 5, $header = null, $REFERER = null)
    {


        if (!$url)
            return false;
        $ssl = stripos($url, 'https://') === 0;
        $curl = curl_init();
        if (!is_null($proxy)){
            if (is_string($proxy)){
                curl_setopt($curl, CURLOPT_PROXY, $proxy);
            }else{//使用猿代理
                $proxyServer = is_string($proxy) ? $proxy : "forward.apeyun.com:9082";
                $id = "2021012100228692034"; // 使用订单ID/APP_ID
                $secret = "UJ1I6yMuZZ4B00b3"; // 用户SECRET
                // 代理服务器
                curl_setopt($curl, CURLOPT_PROXY, $proxyServer);
                curl_setopt($curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); //http
                //curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); //socks5
                curl_setopt($curl, CURLOPT_PROXYAUTH, CURLAUTH_BASIC);
                curl_setopt($curl, CURLOPT_PROXYUSERPWD, "$id:$secret");
            }

        }
        curl_setopt($curl, CURLOPT_URL, $url);
        if ($ssl) {
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
        }
        if ($REFERER) {
            curl_setopt($curl, CURLOPT_REFERER, $REFERER);//模拟来路

        }
        $cookie_file = self::$cookie_file;
        curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file); //连接结束后保存cookie信息的文件。
        curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file); //包含cookie数据的文件名，cookie文件的格式可以是Netscape格式，或者只是纯HTTP头部信息存入文件。
        curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); //在HTTP请求中包含一个"User-Agent: "头的字符串。
        curl_setopt($curl, CURLOPT_HEADER, 0); //启用时会将头文件的信息作为数据流输出。
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); //启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器，使用CURLOPT_MAXREDIRS可以限定递归返回的数量。
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); //文件流形式
        curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); //设置cURL允许执行的最长秒数。
        if (is_array($header))
            curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //设置请求的Header
        $content = curl_exec($curl);
        $curl_errno = curl_errno($curl);
        if ($curl_errno > 0) {
            Logger::setlog($error = sprintf("curl error=%s, errno=%d.使用代理%s", curl_error($curl), $curl_errno,$proxy));
            Proxy::instance()->connect()->zIncrBy("proxies:universal", -1, $proxy);
            curl_close($curl);
            return false;
        } else {
            Logger::setlog($error = sprintf("代理%s正常！", $proxy), APP_DIR . "/success.log");
        }
//        $this->http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        curl_close($curl);

        return $content;
    }

    /**
     * CURL-post方式获取数据
     * @param string $url URL
     * @param array $data POST数据
     * @param string $proxy 是否代理
     * @param int $timeout 请求时间
     * @param array $header header信息
     * @return string
     */
    public static function post($url, $data, $proxy = null, $timeout = 10, $header = null)
    {
        if (!$url)
            return false;
//        if ($data) {
//            $data = http_build_query($data);
//        }
        $ssl = stripos($url, 'https://') === 0 ? true : false;
        $curl = curl_init();
        if (!is_null($proxy))
            curl_setopt($curl, CURLOPT_PROXY, $proxy);
        curl_setopt($curl, CURLOPT_URL, $url);
        if ($ssl) {
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
        }
        $cookie_file = self::$cookie_file;
        curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file); //连接结束后保存cookie信息的文件。
        curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file); //包含cookie数据的文件名，cookie文件的格式可以是Netscape格式，或者只是纯HTTP头部信息存入文件。
        curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); //在HTTP请求中包含一个"User-Agent: "头的字符串。
        curl_setopt($curl, CURLOPT_HEADER, 0); //启用时会将头文件的信息作为数据流输出。
        curl_setopt($curl, CURLOPT_POST, true); //发送一个常规的Post请求
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data); //Post提交的数据包
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); //启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器，使用CURLOPT_MAXREDIRS可以限定递归返回的数量。
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); //文件流形式
        curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); //设置cURL允许执行的最长秒数。
        if (is_array($header))
            curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //设置请求的Header

        $content = curl_exec($curl);
        $curl_errno = curl_errno($curl);
        if ($curl_errno > 0) {
            Logger::setlog($error = sprintf("curl error=%s, errno=%d.", curl_error($curl), $curl_errno));
            curl_close($curl);
            return false;
        }
//        $this->http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        curl_close($curl);
        return $content;
    }

    /**
     * CURL-put方式获取数据
     * @param string $url URL
     * @param array $data POST数据
     * @param string $proxy 是否代理
     * @param int $timeout 请求时间
     * @param array $header header信息
     * @return string
     */
    public static function put($url, $data, $proxy = null, $timeout = 10, $header = null)
    {
        if (!$url)
            return false;
        if ($data) {
            $data = http_build_query($data);
        }
        $ssl = stripos($url, 'https://') === 0 ? true : false;
        $curl = curl_init();
        if (!is_null($proxy))
            curl_setopt($curl, CURLOPT_PROXY, $proxy);
        curl_setopt($curl, CURLOPT_URL, $url);
        if ($ssl) {
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
        }
        $cookie_file = self::$cookie_file;
        curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file); //连接结束后保存cookie信息的文件。
        curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file); //包含cookie数据的文件名，cookie文件的格式可以是Netscape格式，或者只是纯HTTP头部信息存入文件。
        curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); //在HTTP请求中包含一个"User-Agent: "头的字符串。
        curl_setopt($curl, CURLOPT_HEADER, 0); //启用时会将头文件的信息作为数据流输出。
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); //启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器，使用CURLOPT_MAXREDIRS可以限定递归返回的数量。
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); //文件流形式
        curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); //设置cURL允许执行的最长秒数
        $data = (is_array($data)) ? http_build_query($data) : $data;
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
        curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Length: ' . strlen($data)));
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        if (is_array($header))
            curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //设置请求的Header

        $content = curl_exec($curl);
        $curl_errno = curl_errno($curl);
        if ($curl_errno > 0) {
            Logger::setlog($error = sprintf("curl error=%s, errno=%d.", curl_error($curl), $curl_errno));
            curl_close($curl);
            return false;
        }
        curl_close($curl);
        return $content;
    }

    /**
     * CURL-DEL方式获取数据
     * @param string $url URL
     * @param array $data POST数据
     * @param string $proxy 是否代理
     * @param int $timeout 请求时间
     * @param array $header header信息
     * @return string
     */
    public static function del($url, $data, $proxy = null, $timeout = 10, $header = null)
    {
        if (!$url)
            return false;
        if ($data) {
            $data = http_build_query($data);
        }
        $ssl = stripos($url, 'https://') === 0 ? true : false;
        $curl = curl_init();
        if (!is_null($proxy))
            curl_setopt($curl, CURLOPT_PROXY, $proxy);
        curl_setopt($curl, CURLOPT_URL, $url);
        if ($ssl) {
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
        }
        $cookie_file = self::$cookie_file;
        curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file); //连接结束后保存cookie信息的文件。
        curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file); //包含cookie数据的文件名，cookie文件的格式可以是Netscape格式，或者只是纯HTTP头部信息存入文件。
        curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); //在HTTP请求中包含一个"User-Agent: "头的字符串。
        curl_setopt($curl, CURLOPT_HEADER, 0); //启用时会将头文件的信息作为数据流输出。
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); //启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器，使用CURLOPT_MAXREDIRS可以限定递归返回的数量。
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); //文件流形式
        curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); //设置cURL允许执行的最长秒数
        $data = (is_array($data)) ? http_build_query($data) : $data;
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DEL');
        curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Length: ' . strlen($data)));
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        if (is_array($header))
            curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //设置请求的Header

        $content = curl_exec($curl);
        $curl_errno = curl_errno($curl);
        if ($curl_errno > 0) {
            Logger::setlog($error = sprintf("curl error=%s, errno=%d.", curl_error($curl), $curl_errno));
            curl_close($curl);
            return false;
        }
        curl_close($curl);
        return $content;
    }

}