🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 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)