سؤال

العملاء لدينا أود أن أعرف الذين هو على الانترنت و حاليا باستخدام تطبيق مخصص كتبنا لهم.ناقشت معهم وهذه لا تحتاج إلى أن تكون بالضبط, أكثر من guestimate العمل.

حتى فكرتي 15 دقيقة الوقت الفاصل لتحديد نشاط المستخدم.بعض الأفكار لعمل هذا هي كما يلي:

  1. ختم بهم سجل المستخدم مع تاريخ ووقت آخر نشاط كل مرة يفعلون شيئا أن يضرب قاعدة بيانات أو طلبات صفحة ويب ...هذا على الرغم من يمكن أن تكون قاعدة البيانات المكثفة.

  2. إرسال "من هو على الانترنت طلب" من برنامجنا, أبحث عن الردود ، ويمكن أن يتم ذلك في موعد فاصل ثم ختم سجل المستخدم مع التاريخ الحالي والوقت لكل استجابة وصلتني.

ما هي أفكارك ؟ وكيف يمكنك التعامل مع هذا الوضع ؟

التوضيح

وأود أن استخدام نفس العمارة على حد سواء ويندوز أو شبكة الإنترنت إذا كان ذلك ممكنا.لدي واحدة منطق الأعمال طبقة متعددة واجهات المستخدم التفاعل مع, يمكن أن يكون ويندوز أو شبكة الإنترنت.

ويندوز أنا يعني ملقم-عميل.

التوضيح

أنا باستخدام n-tier architecture حتى عملي الكائنات التعامل مع كل تفاعل مع طبقة العرض.أن طبقة العرض يمكن تغذية ملقم-عميل Windows التطبيق, التطبيق على شبكة الإنترنت, على شبكة الإنترنت خدمة وهلم جرا.

وهي ليست حركة المرور عالية التطبيق ، كما أنها وضعت عميلا لنا ، ربما 100 مستخدم على الأكثر.

هل كانت مفيدة؟

المحلول

الحل لدينا هو الحفاظ على "الصفقة" الجدول (الذي يتبع ما تم القيام به) ، بالإضافة إلى "جلسة" الطاولة (الذي يتبع من كان هنا).تحديث إدراج وحذف التعليمات كلها تدار من خلال "الصفقة" وجوه كل من هذه SQL التعليمات المخزنة في "الصفقة" الجدول مرة واحدة وقد تم تنفيذها بنجاح في قاعدة البيانات (اعتمادا على الجداول تحديث:لدينا إمكانية التحديد اتباع بعض الجداول و تجاهل الآخرين).هذه "الصفقة" الجدول يحتوي على الحقول الأخرى مثل transactiontType (أنا أدخل ، د حذف ، ش التحديث) ، transactionDateTime, الخ, و الأجنبية الرئيسية "sessionId" ، تقول لنا أخيرا من أرسل التعليمات.فمن الممكن حتى من خلال بعض التعليمات البرمجية لتحديد من فعل ماذا و متى (جوس إنشاء سجل يوم الاثنين تيم تغير سعر الوحدة يوم الثلاثاء ليز وأضاف خصم إضافي يوم الخميس ، إلخ).

إيجابيات هذا الحل:

  1. كنت قادرا على أن أقول "ما الذي", و إلى جميع المستخدمين!(سوف تحتاج بعض التعليمات البرمجية لتحليل البيانات SQL)
  2. إذا كان يتم نسخ البيانات, و فشل النسخ المتماثل, يمكنك إعادة إنشاء قاعدة البيانات الخاصة بك من خلال هذا الجدول

سلبيات

  1. 100 000 تحديثات البيانات شهريا يعني 100 000 السجلات في Tbl_Transaction
  2. أخيرا, هذا الجدول يميل إلى أن يكون 99% من حجم قاعدة البيانات الخاصة بك

لدينا خيار:جميع السجلات القديمة من 90 يوما يتم حذفها تلقائيا كل صباح

نصائح أخرى

رأيت استراتيجية 1 العمل من قبل.طبعا الموقع كان صغير واحد.

وأتساءل كيف موقع مثل ستاكوفيرفلوو أليس كذلك ؟

يجب أن الهدف حدث معين ، أنا فقط مزخرف حول الموقع ، نلقي نظرة على صفحتي الشخصية, و لا يزال يقول شيئا مثل آخر تواجد 8 دقائق مضت.

كنت مجرد قطرة سجل سجل الجدول في قاعدة البيانات.

UserId الباحث FK
عمل char(3) ('في' أو 'خارج')
الوقت التاريخ والوقت

يمكنك إسقاط سجل جديد في الجدول عند شخص ما بتسجيل الدخول أو الخروج أو تحديث السجل الأخير للمستخدم.

إذا كان لديك بيانات الدورة فقط استخدام هذا.معظم الدورة بالفعل مع الطوابع الزمنية حتى أنها يمكن أن تنتهي جلسات لا تستخدم x دقيقة.

يمكنك زيادة عالمي متغير في كل مرة جلسة عمل مستخدم تم إنشاؤه ، تنقيص عندما دمرت.بهذه الطريقة سوف دائما تعرف كيف العديد من المستخدمين على الإنترنت في أي لحظة.

إذا كنت ترغب في مراقبة مرور الوقت ، من ناحية أخرى ، أعتقد تسجيل الدورة بداية ونهاية إلى قاعدة البيانات هو الخيار الأفضل و يتم حساب المستخدم النشاط بعد حقيقة مع استعلام بسيط.

[تنويه 1 --- جافا الحل]

إذا كل معنى المستخدم هو إعطاء الدورة, ثم هل يمكن الكتابة الخاصة بك SessionListener تنفيذ لتتبع كل دورة التي تم إنشاؤها وتدميرها.

[تنويه 2 --- كود يتم اختبارها أو المترجمة]

public class ActiveSessionsListener implements HttpSessionListener {
    public void sessionCreated(HttpSessionEvent e) {
        ServletContext ctx = e.getSession().getServletContext();
        synchronized (ctx) {
            Integer count = ctx.getAttribute("SESSION_COUNT");
            if (count == null) { count = new Integer(0); }
            ctx.setAttribute("SESSION_COUNT", new Integer(count.intValue() + 1);
        }
    }
    public void sessionDestroyed(HttpSessionEvent e) {
        ... similar for decrement ...    
    }
}

وسجل هذا في web.xml:

<listener-class>com.acme.ActiveSessionsListener</listener-class>

ويساعد هذا الأمل.

المشكلة الوحيدة مع تطبيق ويب الحل هو في كثير من الأحيان لا تعرف عندما يقوم شخص ما بتسجيل الخروج.من الواضح إذا كان لديك تسجيل الدخول / المصادقة شرط ، يمكنك التقاط عندما يكون الشخص علامات على جزء من البيانات الخاصة بك رمز الدخول, يمكنك تسجيل الدخول عندما يكون الشخص يضرب قاعدة البيانات.ولكن عليك أن تقبل أن يكون هناك على طريقة يمكن الاعتماد عليها من التقاط عندما يكون الشخص بتسجيل الخروج - كثير فقط الابتعاد عن الموقع دون أخذ "تسجيل الخروج" العمل.

أتصور أن استخدام الزناد سيكون خيارا معقولا من شأنها أن يمنعك من الحاجة إلى فوضى مع أي منطق الخلافات بين الويب و غير بيئة الويب (أو أي بيئة أخرى في هذا الشأن).ولكن هذا فقط يلتقط التغيرات على البيئة و لا تفعل أي شيء عندما حدد البيانات.هذا ، ومع ذلك ، يمكن التغلب عليها إن جميع الأوامر الخاصة بك من التطبيقات التي يتم تشغيلها من خلال الإجراءات المخزنة.

مع التطبيق على شبكة الإنترنت, مفهوم "الإنترنت" قليلا غامضة.أفضل ما يمكن القيام به حقا هو "طلب في آخر X دقيقة" أو ربما "مصادقة في آخر X دقيقة".

اختيار مجموعة من الأحداث (قدمت طلب إجراء تحديث, مصادقة, ...), و سجل لهم DB الجدول.

سجل لهم جدول في قاعدة منفصلة DB

لقد عملت مع العديد من الأنظمة التي استخدمت الطريقة الأولى قائمة ، مع القليل من التخطيط الدقيق يمكن أن يتم ذلك بطريقة أن لا يكون لها الكثير من التأثير.

كل هذا يتوقف على بالضبط متى/كيف/ما كنت تحاول أن تتبع.إذا كنت بحاجة إلى تتبع جلسات متعددة سوف نرى عادة الناس أن استخدام دورة نظام ربط حساب المستخدم ثم خلال مدة محددة من الوقت المنقضي أن الدورة consiered الميت.

إذا كنت حقا تبحث عن حاليا على الانترنت الخيار الأول الخاص بك هو أفضل.

لقد نفذت آخر تواجد النظام على موقع الويب الخاص بي.الخيار الأول الخاص بك مشابه, ولكن أنا فقط تحديث كل +-5 دقائق.يعمل على وضعي ، ولكن على نطاق أوسع المواقع قد تتطلب شيئا قليلا اضافية.

<?php
function updateLastSeen($user_ref, $session_id, $db) { /*Parameters: The user's primary key, the user's session id, the connection to the database*/
  $timestamp = date('Y-m-d H:i:s');
  if ($session_id !== '') {
    /*logged in*/
    $sql_check = "SELECT user_id FROM user_last_seen WHERE user_id = ?";
    $stmt_check = $db->prepare($sql_check);
    $stmt_check->bind_param('s', $user_ref);
    $result_check = $stmt_check->execute();
    $stmt_result_check = $stmt_check->get_result();
    if ($stmt_result_check->num_rows > 0) { /*If the user's last seen was previously recorded, update his record*/
      $sql = "UPDATE user_last_seen SET last_seen = ? WHERE user_id = ?"; 
    } else { /*Otherwise, insert a record for him*/
      $sql = "INSERT INTO user_last_seen (last_seen, user_id) VALUES (?,?)";
    }
    $stmt = $db->prepare($sql);
    $stmt->bind_param('ss', $timestamp, $user_ref);
    $result = $stmt->execute();
  }
}
if( !isset($_SESSION['lastSeen']) ){ /*User logs into the website or lands on the current page, create a lastSeen variable*/
  $_SESSION['lastSeen'] = time();
  updateLastSeen($user_ref, $session_id, $db);
} else {
  $last_seen_time_difference = (time() - $_SESSION['lastSeen']) / 60;
  if ($last_seen_time_difference > 5) { //if the difference between now and the lastSeen is 5 minutes or more, record his last seen.
    updateLastSeen($user_ref, $session_id, $db);   
    $_SESSION['lastSeen'] = time(); /*after updating the database, reset the lastSeen time to now.*/
  }/* else {
    //do nothing. Don't update database if lastSeen is less than 5 minutes ago. This prevents unnecessary database hits.
  }*/
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top