关闭未认证连接

问题:

如何关闭规定时间内未发送过数据的客户端,

比如30秒内没收到一条数据就自动关闭这个客户端连接,

目的是为了让未认证的连接必须在规定时间内认证

答案:

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