PHP bir ilişkisel dizi uzun bir metin kullanarak bazı Etkisi gidecekseniz?

5 Cevap php

Im PHP veritabanı sınıf yapıyor ve ben bir ilişkisel dizi querys sonucu önbelleğini yapmak istiyorsanız, benim fikrim önbellek dizinin indeksi olarak sql statment kullanmak için, onun iyi bir fikir olabilir? ya da ben sql bir md5 kullanmalıyım?

class DB{
const HOST = 'localhost'; //Your Database Host!
const USER = 'user'; //Your Database Username!
const PASSWORD = 'pass'; //Your Database Password!
const DATABASE = 'database'; //Your Database Name!

private static $Instance;
private static $cache = array();

private function __construct(){
	self::$Instance = mysql_connect(self::HOST, self::USER, self::PASSWORD) or die("Could not connect to database server<br/><b>Error:</b>".mysql_error());
	mysql_select_db(self::DATABASE) or die("Could not connect to database<br/><b>Error:</b>".mysql_error());
	return self::$Instance;
}

public static function DB(){
	if(!isset(self::$Instance)){
	  $c = __CLASS__; 
	  new $c(); 
	}
	return self::$Instance;
}

public static function QueryUnique($query){
	$query = "$query LIMIT 1";
	//$h = md5($query);
	$h = $query;
	if(isset(self::$cache[$h]))return self::$cache[$h];

	$result = mysql_query($query, self::DB());
	self::$cache[$h] = mysql_fetch_array($result);
	return self::$cache[$h];
}

}

Good Day

5 Cevap

Eğer çok uzakta uygulanması yoluyla olsun önce, o mysql does its own query caching bilmeli ve bu uygulama üzerinde birkaç önemli avantajı vardır:

  • Önbellek all PHP istekleri arasında paylaşılır.
  • Önbelleğe alınan sonuçlar otomatik olarak tablo veri değişiklikleri temizlenir.
  • Önbellek belli bir bellek boyutu ile sınırlı (nadiren kullanılan sorguları önbellek dışarı atılır)

önbelleğe alma mysql veri ancak normalleştirmek gerekir, bu ancak sql dize md5'i önbellek verileri için bir kimliği üreten bir iyi bir yol olduğunu söyledi sahip, şeyleri varsayımlar bir sürü yapar, biraz riskli olabilir Örneğin, ilk önce SQL:

'select 1+2'
'select 1 + 2'
' select 1 +2'

her biri aynı sorguda arasında herhangi biraz farklılıklar halledilir emin olmak gerekir, farklı bir sağlama verecektir.

Orada birbirinden biraz ekstra bellek kullanımından büyük bir etkisi olmamalı, ancak sorgu sonucu karşılaştırıldığında, ben bir sorun olacağını sanmıyorum.

Ilişkilendirilebilir diziler böylece sağ işaret dizesinin toplam uzunluğu çok fazla etkilenmemesi gerektiğini bulma, haritalar sıralanır. Sadece olumsuz, en dizeleri aynı metin ile başlatmak olacaktır.

Ben sorguları için just, bir MD5 hash güvenmek olmaz. Bu bir karma çarpışma meydana söyledi (olası ise) mümkün, ve tamamen farklı bir sorgu sonucunu seçmek olacaktır. Ancak uygulama için kabul edilebilir bir risk olabilir.

Şahsen, ben de tüm sorgu düzeyinde bunu yapmaz. Alınabilirlik genellikle döndürülen veri türüne bağlıdır. Eğer bu düzeyde önbelleğe ise, uygulama, önbelleğe ne tamamen agnostik olacaktı.

Bir hash (MD5, SHA1) daha az bellek alanı yemek olacaktır.

Sorgu oldukça uzun ise, ben (MD5 gibi) karma çeşit kullanarak için gitmek istiyorum:

  • muhtemelen (yani ilgili değil, herhalde) biraz daha az bellek kullanacak
  • bu dizini değiştirmek zorunda kalmadan dosya veya APC veya memcached veya ne olursa olsun gibi, önbellek diğer bazı tür olduğunu saklamak için izin verir.

Md5 ile çarpışmalar düşük riskleri göz önüne alındığında, bunu yapmak için "tehlikeli" görünmüyor.

Gördüğüm tek sorun ayıklarken önbelleğe alınmış verileri bulmak için o var_dump ya da "gerçek" debugger'ın her türlü :-( olmak, zor alabilirsiniz olduğunu