javascript - यदि उपयोगकर्ता ऑनलाइन है, तो यह निर्धारित करने का सबसे आसान तरीका क्या है?(PHP / MySQL)




offline (9)

तालिका में समय-क्षेत्र संग्रहीत करें, और यह देखने के लिए कि उपयोगकर्ता पृष्ठ देखने के उपयोगकर्ता के स्थानीय समय की तुलना में स्थानीय समय की गणना में इसका उपयोग करें।

संपादित करें:

बेहतर अभी तक, सर्वर समय के रूप में सभी समय की दुकान, और केवल सर्वर समय के सापेक्ष सभी गणना आधार।

क्या कोई तरीका है जिससे मैं यह पता लगा सकूँ कि उपयोगकर्ता ऑनलाइन है या नहीं?

यानी: लॉग ऑन का उपयोग करें, मैंने $ _SESSION वैरिएबल सेट किया है, उपयोगकर्ता समय-समय पर कुकी गारबेज कलेक्टर को अपनी स्थिति को ऑफ़लाइन अपडेट करने के लिए डेटाबेस अपडेट करता है।

EDIT: मैं एक ऐसा समाधान चाहता हूं जिसमें बार या दिनांक शामिल न हों। मैं सत्र या कुछ इसी तरह की सवारी करना चाहता हूं। अगर कोई ऑनलाइन है तो यह अनुमान लगाना कि मुझे जो चाहिए वह उसके लिए पर्याप्त नहीं है।


टाइमज़ोन के बीच के अंतर का पता लगाने के साथ परेशान मत करो। यह जरूरी नहीं है।

जब भी उपयोगकर्ता किसी पृष्ठ पर पहुंचता है, तो अंतिम-अपडेट-किए गए उपयोगकर्ता तालिका के अपने रिकॉर्ड में एक फ़ील्ड अपडेट करें। फिर अंतिम 5 मिनट के भीतर सभी उपयोगकर्ताओं के लिए एक अंतिम-अद्यतन-समय के लिए एक क्वेरी करें। इससे अधिक कुछ भी, और उन्हें "ऑफ़लाइन" माना जाता है।

यदि आप MySQL में Now () फ़ंक्शन के माध्यम से अपने सर्वर-टाइम का उपयोग करते हैं, तो आप टाइमज़ोन के बीच अंतरों की गणना करेंगे।

यह ट्रैकिंग का मानक तरीका है कि कितने उपयोगकर्ता वर्तमान में ऑनलाइन हैं (मतलब, अंतिम दो मिनट के भीतर सक्रिय)।

लगातार अपडेट किया गया

यदि आप जानना चाहते हैं कि वे तब भी सक्रिय हैं जब वे पृष्ठ से पृष्ठ पर नहीं कूद रहे हैं, तो अपने सर्वर को हर 60 सेकंड में पिंग करने के लिए थोड़ी सी जावास्क्रिप्ट शामिल करें या आपको यह बताने के लिए कि वे अभी भी जीवित हैं। यह मेरे मूल सुझाव की तरह ही काम करेगा, लेकिन यह आपके रिकॉर्ड्स को अपडेट करने की आवश्यकता के बिना उन्हें हर पांच मिनट में कम से कम एक बार अपनी साइट ब्राउज़ करने की आवश्यकता होगी।

var stillAlive = setInterval(function () {
    /* XHR back to server
       Example uses jQuery */
    $.get("stillAlive.php");
}, 60000);

परिभाषा (असंभव के बाद) आप जो पूछ रहे हैं, वह असंभव है। HTTP एक कनेक्शन रहित प्रोटोकॉल है, इसलिए जैसे ही किसी उपयोगकर्ता ने एक पृष्ठ मारा है और सभी सामग्री सर्वर से उपयोगकर्ता के ब्राउज़र पर वापस आती है, दोनों के बीच कोई संबंध नहीं है। आपकी वेबसाइट पर किसी दूसरे से कम समय के लिए कोई "ऑनलाइन" है।

एक चीज जो आप कर सकते हैं वह यह है कि आपके वेब पेज पर जावास्क्रिप्ट है एजेएक्स अनुरोधों को नियमित रूप से अपने सर्वर पर वापस करें जिसमें जानकारी की पहचान करना शामिल है, और उपयोगकर्ता द्वारा पेज छोड़ने पर एक अलग AJAX अनुरोध, जिसमें window.onbeforeunload का उपयोग किया गया है।


यहाँ दो मिनट के बीच के अंतर को मिनटों में कैसे प्राप्त किया जा सकता है, इस पर एक तरीका है, फिर अंतर की जाँच करें और ऑनलाइन / ऑफ़लाइन स्थिति सेट करें।

$query = 'SELECT * FROM Users';
$result = mysqli_query($mysqli, $query);

foreach($result as $user){
    // date from the database
    $dbLastActivity = date("d-m-Y h:i:s a", strtotime($user['lastOnline']));
    // date now
    $now = date("d-m-Y h:i:s a", $date);

    // calculate the difference
    $difference = strtotime($now) - strtotime($dbLastActivity);
    $difference_in_minutes = $difference / 60;

    // check if difference is greater than five minutes
    if($difference_in_minutes < 5){
        // set online status
        $updateStatus = 'UPDATE Users SET Status="online" WHERE lastOnline="'.$user['lastOnline'].'"';
    } else {
        // set offline status
        $updateStatus = 'UPDATE Users SET Status="offline" WHERE lastOnline="'.$user['lastOnline'].'"';
    }

    // check if mysqli query was successful
    if (!$mysqli->query($updateStatus)){
        printf("Error Message %s\n", $mysqli->error);
    }
} 

आप onunload टैग का उपयोग भी कर सकते हैं ... शरीर पर अधिक जानकारी यहां ( https://www.w3schools.com/jsref/event_onunload.asp )

इस तरह आपको उपयोगकर्ता को ऑफ़लाइन होने के लिए 4 -5 मिनट इंतजार नहीं करना पड़ेगा।

लेकिन आप अभी भी ajax अद्यतन विधि का उपयोग करना चाहिए उपयोगकर्ता के ब्राउज़र दुर्घटनाओं ...


एक बात मैं सलाह दूंगा कि इस तरह की जानकारियों को मेमोरी में स्टोर करना है, उदाहरण के लिए मेमस्कैल्ड या माईस्कल हीप या रेडिस। क्योंकि अन्यथा डेटाबेस बहुत हिट हो जाएगा।


इसके लिए मैंने जो समाधान लागू किया है, वह एक प्रमाणित उपयोगकर्ता द्वारा हर पृष्ठ लोड पर, "user_ {userid} isonline" => सच के रूप में एक यादगार संस्करण सेट / रीसेट करें और इसे 5 मिनट में समाप्त करें। तब जांचें कि उपयोगकर्ता की जानकारी का उपयोग करने पर var कैश में है या नहीं। आपके उपयोगकर्ता आधार के आकार के आधार पर, यदि आप सभी की सूची ऑनलाइन प्राप्त करना चाहते हैं, तो आप अपने सभी उपयोगकर्ताओं के लिए "user {userid} _isonline" कुंजियों की एक सरणी के साथ एक मेमकेक getmulti कॉल का उपयोग कर सकते हैं

बेशक, यह वास्तव में इस बात पर निर्भर करता है कि उपयोगकर्ता आपकी साइट पर कितनी बार पृष्ठ बदलेगा ... ऑनलाइन उपयोगकर्ताओं का अधिक सटीक प्रतिनिधित्व प्राप्त करने के लिए, आप एक छोटे अंतराल पर चलने वाले अपने पृष्ठ पर एक अजाक्स xmlhttprequest कॉल लागू कर सकते हैं (30 सेकंड) ऐसा) जो मेमेकैस वर्जन को रीसेट करता है, और कम समय में (संभव ब्राउजर के लिए खाते में 1 मिनट) मेकैच वैर एक्सपायर होता है। यह पूरी तरह से सही नहीं है, लेकिन चूंकि http का सर्वर से लगातार संबंध नहीं है, आप जो कर सकते हैं उस पर बहुत सीमित हैं।

यदि आपको ऑनलाइन कौन है, के दूसरे प्रतिनिधित्व तक की आवश्यकता होती है, तो हो सकता है कि आपके पेज में एक फ्लैश ऐप लोड हो जो एक जैबर सर्वर से कनेक्ट हो, तो बस यह जांचें कि क्या उस विशेष उपयोगकर्ता को सर्वर पर लॉग इन किया गया है।


मेरा तरीका सबसे अच्छा तरीका नहीं हो सकता है लेकिन चूंकि मेरी साइट और यूजरबेस सब mysql DB में है, जब कोई उपयोगकर्ता मेरी साइट पर लॉग इन करता है,

  1. मैं उपयोगकर्ता तालिका को यह कहने के लिए अद्यतन करता हूं कि वे ऑनलाइन हैं
  2. उन्हें ऑनलाइन तालिका में सम्मिलित करें
  3. फिर मैंने वर्तमान समय के साथ एक सत्र निर्धारित किया

फिर हर पेज लोड पर मैं ऑनलाइन समय सत्र के लिए जाँच करता हूँ, अगर यह मौजूद है, तो मैं यह देखने के लिए जाँचता हूँ कि यह कितना पुराना है, अगर यह कम है तो 5 मिनट पुराना है, मैं कुछ नहीं करता, अगर यह बड़ा है तो 5 मिनट है, तो मैं अपडेट करता हूँ वर्तमान समय के साथ सत्र का समय फिर से और समय के साथ ऑनलाइन उपयोगकर्ता तालिका भी अपडेट करें

फिर मेरे पास एक क्रॉन जॉब है जो हर 10 - 15 मिनट चलती है जो ऑनलाइन टेबल से किसी भी उपयोग को हटा देती है और उपयोगकर्ता तालिका को ऑफ़लाइन के रूप में चिह्नित करती है यदि ऑनलाइन समय एक्स राशि मिनट के भीतर अपडेट किया गया है।


किसी ऑब्जेक्ट को Cloning करना हमेशा जेएस में चिंता का विषय था, लेकिन यह सब ईएस 6 से पहले था, मैं नीचे जावास्क्रिप्ट में ऑब्जेक्ट की प्रतिलिपि बनाने के विभिन्न तरीकों की सूची देता हूं, कल्पना करें कि आपके पास नीचे ऑब्जेक्ट है और इसकी गहरी प्रतिलिपि बनाना चाहेंगे:

var obj = {a:1, b:2, c:3, d:4};

उत्पत्ति को बदलने के बिना, इस ऑब्जेक्ट को कॉपी करने के कुछ तरीके हैं:

1) ES5 +, आपके लिए प्रतिलिपि करने के लिए एक साधारण फ़ंक्शन का उपयोग करना:

function deepCopyObj(obj) {
    if (null == obj || "object" != typeof obj) return obj;
    if (obj instanceof Date) {
        var copy = new Date();
        copy.setTime(obj.getTime());
        return copy;
    }
    if (obj instanceof Array) {
        var copy = [];
        for (var i = 0, len = obj.length; i < len; i++) {
            copy[i] = cloneSO(obj[i]);
        }
        return copy;
    }
    if (obj instanceof Object) {
        var copy = {};
        for (var attr in obj) {
            if (obj.hasOwnProperty(attr)) copy[attr] = cloneSO(obj[attr]);
        }
        return copy;
    }
    throw new Error("Unable to copy obj this object.");
}

2) ES5 +, JSON.parse और JSON.stringify का उपयोग कर।

var  deepCopyObj = JSON.parse(JSON.stringify(obj));

3) कोणीय जेएस:

var  deepCopyObj = angular.copy(obj);

4) jQuery:

var deepCopyObj = jQuery.extend(true, {}, obj);

5) अंडरस्कोर जेएस और लोडैश:

var deepCopyObj = _.cloneDeep(obj); //latest version UndescoreJs makes shallow copy

आशा है कि ये मदद ...





php javascript mysql offline