早期的Swoole客户端不支持连接超时检测,即使在connect方法中传入了超时时间在异步客户端中也是无效的。所以需要客户端自行添加定时器来检测连接是否超时。1.9.14版本底层增加了超时机制,应用不再需要添加定时器。

TCP客户端

  1. $client = new Swoole\Client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
  2. //设置事件回调函数
  3. $client->on("connect", function($cli) {
  4. $cli->send("hello world\n");
  5. });
  6. $client->on("receive", function($cli, $data){
  7. echo "Received: ".$data."\n";
  8. });
  9. $client->on("error", function($cli){
  10. echo "Connect failed\n";
  11. });
  12. $client->on("close", function($cli){
  13. echo "Connection close\n";
  14. });
  15. //发起网络连接
  16. $client->connect('127.0.0.1', 9501, 0.5);

Http客户端

除了连接超时外,某些请求响应式的异步客户端,如HttpClient,还支持了请求超时设置。当HttpClient发送了Request后服务器未能在规定的时间内返回Response,这时底层会自动close,并回调。HttpClient的状态码将设置为-2

  1. $cli = new Swoole\Http\Client('127.0.0.1', 80);
  2. $cli->set(array(
  3. "timeout" => 3.0, //设置连接和请求的超时时间为3秒
  4. ));
  5. $cli->setHeaders(array('User-Agent' => 'swoole-http-client'));
  6. $cli->setCookies(array('test' => 'value'));
  7. $cli->post('/dump.php', array("test" => 'abc'), function ($cli) {
  8. if (empty($cli->body)) {
  9. if ($cli->statusCode == -1) {
  10. echo "连接服务器超时\n";
  11. } else if ($cli->statusCode == -2) {
  12. echo "服务器响应超时\n";
  13. }
  14. } else {
  15. echo "请求成功:HTML=".$cli->body;
  16. }
  17. });

原文:https://wiki.swoole.com/wiki/page/751.html