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
PHP - XP Sistemi Hk.
11
●171
- 07-10-2021, 21:18:40Tam olarak nasıl yapabilirim hocam, dediğinizi anlamadım. Site logininde bir session oluşturmamı mı kasdettiniz?bybrown adlı üyeden alıntı: mesajı görüntüle
- 07-10-2021, 21:19:26Hocam hoş bir özellikmiş, çözüme kavuşturunca buraya yazabilirseniz nasıl çözüm ürettiğinizi sevinirim
- 07-10-2021, 21:20:17her 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:11Teşekkürler, tabii konu üzerinden aktarırım.gurbuzemre 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)otzidemajour adlı üyeden alıntı: mesajı görüntüle
Teşekkürler. - 07-10-2021, 21:45:51login 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:10anladım. 20-30 user problem değilmiş, bol bol mysql query'si kullanabilirsiniz.AndMex adlı üyeden alıntı: mesajı görüntüle
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:29otzidemajour adlı üyeden alıntı: mesajı görüntüle
İ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
sonra ufak bir IF