<?php

namespace hisi;
class Http {
protected static $userAgent = [
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60',
'Opera/8.0 (Windows NT 5.1; U; en)',
'Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0',
'Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER',
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)',
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)',
'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36',
];
/**
* GET请求
* @param string $url 请求的地址
* @param mixed $params 传递的参数
* @param array $header 传递的头部参数
* @param int $timeout 超时设置,默认30秒
* @param mixed $options CURL的参数
* @return array|string
* @author 橘子俊 <364666827@qq.com>
*/
public static function get($url, $params = '', $header = [], $timeout = 30, $options = [])
{
return self::send($url, $params, 'GET', $header, $timeout, $options);
} /**
* POST请求
* @param string $url 请求的地址
* @param mixed $params 传递的参数
* @param array $header 传递的头部参数
* @param int $timeout 超时设置,默认30秒
* @param mixed $options CURL的参数
* @return array|string
* @author 橘子俊 <364666827@qq.com>
*/
public static function post($url, $params = '', $header = [], $timeout = 30, $options = [])
{
return self::send($url, $params, 'POST', $header, $timeout, $options);
} /**
* DELETE请求
* @param string $url 请求的地址
* @param mixed $params 传递的参数
* @param array $header 传递的头部参数
* @param int $timeout 超时设置,默认30秒
* @param mixed $options CURL的参数
* @return array|string
* @author 橘子俊 <364666827@qq.com>
*/
public static function delete($url, $params = '', $header = [], $timeout = 30, $options = [])
{
return self::send($url, $params, 'DELETE', $header, $timeout, $options);
} /**
* PUT请求
* @param string $url 请求的地址
* @param mixed $params 传递的参数
* @param array $header 传递的头部参数
* @param int $timeout 超时设置,默认30秒
* @param mixed $options CURL的参数
* @return array|string
* @author 橘子俊 <364666827@qq.com>
*/
public static function put($url, $params = '', $header = [], $timeout = 30, $options = [])
{
return self::send($url, $params, 'PUT', $header, $timeout, $options);
} /**
* 下载远程文件
* @param string $url 请求的地址
* @param string $savePath 本地保存完整路径
* @param mixed $params 传递的参数
* @param array $header 传递的头部参数
* @param int $timeout 超时设置,默认3600秒
* @return bool|string
* @author 橘子俊 <364666827@qq.com>
*/
public static function down($url, $savePath, $params = '', $header = [], $timeout = 3600)
{
if (!is_dir(dirname($savePath))) {
Dir::create(dirname($savePath));
} $ch = curl_init();
$fp = fopen($savePath, 'wb'); curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header ? : ['Expect:']);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_NOPROGRESS, 0);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_BUFFERSIZE, 64000);
curl_setopt($ch, CURLOPT_POST, FALSE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params); $res = curl_exec($ch);
$curlInfo = curl_getinfo($ch); if (curl_errno($ch) || $curlInfo['http_code'] != 200) {
curl_error($ch);
@unlink($savePath);
return false;
} else {
curl_close($ch);
} fclose($fp); return $savePath;
} /**
* CURL发送Request请求,支持GET、POST、PUT、DELETE
* @param string $url 请求的地址
* @param mixed $params 传递的参数
* @param string $method 请求的方法
* @param array $header 传递的头部参数
* @param int $timeout 超时设置,默认30秒
* @param mixed $options CURL的参数
* @return array|string
* @author 橘子俊 <364666827@qq.com>
*/
private static function send($url, $params = '', $method = 'GET', $header = [], $timeout = 30, $options = [])
{
$cookieFile = Env::get('runtime_path') . 'temp/' . md5(config('authkey')) . '.txt';
$userAgent = self::$userAgent[array_rand(self::$userAgent, 1)];
$ch = curl_init();
$opt = [];
$opt[CURLOPT_COOKIEJAR] = $cookieFile;
$opt[CURLOPT_COOKIEFILE] = $cookieFile;
$opt[CURLOPT_USERAGENT] = $userAgent;
$opt[CURLOPT_CONNECTTIMEOUT] = $timeout;
$opt[CURLOPT_TIMEOUT] = $timeout;
$opt[CURLOPT_RETURNTRANSFER] = true;
$opt[CURLOPT_HTTPHEADER] = $header ? : ['Expect:'];
$opt[CURLOPT_FOLLOWLOCATION] = true; if (substr($url, 0, 8) == 'https://') {
$opt[CURLOPT_SSL_VERIFYPEER] = false;
$opt[CURLOPT_SSL_VERIFYHOST] = 2;
} if (is_array($params)) {
$params = http_build_query($params);
} switch (strtoupper($method)) {
case 'GET':
$extStr = (strpos($url, '?') !== false) ? '&' : '?';
$opt[CURLOPT_URL] = $url . (($params) ? $extStr . $params : '');
break; case 'POST':
$opt[CURLOPT_POST] = true;
$opt[CURLOPT_POSTFIELDS] = $params;
$opt[CURLOPT_URL] = $url;
break; case 'PUT':
$opt[CURLOPT_CUSTOMREQUEST] = 'PUT';
$opt[CURLOPT_POSTFIELDS] = $params;
$opt[CURLOPT_URL] = $url;
break; case 'DELETE':
$opt[CURLOPT_CUSTOMREQUEST] = 'DELETE';
$opt[CURLOPT_POSTFIELDS] = $params;
$opt[CURLOPT_URL] = $url;
break; default:
return ['error' => 0, 'msg' => '请求的方法不存在', 'info' => []];
break;
} curl_setopt_array($ch, (array) $opt + $options);
$result = curl_exec($ch);
$error = curl_error($ch); if ($result == false || !empty($error)) {
$errno = curl_errno($ch);
$info = curl_getinfo($ch);
curl_close($ch);
return [
'errno' => $errno,
'msg' => $error,
'info' => $info,
];
} curl_close($ch); return $result;
}
}

PHP 的一款http请求封装类的更多相关文章

  1. C# http Get/POST请求封装类

    C#HttpHelper官方产品发布与源码下载---苏飞版 http://www.sufeinet.com/thread-3-1-1.html 在C#用HttpWebRequest中发送GET/HTT ...

  2. ios开发之--使用AFNetWorking 3.1.0 ,简单的请求封装类

    从苹果系统自带的请求类,到ASIHttpRequest第三方请求类,再到AFNetWorking第三方请求类,目前只要牵扯到数据请求,基本上都是用AFN,所以,这里纯粹是记录下: hRequestTo ...

  3. ASP.NET Core 使用UrlFirewall对请求进行过滤

    一. 前言 UrlFirewall 是一个开源.轻便的对http请求进行过滤的中间件,可使用在webapi或者网关(比如Ocelot),由我本人编写,并且开源在github:https://githu ...

  4. XDroidRequest网络请求框架,新开源

    XDroidRequest 是一款网络请求框架,它的功能也许会适合你.这是本项目的第三版了,前两版由于扩展性问题一直不满意,思考来 思考去还是觉得Google的Volley的扩展性最强,于是借鉴了Vo ...

  5. 一个简单可参考的API网关架构设计

    网关一词较早出现在网络设备里面,比如两个相互独立的局域网段之间通过路由器或者桥接设备进行通信, 这中间的路由或者桥接设备我们称之为网关. 相应的 API 网关将各系统对外暴露的服务聚合起来,所有要调用 ...

  6. Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试 (转)

    环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...

  7. 基于springmvc和restClient的rest服务的测试

    在开发中,不熟悉驱动驱动测试开发的coder往往喜欢将服务应用启动以后测试,对于GET请求可以直接在浏览器中输入URL就可以,参数非中文可以直接追加到URL后.但是,对于其他请求方式的测试必须借助相应 ...

  8. Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试

    环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...

  9. HTTP重定向服务器

    程序基本流程如下: 代码组织结构如下: HTTP重定向服务主线程: package com.server; import java.io.IOException; import java.net.Se ...

随机推荐

  1. Linux 磁盘格式化、检验、挂载

    分区完毕之后自然要进行文件系统的格式化.格式化命令mkfs(make file system)这个命令.这是个综合命令,它会去调用正确的文件系统格式化工具软件. 磁盘格式化 mkfs mke2fs m ...

  2. hdoj - 1342 Lotto

    Problem Description In a Lotto I have ever played, one has to select 6 numbers from the set {1,2,... ...

  3. 第12组 Beta冲刺(5/5)

    Header 队名:To Be Done 组长博客 作业博客 团队项目进行情况 燃尽图(组内共享) 展示Git当日代码/文档签入记录(组内共享) 注: 由于GitHub的免费范围内对多人开发存在较多限 ...

  4. spring boot jar包替换报错之Unable to open nested entry 'BOOT-INF/lib/cache-api-0.4.jar'.

    spring boot用layout ZIP打出来的包能够支持外部classpath,但是当用rar/7zip替换其中的jar后,报下列错误: Unable to open nested entry ...

  5. 使用expect快速登录线上机器

    背景: 公司登陆线上服务器一般都要经过跳板机才能登陆,过程比较麻烦,如果要频繁登陆某个机器而且机器名不好记很费劲,使用expect自动登陆会方便很多 实现: 使用expect脚本自动登陆: #!/us ...

  6. JDBC Request :Cannot load JDBC driver class 'com.mysql.jdbc.Driver'解决办法

    在Jmeter中run JDBC Request时,收到了Cannot load JDBC driver class 'com.mysql.jdbc.Driver',在网上搜了一些办法,结合自己的实际 ...

  7. python语言使用yaml 管理selenium元素

    1.所有元素都在PageElement下的.yaml,如图 login_page.yaml文件: username: dec: 登录页 type: xpath value: //input[@clas ...

  8. 两种Redis持久化原理的详解

    Redis为持久化提供了两种方式: RDB:在指定的时间间隔能对你的数据进行快照存储. AOF:记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据. 本文将通过下面内容的介 ...

  9. golang 基于channel封装资源池(可用于封装redis、mq连接池)

    package pool import ( "errors" "io" "sync" "time" ) var ( Er ...

  10. Apache软件基金会核心项目Tomcat的那些事

    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.今天就来为大家介绍一下关于T ...