İstediğin hesaplama anlık işlemler için olsaydı burada yolun node.js veya socket.io'ya doğru ayrılırdı (bence bu senaryoda da uygun) ama uzun zaman dilimlerini kontrol etmek söz konusu olunca PHP ve Cron Job da ihtiyacını fazlasıyla görecektir.

Öncei iki tarihi kıyaslarsın (gist) sonra y (yıl), d (gün), h (saat) değişkenlerini karşılaştırırsın. Aşağıdaki örnekten yola çıkıp hesap yaparsın, sonrasında cron ile saatlik veya hassasiyetin ne kadar ise o kadar aralıklarla (interval diyelim) çalıştırıp kontrol edersin.

Örnek:


function dateCompare($current, $expire, $diff = false)
{
$expire_date = new DateTime($expire);
$current_date = new DateTime($current);
$interval = $expire_date->diff($current_date);

// pure date diff result
if ($diff) {
return $interval;
}

// for past time conditions
foreach ($interval as $key => $value) {
if ($key == 'invert') {
return $value < 1 ? false : true;
}
}

return false;
}

$start_date = '2019-01-01 11:12:12';
$now = date('Y-m-d H:i:s', time());
$date_diff = dateCompare($start_date, $now, true);

print_r($date_diff);

if ($date_diff->y > 0) {
echo 'bir yıldan fazla zaman geçmiş';
} else if ($date_diff->d == 0) {
echo $date_diff->h . ' saat '+$date_diff->m+' dakika geçmiş';
} else if ($date_diff->d >= 1) {
echo $date_diff->d . ' gün geçmiş';
}


Uyarı: Yıl nereden çıktı? Yılı karşılaştırmadan direkt girişirsen 2 yıl 2 saat önce ile 12 yıl 2 saat önce için aynı sonuca ulaşırsın. Yılı da hesaba katıp sağlamasını yapıyoruz.

Bu datayı kullanıcı giriş veya benzeri bir aksiyonuyla beraber veritabanında tuttuğunu varsayıyorum. O zaman cron o datayı kotrol etmeli ve gereksiz olanları default bir değere eşitleyip veya where sorgusu için başka bir senaryo düşünüp performansı da kabetmezsin.

Uç bir senaryoda 1 milyar datayı cron ile her dakika başı kontrol ettiğini varsyarsam, tarihi geçmiş olan 500 milyon datayı es geçmen bile döngü için daha rahatlatıcı olacak. Ancak yine de data sayısı bellek ve zaman aşımına neden olabilir. Bunu ayrı bir tablo açıp angi aralıkları taradığını vs kaydedip sonraki dakika taramadıklarını tararsın.


Ekleme:

emreyvz adlı üyeden alıntı

Ajax ile belli bir sayfaya 10 saniyede bir setTimeOut ile Post atılabilir. Bu şekilde tarayıcı açık oldukça Post edilen sayfada $_SESSION["sure"] 10 artırılır. Gerekli süre kontrollerini de Post edilen sayfada yapabilirsiniz.

Bu yöntem isteğinizi karşılar ancak güvenlik açığı ortaya çıkarır. Ajax Kodlarını şifrelemek veya farklı bir şekilde sistem dışı POST'u engelleyebilirsiniz.


Bu dediğin bildiğin spagetti oluyor, 1 milyon sekmede açık sayfadan her 10 saniye başı istek aldığını düşünürsek bu durum i/o artışı, performans düşüşü ve sonrasında inode limiti aşımına neden olur. Inode ne alaka? PHP'de Session dediğimiz şey her seferinde dosyaya ve yazar okur (bu yüzden orta ve büyük ölçekli sistemlerde kullanılması uygun değil), dolayısıyla suspend yeme, gereksiz trafik tüketimi gibi sorunlar söz konusu olur.

Yine Ekleme: CSRF (bahsettiğin harici kaynaktan XHR isteğini önleme) her zaman efektif bir çözüm değil, kafasına takan geçer yine bot kasabilir ve sonuç olarak sistem yine gereksiz yük altına girebilir.