关闭未认证连接

问题:

如何关闭规定时间内未发送过数据的客户端, 比如30秒内没收到一条数据就自动关闭这个客户端连接, 目的是为了让未认证的连接必须在规定时间内认证

答案:

  1. use Workerman\Worker;
  2. use Workerman\Timer;
  3. use Workerman\Connection\TcpConnection;
  4. require_once __DIR__ . '/vendor/autoload.php';
  5. $worker = new Worker('xxx://x.x.x.x:x');
  6. $worker->onConnect = function(TcpConnection $connection)
  7. {
  8. // 临时给$connection对象添加一个auth_timer_id属性存储定时器id
  9. // 定时30秒关闭连接,需要客户端30秒内发送验证删除定时器
  10. $connection->auth_timer_id = Timer::add(30, function()use($connection){
  11. $connection->close();
  12. }, null, false);
  13. };
  14. $worker->onMessage = function(TcpConnection $connection, $msg)
  15. {
  16. $msg = json_decode($msg, true);
  17. switch($msg['type'])
  18. {
  19. case 'login':
  20. ...略
  21. // 验证成功,删除定时器,防止连接被关闭
  22. Timer::del($connection->auth_timer_id);
  23. break;
  24. ...
  25. }
  26. ...
  27. }