24 saat boyunca PHP MySql Veri Saklama

5 Cevap php

Benim site için bir Toplisteni bina ve yerine ve isabet arasında kayıt ve veritabanını ben "son 24 saat içinde" ve hit dışarı kaydetmek istiyorum her 24 saatte boşaltılması ediyorum, bu şekilde toplist hep meşgul hayır bakacağız Zaman ne olursa olsun hala acurately sıralaması siteleri yaparken, ona bak.

Böylece temelde oturum veritabanına bir kayıt eklemek gerekecek bir 'in' hit (örneğin) ve zaman sıralaması siteleri kaldır etrafında 24 saat sonra veya sadece düşünmüyoruz.

Ben bunu en verimli şekilde bilmek istiyorum, ben bazı fikirler var ama hepsi gerçekten ağır kaynak gibi görünüyor. Sana ulaşmak için çalışıyorum anlamak umuyoruz :) Herhangi bir yardım mutluluk duyacağız.

5 Cevap

Mutlaka "eski" verileri her zaman silmek zorunda değilsiniz. Ayrıca, verileri sorgularken son 24 saat içinde kayıt ayarlanır verileri sınırlayabilir.

WHERE
  site='xyz'
  AND hit_datetime > Now()-Interval 24 hour

bkz http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

Ben basit bir 24 saat daha eski verileri silmek istiyorsunuz

DELETE...WHERE hit_time < now() - interval 24 hour

Diğer soru - onu aramak için zaman? Tradeoff performans ve bayat veriler arasındadır. Daha sık onu aramak, daha az "bayat" veri olacak, ama sunucu yük artacak.

Ben en çok sizin ihtiyaçlarınıza uygun bir seçim, çeşitli yaklaşımlar bkz:

  • Her senaryonun başlangıcında diyoruz. Bu komut isabet verilerle bir şeyler yapacak sadece çağırarak optmized edilebilir. Bu şekilde her komut dosyası her zaman "doğru" veri ile çalışacaktır. Ancak bu azami yük olacak.
  • Bir cron işi planlamak ve her 1h/2h/24h/etc kez diyoruz. Bu yol "bayat" bir veri biraz orada olacak, ama havai minimuma düşecektir.
  • PHP oturumları ile yapar gibi yap - her komut Başlangıçta (x yapılandırılabilir) çalıştırmak olma şansı o balta% verir. Yani, 0'dan 100'e kadar bir değer alır ve x küçükse, DELETE yürütmek.

Ayrıca diğer bazı düzenleri icat - örneğin, kullanıcı oturum başına bir kez çalıştırın; yürütme zamanı eşit, diyelim ki 7 DIVISABLE yalnızca veya koşmak; ya da başka bir şey. Eğer doğruluğu için performansı kapalı ticaret iki şekilde de.

24 saatten daha eski kayıtları siler saklı bir yordam yazın. Sonra trigger her INSERT deyimi üzerinde çalışır ve SP çağırır olduğunu yazmak.

Her bir "hit" ile damgası depolamak ve sonra gibi bir sorgu diyebiliriz

 $time = time()-86400;
 mysql_query("DELETE FROM xxx WHERE timestamp < $time");

Eğer hala daha sonra hit gerekiyorsa veya SELECT deyimi içinde aynı şey, vb bağlıdır olabilir

Zaman kısıtlaması gerçekten zor (örn. para gevşek veya veri 24 saatten daha uzun db tutulur ise kullanıcıların gerçekten sinir bozucu olacak), ben kullanımını PHP'nin register_shutdown_function kullanmak istiyorsanız değilse gibi bu:


function cleanup() {
  // open db-connection etc.
  $query = 'DELETE FROM <yourtable> ' .
               'WHERE UNIX_TIMESTAMP(<timstampfield>) < ' . (time() - 86400);
  mysql_query($query);
  // close connection
}

register_shutdown_function('cleanup');

Yukarıdaki kod <timestampfield> MYSQL-tarih-veri türleri (zaman damgası, tarih, DATETIME) biri olduğunu varsayar.