অপ্রমাণিত সংযোগ বন্ধ করা

সমস্যা:

কিভাবে নির্ধারিত সময়ের মধ্যে তথ্য না পাঠানো ক্লায়েন্ট বন্ধ করবেন,
যেমন 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 গুণ যুক্ত করা হচ্ছে যা টাইমার আইডি ধরে রাখবে
    // 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;
         ... 略
    }
    ... 略
}