• 07-10-2021, 21:14:42
    #1
    Merhaba, yapmak istediğim; ajax ile arkaplanda kullanıcı sitede durduğu her süre boyunca 1 xp kazanmasını sağlamak. Bunu ajax,php ve js ile yapabiliyorum. Ancak şöyle bir sorun var ki, kullanıcı 10 tane sekme açtığında 10 katı xp kazanıyor her sekmede aldığı için. Bunu nasıl engelleyebilirim?

    Şimdiden teşekkürler
  • 07-10-2021, 21:17:24
    #2
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Girenlere bir oturum ID'si tanımlayın. Aktif ID'ye sahip kullanıcıların yeni sekme açtığında yeni ID üretmesini engelleyin.
  • 07-10-2021, 21:18:40
    #3
    bybrown adlı üyeden alıntı: mesajı görüntüle
    Girenlere bir oturum ID'si tanımlayın. Aktif ID'ye sahip kullanıcıların yeni sekme açtığında yeni ID üretmesini engelleyin.
    Tam olarak nasıl yapabilirim hocam, dediğinizi anlamadım. Site logininde bir session oluşturmamı mı kasdettiniz?
  • 07-10-2021, 21:19:26
    #4
    Hocam hoş bir özellikmiş, çözüme kavuşturunca buraya yazabilirseniz nasıl çözüm ürettiğinizi sevinirim
  • 07-10-2021, 21:20:17
    #5
    her süre dediğiniz kaç dakika mesela? bu süre aralığına göre farklı çözümler üretilebilir. kullanıcı miktarı nedir? sunucu kaliteniz nedir? Redis DB vs kullanıyor musunuz? Bunları da söylerseniz fikir yürütmeye calısayım.
  • 07-10-2021, 21:28:11
    #6
    gurbuzemre adlı üyeden alıntı: mesajı görüntüle
    Hocam hoş bir özellikmiş, çözüme kavuşturunca buraya yazabilirseniz nasıl çözüm ürettiğinizi sevinirim
    Teşekkürler, tabii konu üzerinden aktarırım.


    otzidemajour adlı üyeden alıntı: mesajı görüntüle
    her süre dediğiniz kaç dakika mesela? bu süre aralığına göre farklı çözümler üretilebilir. kullanıcı miktarı nedir? sunucu kaliteniz nedir? Redis DB vs kullanıyor musunuz? Bunları da söylerseniz fikir yürütmeye calısayım.
    Sitede durduğu her dakikada 1 xp almasını istiyorum ancak sistemi zorlayacak gibi olursa 5 dakikada 5 xp verebiliriz. Kullanıcı miktarı; günlük 20,30 aktif işlem sağlayan ve sitede 1 saat ve üzeri kalan kullanıcı var. Ufak bir projem zaten bunu yapmak istediğim şey. mysql kullanıyorum redis db kullanmıyorum. Sunucu kalitem yüksek, Natro kurumsal plandaki 600 TL lik hosting paketi. (Özel paket)
    Teşekkürler.
  • 07-10-2021, 21:45:51
    #7
    login olurken xptime adında bir session oluşturup time() tutacaksın sonrasında xp update yaptığın dosyada xptime adlı sessionu kontrol edeceksin. 60 sn den büyükse update yapacak değilse yapmayacak

    şöyleki

    //login.php  session tanımla
    $_SESSION['xptime'] = time();
    xpupdate.php  koşul ekle
    
    if(isset($_SESSION['xptime'] )){
    if($_SESSION['xptime']  < time()-60){
    ///xpupdate kod blogu
    $_SESSION['xptime'] = time(); // sonrasında xptime 'ı tekra güncelieceksin
    }
    }else{
    $_SESSION['xptime'] = time(); // yoksa yeniden yaz
    }
  • 07-10-2021, 21:54:10
    #8
    AndMex adlı üyeden alıntı: mesajı görüntüle
    Sitede durduğu her dakikada 1 xp almasını istiyorum ancak sistemi zorlayacak gibi olursa 5 dakikada 5 xp verebiliriz. Kullanıcı miktarı; günlük 20,30 aktif işlem sağlayan ve sitede 1 saat ve üzeri kalan kullanıcı var. Ufak bir projem zaten bunu yapmak istediğim şey. mysql kullanıyorum redis db kullanmıyorum. Sunucu kalitem yüksek, Natro kurumsal plandaki 600 TL lik hosting paketi. (Özel paket)
    Teşekkürler.
    anladım. 20-30 user problem değilmiş, bol bol mysql query'si kullanabilirsiniz.
    1- users tablonuza last_ping_timestamp diye sütun açın.
    2- kullanıcı online'ken her dakika başında js ajax ile sizinsiteniz.com/ping.php adresine POST istek yollayın, içinde kullanıcının id'si olsun
    3- ping.php dosyasında kullanıcının id'si ile UPDATE users SET last_ping_timestamp = $unixTime WHERE user_id = $_POST['user_id'] komutunu calıstırın
    4- sunucunuza bi tane cronjob kurun. her 60 saniyede 1 kez otomatik çalıştırsın addUserPoints.php dosyasını.
    5- bu addUserPoints.php dosyasında kullanıcıların hepsini seçip foreach döngüsü içerisinde sokacaksınız, şu anki timestamp'i alıp öncekiyle karşılaştıracaksınız.
    6- şu anki timestamp'ten, last_ping_timestamp'i (bunu nasıl yapacağınızı aşağıda anlatıyorum) çıkarırsanız kullanıcının en son online bildirimi verdiğiyle şu anki vakit arasındaki farkı görürsünüz.
    7- timestamp'i saniyeye dönüştürün
    8- eğer son 60 saniyede online ise (bence scriptin yavaş çalışma ihtimalini de göze alıp 70 falan yapın), kullanıcıya xp'sini verin 1dk için 1 xp olacak şekilde.

    Peki 2 timestamp farkını nasıl alırız saniye olarak?

    <?
    $datetime1 = new DateTime('2016-11-30 03:55:06');//db'den gelen time
    $datetime2 = new DateTime('2016-11-30 11:55:06');//şu anki time
    $interval = $datetime1->diff($datetime2);
    $intervalSeconds = $interval->format(' %s');

    bu kadar sonra ufak bir IF

    <?
    if ($intervalSeconds < 65)
    {
    $user->addXpPoints();
    }
    else
    {
    //user is offline
    //bu noktada isterseniz db'ye 'is_online' diye sütun falan ekleyip onu 0 olarak setleyerek, bir dahaki cronjob calıstığında,  online değilse hiç durduk yere çalıştırmayabilirsiniz baştaki foreach'i.
    //ama 20-30 kullanıcı hiç sorun olmaz zaten. 4-5k olunca problem edersiniz bunları.
    }
    fikir vermesi amacıyla object oriented düşünerek yaptım. bu fikri projenize evirip çevirip koyabilirsiniz. belki hatam da olmuştur
  • 07-10-2021, 21:59:29
    #9
    otzidemajour adlı üyeden alıntı: mesajı görüntüle
    anladım. 20-30 user problem değilmiş, bol bol mysql query'si kullanabilirsiniz.
    1- users tablonuza last_ping_timestamp diye sütun açın.
    2- kullanıcı online'ken her dakika başında js ajax ile sizinsiteniz.com/ping.php adresine POST istek yollayın, içinde kullanıcının id'si olsun
    3- ping.php dosyasında kullanıcının id'si ile UPDATE users SET last_ping_timestamp = $unixTime WHERE user_id = $_POST['user_id'] komutunu calıstırın
    4- sunucunuza bi tane cronjob kurun. her 60 saniyede 1 kez otomatik çalıştırsın addUserPoints.php dosyasını.
    5- bu addUserPoints.php dosyasında kullanıcıların hepsini seçip foreach döngüsü içerisinde sokacaksınız, şu anki timestamp'i alıp öncekiyle karşılaştıracaksınız.
    6- şu anki timestamp'ten, last_ping_timestamp'i (bunu nasıl yapacağınızı aşağıda anlatıyorum) çıkarırsanız kullanıcının en son online bildirimi verdiğiyle şu anki vakit arasındaki farkı görürsünüz.
    7- timestamp'i saniyeye dönüştürün
    8- eğer son 60 saniyede online ise (bence scriptin yavaş çalışma ihtimalini de göze alıp 70 falan yapın), kullanıcıya xp'sini verin 1dk için 1 xp olacak şekilde.

    Peki 2 timestamp farkını nasıl alırız saniye olarak?

    <?
    [COLOR=var(--highlight-variable)]$datetime1[/COLOR] = [COLOR=var(--highlight-keyword)]new[/COLOR] DateTime([COLOR=var(--highlight-variable)]'2016-11-30 03:55:06'[/COLOR]);
    [COLOR=var(--highlight-variable)]$datetime2[/COLOR] = [COLOR=var(--highlight-keyword)]new[/COLOR] DateTime([COLOR=var(--highlight-variable)]'2016-11-30 11:55:06'[/COLOR]);
    [COLOR=var(--highlight-variable)]$interval[/COLOR] = [COLOR=var(--highlight-variable)]$datetime1[/COLOR]->diff([COLOR=var(--highlight-variable)]$datetime2[/COLOR]);
    [COLOR=var(--highlight-variable)]$intervalSeconds = $interval[/COLOR]->format([COLOR=var(--highlight-variable)]'%s seconds'[/COLOR]);

    bu kadar sonra ufak bir IF

    <?
    if ($intervalSeconds < 65)
    {
    $user->addXpPoints();
    }
    else
    {
    //user is offline
    //bu noktada isterseniz db'ye 'is_online' diye sütun falan ekleyip onu 0 olarak setleyerek, bir dahaki cronjob calıstığında,  online değilse hiç durduk yere çalıştırmayabilirsiniz baştaki foreach'i.
    //ama 20-30 kullanıcı hiç sorun olmaz zaten. 4-5k olunca problem edersiniz bunları.
    }
    fikir vermesi amacıyla object oriented düşünerek yaptım. bu fikri projenize evirip çevirip koyabilirsiniz. belki hatam da olmuştur

    İkinize de gerçekten ne kadar teşekkür etsem az hocalarım Çok detaylı ve anlaşılır şekilde anlatmışsınız. Nasıl yapacağım aklımda oturdu ve şimdi halledeceğim. Teşekkür ediyorum tekrardan. @gurbuzemre; hocamı da tekrardan konuya davet ediyorum, kendisi üstte bilgilendirmemi istemişti.

    İyi akşamlar dilerim herkese