Đóng kết nối không được xác thực

Vấn đề:

Làm thế nào để đóng kết nối của khách hàng chưa gửi dữ liệu trong khoảng thời gian quy định, chẳng hạn như tự động đóng kết nối của khách hàng nếu không nhận được dữ liệu trong vòng 30 giây, mục đích là để các kết nối chưa được xác thực phải xác thực trong khoảng thời gian quy định.

Câu trả lời:

use Workerman\Worker;
use Workerman\Timer;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('xxx://x.x.x.x:x');
$worker->onConnect = function(TcpConnection $connection)
{
    // Tạm thời thêm thuộc tính auth_timer_id vào đối tượng $connection để lưu trữ ID bộ hẹn giờ
    // Bộ hẹn giờ 30 giây để đóng kết nối, yêu cầu khách hàng phải gửi xác thực trong vòng 30 giây để xóa bộ hẹn giờ
    $connection->auth_timer_id = Timer::add(30, function()use($connection){
        $connection->close();
    }, null, false);
};
$worker->onMessage = function(TcpConnection $connection, $msg)
{
    $msg = json_decode($msg, true);
    switch($msg['type'])
    {
    case 'login':
        ...略
        // Xác thực thành công, xóa bộ hẹn giờ để tránh việc kết nối bị đóng
        Timer::del($connection->auth_timer_id);
        break;
         ... 略
    }
    ... 略
}