YurunHttp 是开源的 PHP HTTP 类库,支持链式操作,简单易用。
支持所有常见的 GET、POST、PUT、DELETE、UPDATE 等请求方式,支持 Http2、WebSocket、浏览器级别 Cookies 管理、上传下载、设置和读取 header、Cookie、请求参数、失败重试、限速、代理、证书等。
支持 Curl 和 Swoole 环境智能识别兼容。
API 文档:https://apidoc.gitee.com/yuru...
Github:https://github.com/Yurunsoft/...
Gitee:https://gitee.com/yurunsoft/Y...
git 仓库中 examples 目录里是示例代码!
更新日志(v4.2.0):
- 重构 Swoole 处理器,并发请求性能大幅提升
- 降低 PHP 版本依赖至 5.5
更新日志(v4.1.0):
- 实现智能识别场景,自动选择适合 Curl/Swoole 环境的处理器
性能测试
循环 1W 请求测试排行
排行 | 名称 | 时间(单位:秒) | 环境 |
---|---|---|---|
1 | yurunhttp-swoole | 1.69s | Swoole |
2 | yurunhttp-curl | 2.08s | Curl |
3 | guzzle | 2.71s | Curl |
4 | saber | 2.77s | Swoole |
并发 1W 请求测试排行
排行 | 名称 | 时间(单位:秒) | 环境 |
---|---|---|---|
1 | yurunhttp-swoole | 1.21s | Swoole |
2 | saber | 1.47s | Swoole |
3 | yurunhttp-curl | 3.25s | Curl |
4 | guzzle | 7.39s | Curl |
测试仓库:https://github.com/Yurunsoft/...
视频地址:https://www.bilibili.com/vide...
重大版本更新日志
每个小版本的更新日志请移步到 Release 查看
v4.2.0 重构 Swoole 处理器,并发请求性能大幅提升 (PHP 版本依赖降为 >= 5.5)
v4.1.0 实现智能识别场景,自动选择适合 Curl/Swoole 环境的处理器
v4.0.0 新增支持 Swoole 并发批量请求 (PHP >= 7.1)
v3.5.0 新增支持 Curl 并发批量请求 (PHP >= 5.5)
v3.4.0 新增支持 Http2 全双工用法
v3.3.0 新增支持 Http2 兼容用法
v3.2.0 新增支持 Swoole WebSocket 客户端
v3.1.0 引入浏览器级别 Cookies 管理
v3.0.0 新增支持 Swoole 协程
v2.0.0 黑历史,不告诉你
v1.3.1 支持 Composer
v1.0-1.3 初期版本迭代
Composer
本项目可以使用composer安装,遵循psr-4自动加载规则,在你的 composer.json 中加入下面的内容
{
"require": {
"yurunsoft/yurun-http": "^4.2.0"
}
}
然后执行 composer update 安装。
之后你便可以使用 include "vendor/autoload.php";
来自动加载类。(ps:不要忘了namespace)
用法
简单调用
ua('YurunHttp')
->get('http://www.baidu.com');
echo 'html:', PHP_EOL, $response->body();
并发批量请求
use \Yurun\Util\YurunHttp\Co\Batch;
$result = Batch::run([
(new HttpRequest)->url('https://www.imiphp.com'),
(new HttpRequest)->url('https://www.yurunsoft.com'),
]);
var_dump($result[0]->getHeaders(), strlen($result[0]->body()), $result[0]->getStatusCode());
var_dump($result[1]->getHeaders(), strlen($result[1]->body()), $result[1]->getStatusCode());
WebSocket Client
YurunHttp::setDefaultHandler(\Yurun\Util\YurunHttp\Handler\Swoole::class);
go(function(){
$url = 'ws://127.0.0.1:1234/';
$http = new HttpRequest;
$client = $http->websocket($url);
if(!$client->isConnected())
{
throw new \RuntimeException('Connect failed');
}
$client->send('data');
$recv = $client->recv();
var_dump('recv:', $recv);
$client->close();
});
Http2 全双工用法
$uri = new Uri('https://wiki.swoole.com/');
// 客户端初始化和连接
$client = new \Yurun\Util\YurunHttp\Http2\SwooleClient($uri->getHost(), Uri::getServerPort($uri), 'https' === $uri->getScheme());
$client->connect();
// 请求构建
$httpRequest = new HttpRequest;
$request = $httpRequest->header('aaa', 'bbb')->buildRequest($uri, [
'date' => $i,
], 'POST', 'json');
for($i = 0; $i < 10; ++$i)
{
go(function() use($client, $request){
// 发送(支持在多个协程执行)
$streamId = $client->send($request);
var_dump('send:' . $streamId);
// 接收(支持在多个协程执行)
$response = $client->recv($streamId, 3);
$content = $response->body();
var_dump($response);
});
}
具体详见examples目录中的示例代码