123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- <?php
- namespace network;
- /**
- * Created by PhpStorm.
- * User: Administrator
- * Date: 2022/8/18
- * Time: 13:00
- */
- class CurlHelper
- {
- private $curl;
- private $showResponseHeader = false;
- private $responseHeader;
- private $showRequestHeader = false;
- private $requestHeader;
- private $response;
- private $responseBody;
- private $httpCode;
- private $error;
- public function __construct($url, $params = [])
- {
- $this->curl = curl_init();
- curl_setopt($this->curl, CURLOPT_URL, $url);
- curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, true);//要求结果为字符串且输出到屏幕上
- curl_setopt($this->curl, CURLOPT_FOLLOWLOCATION, true);//跟踪爬取重定向页面
- curl_setopt($this->curl, CURLOPT_MAXREDIRS, 10);//表示最多允许重定向多少次
- curl_setopt($this->curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
- $this->setUserAgent();
- $this->setTimeout();
- $this->setEncoding();
- //跳过https证书验证
- if (substr($url, 0, 5) == 'https') {
- $this->sslVerify();
- }
- $this->setParams($params);
- }
- /**
- * @param string $userAgent
- */
- public function setUserAgent($userAgent = '')
- {
- if (!$userAgent) {
- $userAgent = empty($_SERVER['HTTP_USER_AGENT']) ? 'Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)' : $_SERVER['HTTP_USER_AGENT'];//模拟用户使用的浏览器
- }
- curl_setopt($this->curl, CURLOPT_USERAGENT, $userAgent);
- }
- /**
- * 设置超时
- * @param int $connect_timeout
- * @param int $timeout
- */
- public function setTimeout($connect_timeout = 10, $timeout = 300)
- {
- curl_setopt($this->curl, CURLOPT_CONNECTTIMEOUT, $connect_timeout);//连接超时时间
- curl_setopt($this->curl, CURLOPT_TIMEOUT, $timeout);//数据传输的最大允许时间, 默认为0,意思是永远不会断开链接
- }
- /**
- * 设置请求参数
- * @param $params array
- */
- public function setParams($params)
- {
- if ($params) {
- // post请求
- curl_setopt($this->curl, CURLOPT_POST, true);
- // $post_data为array类型时multipart/formdata请求,string类型时application/x-www-form-urlencoded
- curl_setopt($this->curl, CURLOPT_POSTFIELDS, $params);
- } else {
- // get请求
- curl_setopt($this->curl, CURLOPT_HTTPGET, true);
- }
- }
- /**
- * 设置代理
- * @param $proxy_host string
- * @param $proxy_port int
- */
- public function setProxy($proxy_host, $proxy_port)
- {
- curl_setopt($this->curl, CURLOPT_PROXY, $proxy_host);
- curl_setopt($this->curl, CURLOPT_PROXYPORT, $proxy_port);
- }
- /**
- * 默认跳过https证书验证
- * @param bool $ignore
- */
- public function sslVerify($ignore = false)
- {
- if ($ignore) {
- curl_setopt($this->curl, CURLOPT_SSL_VERIFYPEER, TRUE);//严格校验
- curl_setopt($this->curl, CURLOPT_SSL_VERIFYHOST, 2);//严格校验
- } else {
- curl_setopt($this->curl, CURLOPT_SSL_VERIFYPEER, false);//跳过证书检查
- curl_setopt($this->curl, CURLOPT_SSL_VERIFYHOST, false);//从证书中检查SSL加密算法是否存在
- }
- }
- /**
- * 设置证书,默认不需要
- * @param $sslCertPath string
- * @param $sslKeyPath string
- */
- public function useCert($sslCertPath, $sslKeyPath)
- {
- //设置证书,证书路径,注意应该填写绝对路径
- //使用证书:cert 与 key 分别属于两个.pem文件
- //证书文件请放入服务器的非web目录下,防止被他人下载
- curl_setopt($this->curl, CURLOPT_SSLCERTTYPE, 'PEM');
- curl_setopt($this->curl, CURLOPT_SSLCERT, $sslCertPath);
- curl_setopt($this->curl, CURLOPT_SSLKEYTYPE, 'PEM');
- curl_setopt($this->curl, CURLOPT_SSLKEY, $sslKeyPath);
- }
- /**
- * @param $referer string
- */
- public function setReferer($referer)
- {
- if ($referer) {
- curl_setopt($this->curl, CURLOPT_REFERER, $referer);
- }
- }
- /**
- * 设置转码
- * @param string $encode 默认是可解压缩gzip、deflate等压缩文件
- */
- public function setEncoding($encode = '')
- {
- curl_setopt($this->curl, CURLOPT_ENCODING, $encode);
- }
- /**
- * @param $header array
- */
- public function setHeader($header)
- {
- if (!$header) {
- return;
- }
- // 将索引数组转为键值数组
- // 例如:['User-Agent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64)'] 转为 ['User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64)']
- if (!isset($header[0])) {
- foreach ($header as $hk => $hv) {
- unset ($header [$hk]);
- $header [] = $hk . ':' . $hv;
- }
- }
- curl_setopt($this->curl, CURLOPT_HTTPHEADER, $header);
- }
- /**
- * @param $cookie string
- */
- public function setCookie($cookie)
- {
- if ($cookie) {
- curl_setopt($this->curl, CURLOPT_COOKIE, $cookie);
- }
- }
- /**
- * 获取响应头
- */
- public function showResponseHeader()
- {
- curl_setopt($this->curl, CURLOPT_HEADER, true);//显示响应内容+响应头
- $this->showResponseHeader = true;
- }
- /**
- * 获取请求头
- */
- public function showRequestHeader()
- {
- curl_setopt($this->curl, CURLINFO_HEADER_OUT, true);
- $this->showRequestHeader = true;
- }
- //执行请求
- public function exec()
- {
- // 发送请求
- $this->response = curl_exec($this->curl);
- $this->httpCode = curl_getinfo($this->curl, CURLINFO_HTTP_CODE);
- if ($error = curl_error($this->curl)) {
- $this->error = $error;
- } else {
- if ($this->showRequestHeader) {// 请求头
- $this->requestHeader = curl_getinfo($this->curl, CURLINFO_HEADER_OUT);
- }
- //头信息大小,curl 在这里有 BUG,需要升级到7.4 或 7.5
- $headerSize = curl_getinfo($this->curl, CURLINFO_HEADER_SIZE);
- $this->responseBody = substr($this->response, $headerSize);
- $this->responseHeader = substr($this->response, 0, $headerSize);
- }
- curl_close($this->curl);//结束
- }
- //响应状态码
- public function getHttpCode()
- {
- return $this->httpCode;
- }
- //响应内容
- public function getResponse()
- {
- if ($this->showResponseHeader) {
- return $this->responseBody;
- }
- return $this->response;
- }
- //响应的错误消息
- public function getError()
- {
- return $this->error;
- }
- //响应体
- public function getResponseBody()
- {
- return $this->responseBody;
- }
- //请求头
- public function getRequestHeader()
- {
- return $this->showRequestHeader ? $this->requestHeader : '';
- }
- //响应头
- public function getResponseHeader()
- {
- return $this->showResponseHeader ? $this->responseHeader : '';
- }
- }
|