ZhaoYanping00 2019-09-08
<?php /** * HTTP请求类 */ class HttpTool { protected $connect_timeout; protected $request_timeout; public function __construct($connect_timeout = 5, $request_timeout = 55) { $this->connect_timeout = $connect_timeout; $this->request_timeout = $request_timeout; } public function httpRequest($url, $data, $type = 'POST', $header = [], $opt = [], &$curl_info = []) { $ch = curl_init($url); $options = array( CURLOPT_HTTPHEADER => $header, CURLOPT_RETURNTRANSFER => 1, CURLOPT_CONNECTTIMEOUT => $this->connect_timeout, CURLOPT_TIMEOUT => $this->request_timeout, CURLOPT_SSL_VERIFYPEER => 0, CURLOPT_SSL_VERIFYHOST => 0, CURLOPT_DNS_CACHE_TIMEOUT => 86400, ); switch ($type) { case 'POST': $options[CURLOPT_POST] = 1; $options[CURLOPT_POSTFIELDS] = is_array($data) ? http_build_query($data) : $data; break; case 'GET': $options[CURLOPT_HTTPGET] = 1; empty($data) or $options[CURLOPT_URL] = $url . '?' . http_build_query($data); break; } $options = $opt + $options; // 数组联合运算 curl_setopt_array($ch, $options); $response = curl_exec($ch); $curl_info = curl_getinfo($ch); if ($no = curl_errno($ch)) { $error = curl_error($ch); curl_close($ch); if(in_array(intval($no), [7, 28], true)) { throw new \DomainException("连接或请求{$url}超时:{$error}", $no); } throw new \DomainException("请求{$url}失败:" . $error, $no); } curl_close($ch); return $response; } public function soapRequest($url, $function_name, array $arguments, $opt = [], &$request_xml = '', &$response_xml = '') { try { ini_set('default_socket_timeout', $this->request_timeout); $options = array_merge([ 'cache_wsdl' => WSDL_CACHE_MEMORY, 'connection_timeout' => $this->connect_timeout, 'trace' => 1, ], $opt); libxml_disable_entity_loader(false); $client = new \SoapClient($url, $options); $response = $client->__soapCall($function_name, $arguments); $request_xml = $client->__getLastRequest(); $response_xml = $client->__getLastResponse(); return $response; } catch (\SoapFault $e) { //超时、连接不上 if (in_array($e->faultcode, [ 'HTTP', 'WSDL', ], true)) { throw new \DomainException("连接或请求{$url}超时", $e->getCode()); } throw new \DomainException($e, $e->getCode()); } } }