123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- <?php
- namespace addons\blog\library\aip\lib;
- /*
- * Copyright (c) 2017 Baidu.com, Inc. All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * Http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
- /**
- * Http Client
- */
- class AipHttpClient
- {
- /**
- * 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,
- );
- }
- /**
- * 构造 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;
- }
- }
- }
|