1.9.14 使用异步客户端超时机制
最后更新于:2022-04-02 06:17:46
# 1.9.14 使用异步客户端超时机制
[TOC]
早期的Swoole客户端不支持连接超时检测,即使在`connect`方法中传入了超时时间在异步客户端中也是无效的。所以需要客户端自行添加定时器来检测连接是否超时。1.9.14版本底层增加了超时机制,应用不再需要添加定时器。
## TCP客户端
~~~
$client = new Swoole\Client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
//设置事件回调函数
$client->on("connect", function($cli) {
$cli->send("hello world\n");
});
$client->on("receive", function($cli, $data){
echo "Received: ".$data."\n";
});
$client->on("error", function($cli){
echo "Connect failed\n";
});
$client->on("close", function($cli){
echo "Connection close\n";
});
//发起网络连接
$client->connect('127.0.0.1', 9501, 0.5);
~~~
* `connect`方法的第三个参数就表示设置超时时间,如果在约定的时间内服务器没有响应,底层将自动`close`并回调`onError`事件
* `onError`回调中可以使用`$client->errCode`获取错误码,连接超时的错误码为`ETIMEOUT`
## Http客户端
除了连接超时外,某些请求响应式的异步客户端,如HttpClient,还支持了请求超时设置。当`HttpClient`发送了`Request`后服务器未能在规定的时间内返回`Response`,这时底层会自动`close`,并回调。`HttpClient`的状态码将设置为`-2`
~~~
$cli = new Swoole\Http\Client('127.0.0.1', 80);
$cli->set(array(
"timeout" => 3.0, //设置连接和请求的超时时间为3秒
));
$cli->setHeaders(array('User-Agent' => 'swoole-http-client'));
$cli->setCookies(array('test' => 'value'));
$cli->post('/dump.php', array("test" => 'abc'), function ($cli) {
if (empty($cli->body)) {
if ($cli->statusCode == -1) {
echo "连接服务器超时\n";
} else if ($cli->statusCode == -2) {
echo "服务器响应超时\n";
}
} else {
echo "请求成功:HTML=".$cli->body;
}
});
~~~
* [TCP客户端](https://wiki.swoole.com/wiki/page/751.html#entry_h2_0)
* [Http客户端](https://wiki.swoole.com/wiki/page/751.html#entry_h2_1)
';