Guzzle,优秀的HTTP处理类库
Guzzle 基本信息
类库简介
Guzzle is a PHP HTTP client that makes it easy to send HTTP requests and trivial to integrate with web services.
guzzle 是一个PHP HTTP客户端,能够更容易的发送HTTP请求,并且可以轻松的与web服务集成。
你可以将 guzzle 理解成 “没有界面的浏览器”,它可以实现获取网站HTML内容、登录网站、上传文件等行为,但是整个操作的过程不是键盘+鼠标,而是通过编程去实现。
PS:guzzle 支持发起异步请求和多线程请求。
下载地址
composer composer require guzzlehttp/guzzle
github https://github.com/guzzle/guzzle
运行环境
最新版本 6.3.0 需要 php5.5以上的版本。
如果使用 stream 相关功能,需要在php.ini中打开 allow_url_fopen
。
如果需要使用 curl 相关功能,也必须启用 curl(7.19.4)和zlib,完美处理https还需要 OpenSSL。
提醒:如果未安装 curl,guzzle 将使用 PHP stream 发送请求,你还可以自定义其他的HTTP的处理程序。
开发文档
官方文档:http://docs.guzzlephp.org/en/stable/
中文文档:http://guzzle-cn.readthedocs.io/zh_CN/latest/
基础用法
这是最基本的需求,发起请求,并且获取响应内容,将GET切换为POST即可发起POST请求。
$client = new GuzzleHttp\Client();
$res = $client->request(
'GET',
'http://127.0.0.1'
);
//获取HTTP状态码
var_dump($res->getStatusCode());
//获取响应头
var_dump($res->getHeader('content-type'));
//获取响应内容
echo $res->getBody();
通过GET发送数据
$res = $client->request(
'GET',
'http://127.0.0.1/php library/gpc.php',
[
'query'=>['a'=>1]
]
);
通过POST发送数据
$res = $client->request(
'POST',
'http://127.0.0.1/php library/gpc.php',
[
'form_params'=>['a'=>1]
]
);
上传文件
//读取待上传的文件
$contents = fopen('./20171204-guzzle.php', 'r');
$body = [
//上传文件
[
'name' => 'a',
'contents' => $contents,
],
//普通表单
[
'name' => 'b',
'contents' => 1,
]
];
$res = $client->request(
'POST',
'http://127.0.0.1/php library/gpc.php',
['multipart'=>$body]
);
携带COOKIE发起请求
这就是传说中的模拟登陆了嘛,可以使用PHP去模拟登陆目标网站,然后去实现一些不可告人的目的。
$cookieJar = GuzzleHttp\Cookie\CookieJar::fromArray([
'cookie_name' => 'cookie_value'
], '127.0.0.1');
$res = $client->request(
'GET',
'http://127.0.0.1/php library/gpc.php',
['cookies' => $cookieJar]
);
玩cookie,需要你对HTTP有更多一点了解,如果你搞不清楚本段代码,就去补课吧。
上面的代码,需要你预先提供COOKIE,当然你也可以配合其他例子,自动抓取COOKIE,自行研究。
异步的玩法
在此之前,我也没有好好阅读过 guzzle 的文档,甚至不知道它支持异步请求。所以,这段内容是现做现卖,如有差异,请大家及时提出。
测试方法
使用for循环,按序生成10次请求。请求目标设置了随机延迟 (sleep(mt_rand(0,2)))
秒。
如果是同步请求:会按序生成结果。总耗时 = 10次请求的 总延迟秒数。
如果是异步请求:会打乱循环顺序,优先输出延迟低的请求。总耗时 = 耗时最长的请求。
测试结果
下面的代码片段,确实实现了异步请求。
请求编号不是0123,而是根据延迟秒数被打乱。
总请求时间是2秒,而非 1+2+2+2+2+2 = 11秒。
请求开始:03:40:04
延迟0秒,请求编号:0
延迟0秒,请求编号:4
延迟0秒,请求编号:5
延迟0秒,请求编号:6
延迟1秒,请求编号:1
延迟2秒,请求编号:2
延迟2秒,请求编号:3
延迟2秒,请求编号:7
延迟2秒,请求编号:8
延迟2秒,请求编号:9
请求结束:03:40:06
相关代码
$promise = [];
$client = new GuzzleHttp\Client();
echo 'start' . date("Y-m-d H:i:s");
//生成10个请求
for($i=0;$i<10;$i++){
$promise[$i] = $client->requestAsync(
'GET',
//请求目标(记录了请求时间)
'http://127.0.0.1/php library/gpc.php?a='.$i
);
$promise[$i]->then(
function (ResponseInterface $res) {
echo $res->getBody() . "\n";
},
function (RequestException $e) {
echo $e->getMessage() . "\n";
echo $e->getRequest()->getMethod();
}
);
}
//分别调用GuzzleHttp\Promise::wait()方法
foreach( $promise as $obj ){
$obj->wait();
}
echo 'end' . date("Y-m-d H:i:s");
文章来源:http://www.sodevel.com/course/res/170/634
布施恩德可便相知重
微信扫一扫打赏
支付宝扫一扫打赏