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