| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 | <?phpnamespace App\Services;class AipHttpClient{    protected $headers;    protected $connectTimeout;    protected $socketTimeout;    protected $conf;    /**     * HttpClient     * @param array $headers HTTP header     */    public function __construct($headers = array())    {        $this->headers = $this->buildHeaders($headers);        $this->connectTimeout = 60000;        $this->socketTimeout = 60000;        $this->conf = array();    }    /**     * 连接超时     * @param int $ms 毫秒     */    public function setConnectionTimeoutInMillis($ms)    {        $this->connectTimeout = $ms;    }    /**     * 响应超时     * @param int $ms 毫秒     */    public function setSocketTimeoutInMillis($ms)    {        $this->socketTimeout = $ms;    }    /**     * 配置     * @param array $conf     */    public function setConf($conf)    {        $this->conf = $conf;    }    /**     * 请求预处理     * @param resource $ch     */    public function prepare($ch)    {        foreach ($this->conf as $key => $value) {            curl_setopt($ch, $key, $value);        }    }    /**     * @param string $url     * @param array $data HTTP POST BODY     * @param array $param HTTP URL     * @param array $headers HTTP header     * @return array     */    public function post($url, $data = array(), $params = array(), $headers = array())    {        $url = $this->buildUrl($url, $params);        $headers = array_merge($this->headers, $this->buildHeaders($headers));        $ch = curl_init();        $this->prepare($ch);        curl_setopt($ch, CURLOPT_URL, $url);        curl_setopt($ch, CURLOPT_POST, 1);        curl_setopt($ch, CURLOPT_HEADER, false);        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);        curl_setopt($ch, CURLOPT_POSTFIELDS, is_array($data) ? http_build_query($data) : $data);        curl_setopt($ch, CURLOPT_TIMEOUT_MS, $this->socketTimeout);        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, $this->connectTimeout);        $content = curl_exec($ch);        $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);        if ($code === 0) {            throw new Exception(curl_error($ch));        }        curl_close($ch);        return array(            'code' => $code,            'content' => $content,        );    }    /**     * @param string $url     * @param array $datas HTTP POST BODY     * @param array $param HTTP URL     * @param array $headers HTTP header     * @return array     */    public function multi_post($url, $datas = array(), $params = array(), $headers = array())    {        $url = $this->buildUrl($url, $params);        $headers = array_merge($this->headers, $this->buildHeaders($headers));        $chs = array();        $result = array();        $mh = curl_multi_init();        foreach ($datas as $data) {            $ch = curl_init();            $chs[] = $ch;            $this->prepare($ch);            curl_setopt($ch, CURLOPT_URL, $url);            curl_setopt($ch, CURLOPT_POST, 1);            curl_setopt($ch, CURLOPT_HEADER, false);            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);            curl_setopt($ch, CURLOPT_POSTFIELDS, is_array($data) ? http_build_query($data) : $data);            curl_setopt($ch, CURLOPT_TIMEOUT_MS, $this->socketTimeout);            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, $this->connectTimeout);            curl_multi_add_handle($mh, $ch);        }        $running = null;        do {            curl_multi_exec($mh, $running);            usleep(100);        } while ($running);        foreach ($chs as $ch) {            $content = curl_multi_getcontent($ch);            $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);            $result[] = array(                'code' => $code,                'content' => $content,            );            curl_multi_remove_handle($mh, $ch);        }        curl_multi_close($mh);        return $result;    }    /**     * @param string $url     * @param array $param HTTP URL     * @param array $headers HTTP header     * @return array     */    public function get($url, $params = array(), $headers = array())    {        $url = $this->buildUrl($url, $params);        $headers = array_merge($this->headers, $this->buildHeaders($headers));        $ch = curl_init();        $this->prepare($ch);        curl_setopt($ch, CURLOPT_URL, $url);        curl_setopt($ch, CURLOPT_HEADER, false);        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);        curl_setopt($ch, CURLOPT_TIMEOUT_MS, $this->socketTimeout);        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, $this->connectTimeout);        $content = curl_exec($ch);        $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);        if ($code === 0) {            throw new Exception(curl_error($ch));        }        curl_close($ch);        return array(            'code' => $code,            'content' => $content,        );    }        /**     * @param string $url     * @param array $param HTTP URL     * @param array $headers HTTP header     * @return array     */    public function getnew($url, $params = array(), $headers = array())    {        $url = $this->buildUrl($url, $params);        $headers = array_merge($this->headers, $this->buildHeaders($headers));        $ch = curl_init();        $this->prepare($ch);        curl_setopt($ch, CURLOPT_URL, $url);        curl_setopt($ch, CURLOPT_HEADER, false);        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);        curl_setopt($ch, CURLOPT_TIMEOUT_MS, $this->socketTimeout);        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, $this->connectTimeout);        $content = curl_exec($ch);        $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);        if ($code === 0) {            throw new Exception(curl_error($ch));        }        curl_close($ch);        return $content;    }        /**     * API请求     * @param $url  链接     * @param $data  参数     */    public function postnew($url, $data = null, $time=0)    {        $ch = curl_init();        curl_setopt($ch, CURLOPT_URL, $url);        curl_setopt($ch, CURLOPT_HEADER, 0);        curl_setopt($ch, CURLOPT_POST, 1);        curl_setopt($ch, CURLOPT_TIMEOUT, $time);          //单位秒,也可以使用        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //这个是重点,规避ssl的证书检查。        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // 跳过host验证        if(!empty($data)){            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);        }        $content = curl_exec($ch);        curl_close($ch);        return $content;    }    /**     * 构造 header     * @param array $headers     * @return array     */    private function buildHeaders($headers)    {        $result = array();        foreach ($headers as $k => $v) {            $result[] = sprintf('%s:%s', $k, $v);        }        return $result;    }    /**     *     * @param string $url     * @param array $params 参数     * @return string     */    private function buildUrl($url, $params)    {        if (!empty($params)) {            $str = http_build_query($params);            return $url . (strpos($url, '?') === false ? '?' : '&') . $str;        } else {            return $url;        }    }}
 |