Guzzle是一个PHP的HTTP客户端,用来垂手可得地发送请求,并集成到咱们的WEB服务上。php
Github地址:guzzle/guzzlehtml
官方文档:http://docs.guzzlephp.org/en/...git
中文文档:http://guzzle-cn.readthedocs....github
执行composer命令:web
composer require guzzlehttp/guzzle
引入Composer自动加载类:json
require ‘vendor/autoload.php’;
经过Composer更新Guzzle:api
composer.phar update
$client = new \GuzzleHttp\Client(); $res = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle'); echo $res->getStatusCode(); // 200 echo $res->getHeaderLine('content-type'); // 'application/json; charset=utf8' echo $res->getBody(); // '{"id": 1420053, "name": "guzzle", ...}' // 发送一个异步请求 $request = new \GuzzleHttp\Psr7\Request('GET', 'http://httpbin.org'); $promise = $client->sendAsync($request)->then(function ($response) { echo 'I completed! ' . $response->getBody(); }); $promise->wait();
经过实例化Client类建立一个客户端:promise
<?php use GuzzleHttp\Client; $client = new Client([ // 基URI 'base_uri' => 'http://httpbin.org', // 设置默认请求参数 'timeout' => 2.0, ]);
Client对象的方法能够很容易的发送请求:cookie
<?php $response = $client->get('http://httpbin.org/get'); $response = $client->delete('http://httpbin.org/delete'); $response = $client->head('http://httpbin.org/get'); $response = $client->options('http://httpbin.org/get'); $response = $client->patch('http://httpbin.org/patch'); $response = $client->post('http://httpbin.org/post'); $response = $client->put('http://httpbin.org/put');
或者建立一个请求,一切就绪后再发送请求:并发
<?php use GuzzleHttp\Psr7\Request; $request = new Request('PUT', 'http://httpbin.org/put'); $response = $client->send($request, ['timeout' => 2]);
直接用Client提供的方法来建立异步请求:
<?php $promise = $client->getAsync('http://httpbin.org/get'); $promise = $client->deleteAsync('http://httpbin.org/delete'); $promise = $client->headAsync('http://httpbin.org/get'); $promise = $client->optionsAsync('http://httpbin.org/get'); $promise = $client->patchAsync('http://httpbin.org/patch'); $promise = $client->postAsync('http://httpbin.org/post'); $promise = $client->putAsync('http://httpbin.org/put');
或者使用Client的 sendAsync() and requestAsync() 方法:
<?php // 建立一个PSR-7请求对象 $headers = ['X-Foo' => 'Bar']; $body = 'Hello!'; $request = new Request('HEAD', 'http://httpbin.org/head', $headers, $body); // 若是不须要进去请求实例 $promise = $client->requestAsync('GET', 'http://httpbin.org/get');
使用 then() 来调用返回值,成功使用 Psr\Http\Message\ResponseInterface 处理器,不然抛出一个异常:
<?php use Psr\Http\Message\ResponseInterface; use GuzzleHttp\Exception\RequestException; $promise = $client->requestAsync('GET', 'http://httpbin.org/get'); $promise->then( function (ResponseInterface $res) { echo $res->getStatusCode() . "\n"; }, function (RequestException $e) { echo $e->getMessage() . "\n"; echo $e->getRequest()->getMethod(); } );
使用Promise和异步请求来同时发送多个请求:
<?php use GuzzleHttp\Client; use GuzzleHttp\Promise; $client = new Client(['base_uri' => 'http://httpbin.org/']); // 初始化每个非阻塞请求 $promises = [ 'image' => $client->getAsync('/image'), 'png' => $client->getAsync('/image/png'), 'jpeg' => $client->getAsync('/image/jpeg'), 'webp' => $client->getAsync('/image/webp') ]; // 等待请求完成 $results = Promise\unwrap($promises); // 经过键名接收每个结果 // function. echo $results['image']->getHeader('Content-Length'); echo $results['png']->getHeader('Content-Length');
当你想发送不肯定数量的请求时,可使用 GuzzleHttp\Pool 对象:
<?php use GuzzleHttp\Pool; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Request; $client = new Client(); $requests = function ($total) { $uri = 'http://127.0.0.1:8126/guzzle-server/perf'; for ($i = 0; $i < $total; $i++) { yield new Request('GET', $uri); } }; $pool = new Pool($client, $requests(100), [ 'concurrency' => 5, 'fulfilled' => function ($response, $index) { // 每一个成功的请求 }, 'rejected' => function ($reason, $index) { // 每一个失败的请求 }, ]); // 初始化传输和建立受权 $promise = $pool->promise(); // 等待请求池完成 $promise->wait();
$code = $response->getStatusCode(); // 200
$reason = $response->getReasonPhrase(); // OK
// 检查是否存在头信息 if ($response->hasHeader('Content-Length')) { echo "It exists"; } // 获取头信息 echo $response->getHeader('Content-Length'); // 获取全部响应头信息 foreach ($response->getHeaders() as $name => $values) { echo $name . ': ' . implode(', ', $values) . "\r\n"; }
$body = $response->getBody(); // 隐式转换成字符串并输出 echo $body; // 显示转换body成字符串 $stringBody = (string) $body; // 从body中读取10字节(bytes) $tenBytes = $body->read(10); // 将正文的剩余内容做为字符串读取 $remainingBytes = $body->getContents();
$response = $client->request('GET', 'http://httpbin.org?foo=bar');
$client->request('GET', 'http://httpbin.org', [ 'query' => ['foo' => 'bar'] ]);
$client->request('GET', 'http://httpbin.org', ['query' => 'foo=bar']);
Guzzle还提供了一些其它有用的功能
具体的能够查看官方文档。
END