인증되지 않은 연결 닫기
질문:
제한 시간 내에 데이터를 전송하지 않은 클라이언트를 자동으로 닫는 방법은 무엇인가요?
예를 들어 30초 동안 데이터를 수신하지 않으면 해당 클라이언트 연결을 자동으로 닫아서, 인증되지 않은 연결이 규정된 시간 내에 반드시 인증되도록 합니다.
답변:
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)
{
// 임시로 $connection 객체에 auth_timer_id 속성을 추가하여 타이머 ID 저장
// 30초 후 연결을 닫기 위해, 클라이언트는 30초 내에 유효성을 확인하고 타이머를 제거해야 합니다.
$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':
...생략
// 인증 성공 시, 타이머를 제거하여 연결이 닫히는 것을 방지합니다.
Timer::del($connection->auth_timer_id);
break;
... 생략
}
... 생략
}