إغلاق الاتصالات غير المعتمدة

المشكلة:

كيف يمكن إغلاق عميل لم يتم إرسال بيانات منه خلال فترة زمنية محددة،
على سبيل المثال إذا لم يتم استلام أي بيانات خلال 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)
{
    // مؤقتًا أضف خاصية auth_timer_id إلى كائن $connection لتخزين معرف المؤقت
    // يتم إغلاق الاتصال بعد 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;
         ... 略
    }
    ... 略
}