# 異步Http2.0客戶端
Swoole-1.9.7增加了對Http2.0客戶端的支持。新增的客戶端類名為Swoole\Http2\Client,繼承自Swoole\Client,實現了Http2.0客戶端協議的完整支持。
Http2.0客戶端與Http1.1的最大差別是2.0支持了Stream并發機制,可以同時發起多個GET或POST請求。最大并發數量受限與服務器端規定的max_concurrent_streams設置。
**需要依賴nghttp2庫,編譯Swoole擴展時需要設置--enable-http2、--enable-openssl或--with-openssl-dir。**
[TOC=2,3]
## **swoole_http2_client->__construct**
構造方法,與swoole_http_client的構造方法參數完全一致,共接受3個參數。
~~~
function swoole_http2_client->__construct($host, $port, $ssl = false)
~~~
* $host 服務器的地址,如果未設置host頭,將自動使用$host參數作為默認的host頭
* $port 端口號,SSL一般為443,非SSL一般為80
* $ssl 是否啟用SSL加密,需要依賴openssl
## **swoole_http2_client->get**
發起GET請求,函數原型:
~~~
function swoole_http_client->get(string $path, callable $callback);
~~~
* $path 設置URL路徑,如/index.html,注意這里不能傳入http://domain
* $callback 調用成功或失敗后回調此函數
* Http響應內容會在內存中進行數據拼接。因此如果響應體很大可能會占用大量內存
**回調函數**
與Http1.1客戶端事件回調函數不同,Http2.0回調函數中的參數為Swoole\Http2\Response對象。而不是Client本身。可使用use語法將Client對象傳遞給匿名函數。
~~~
function callback(Swoole\Http2\Response $resp)
{
var_dump($resp->cookie);
var_dump($resp->header);
var_dump($resp->server);
var_dump($resp->body);
var_dump($resp->statusCode);
}
~~~
* cookie 服務器設置的COOKIE信息
* header 服務器發送的Header信息
* server 底層連接與協議相關的信息
* body 服務器發送的響應包體
* statusCode 服務器發送的Http狀態碼,如200、502等
## **swoole_http2_client->post**
發起POST請求,函數原型:
~~~
function swoole_http2_client->post(string $path, mixed $data, callable $callback);
~~~
* $path 設置URL路徑,如/index.html,注意這里不能傳入http://domain
* $data 請求的包體數據,如果$data為數組底層自動會打包為x-www-form-urlencoded格式的POST內容,并設置Content-Type為application/x-www-form-urlencoded
* $callback 調用成功或失敗后回調此函數
**使用實例**
```
$cli = new swoole_http2_client('127.0.0.1', 80);
$cli->post('/post.php', array("a" => '1234', 'b' => '456'), function ($response) {
echo "Length: " . strlen($cli->body) . "\n";
echo $cli->body;
});
```
## **swoole_http2_client->setHeaders**
設置Http請求頭
~~~
function swoole_http2_client->setHeaders(array $headers);
~~~
* $headers必須為鍵值對應的數組,底層會自動映射為$key: $value格式的Http標準頭格式
* setHeaders設置的Http頭在swoole_http2_client對象存活期間的每次請求永久有效
* 重新調用setHeaders會覆蓋上一次的設置
## **swoole_http2_client->setCookies**
設置Cookie
~~~
function swoole_http2_client->setCookies(array $cookies);
~~~
* $cookies 設置COOKIE,必須為鍵值對應數組
* 設置COOKIE后在客戶端對象存活期間會持續保存
* 服務器端主動設置的COOKIE會合并到cookies數組中,可讀取$client->cookies屬性獲得當前Http2客戶端的COOKIE信息
* 重新調用setCookies方法會覆蓋已有COOKIE
```php
<?php
$array = array(
"host" => "www.jd.com",
"accept-encoding" => "gzip, deflate",
'accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'accept-language' => 'zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4,ja;q=0.2',
'user-agent' => 'Mozilla/5.0 (X11; Linux x86_64) Chrome/58.0.3026.3 Safari/537.36',
);
$client = new Swoole\Http2\Client("www.jd.com", 443, true);
$client->setHeaders($array);
$client->setCookies(array("a" => "1", "b" => "2"));
$client->get("/", function ($o) use($client) {
echo "#{$client->sock} hello world 1\n";
echo $o->body;
});
$client->post("/", $array, function ($o) use($client) {
echo "{$client->sock} hello world 3\n";
echo $o->body;
$client->close();
});
Swoole\Event::wait();
- swoole簡介
- swoole功能概述
- 序章
- 開發必讀
- 1 環境搭建
- 1.1 環境搭建
- 1.2 搭建Echo服務器
- 2 初識Swoole
- 2.1 Worker進程
- 2.2 TaskWorker進程
- 2.3 Timer定時器
- 2.4 Process進程
- 2.5 Table內存表
- 2.6 多端口監聽
- 2.7 sendfile文件支持
- 2.8 SSL支持
- 2.9 熱重啟
- 2.10 http_server
- 附錄*server配置
- 附錄*server函數
- 附錄*server屬性
- 附錄*server回調函數
- 附錄*server高級特性
- 心跳檢測
- 3 Swoole協議
- 3.1 EOF協議
- 3.2 固定包頭協議
- 3.3 Http協議
- 3.4 WebSocket協議
- 3.5 MTQQ協議
- 內置http_server
- 內置websocket_server
- Swoole\Redis\Server
- 4 Swoole異步IO
- 4.1 AsyncIO
- 異步文件系統IO
- swoole_async_readfile
- swoole_async_writefile
- swoole_async_read
- swoole_async_write
- 5 swoole異步客戶端
- ws_client
- http_client
- mysql_client
- redis_client
- tcp_client
- http2_client
- 6 swoole協程
- Swoole\Coroutine\Http\Client
- Swoole\Coroutine\MySQL
- Swoole\Coroutine\Redis
- Coroutine\PostgreSQL
- Swoole\Coroutine\Client
- Swoole\Coroutine\Socket
- Swoole\Coroutine\Channel
- Coroutine
- Swoole\Coroutine::create
- Swoole\Coroutine::resume
- Swoole\Coroutine::suspend
- Swoole\Coroutine::sleep
- Coroutine::getaddrinfo
- Coroutine::gethostbyname
- swoole_async_dns_lookup_coro
- Swoole\Coroutine::getuid
- getDefer
- setDefer
- recv
- Coroutine::stats
- Coroutine::fread
- Coroutine::fget
- Coroutine::fwrite
- Coroutine::readFIle
- Coroutine::writeFIle
- Coroutine::exec
- 7 swoole_process
- process::construct
- process::start
- process::name
- process::signal
- process::setaffinity
- process::exit
- process::kill
- process::daemon
- process->exec
- process::wait
- process::alarm
- 8 swoole定時器
- swoole_timer_tick
- swoole_timer_after
- swoole_timer_clear
- 9 swoole_event
- swoole_event_add
- swoole_event_set
- swoole_event_del
- swoole_event_wait
- swoole_event_defer
- swoole_event_write
- swoole_event_exit
- swoole提供的function
- 常見問題
- 客戶端鏈接失敗原因
- 如何設置進程數
- 如何實現異步任務
- 如何選擇swoole三種模式
- php中哪些函數是阻塞的
- 是否可以共用1個redis或mysql連接
- 如何在回調函數中訪問外部的變量
- 為什么不要send完后立即close
- 不同的Server程序實例間如何通信
- MySQL的連接池、異步、斷線重連
- 在php-fpm或apache中使用swoole
- 學習Swoole需要掌握哪些基礎知識
- 在phpinfo中有在php-m中沒有
- 同步阻塞與異步非阻塞選擇
- CURL發送POST請求服務器端超時
- 附錄
- 預定義常量
- 內核參數調優
- php四種回調寫法
- 守護進程程序常用數據結構
- swoole生命周期
- swoole_server中內存管理機制
- 使用jemalloc優化swoole內存分配性能
- Reactor、Worker、Task的關系
- Manager進程
- Swoole的實現
- Reactor線程
- 安裝擴展
- swoole-worker手冊
- swoole相關開源項目
- 寫在后面的話
- 版本更新記錄
- 4.0