cache'owanie zapytań sql

0

Cześć, problem jak w temacie. Napisałam sobie klasę dziedziczącą po pdo (bo już kilka rzeczy zmieniłam) i teraz chciałabym mieć możliwość cache'owania zapytań sql. Pomyślałam tak, że każde cache'owane zapytanie będzie zamieniane na nazwę pliku i tu się pojawia problem. Poleciłby mi ktoś jakiś algorytm zamieniający dowolny łańcuch znaków na poprawną i unikalną nazwę pliku? Z góry dziękuję za odpowiedzi.

0

Base64 albo Base32 albo Base16, tyle że nazwy plików byłyby sporo dłuższe od długości zapytań, przez co pewnie system by je odrzucił.

Inne rozwiązanie to użycie hasza np MD5 + Base16 czy SHA1 + Base32. Dla każdego zapytania zrobiłabyś dwa pliki:

  • <hasz>.zapytanie - zawierający zapytanie
  • <hasz>.wynik - zawierający wynik zapytania

Raz na tysiąc lat dostałabyś kolizję, a więc aby się zabezpieczyć przed tym, musiałabyś przed otwarciem pliku <hasz>.wynik sprawdzić czy w pliku <hasz>.zapytanie masz to zapytanie, którego szukasz.

0

Albo zapisać np. w JSON albo zaserializować i wrzucić wszystko w jeden plik. I wcale nie trzeba używać base64 przed haszowaniem SHA1 przecież, chyba że chcesz zmniejszyć prawdopodobieństwo kolizji.

0

MD5('SELECT * FROM foo... # zapytanie SQL generalnie tutaj nalezy wstawic') . '.txt';

0

Myślę, że md5 się doskonale sprawdzi. Mam jeszcze tylko jedno pytanie, wiecie może w jaki sposób utworzyć obiekt PDOStatement na podstawie danych z pliku? Tzn, chodzi mi o to, żeby po wywołaniu w kodzie czegoś takiego

 
$stmt = $pdo->('SELECT blablabla...', 3600); //gdzie 3600 to czas przez jaki dane nie będą pobierane z bazy tylko z pliku

w przypadku, kiedy nie upłynie określony czas, a więc dane będą ładowane z pliku utworzyć obiekt PDOStatement (to co jest pod zmienną $stmt) na podstawie tych danych. Teraz jak pomożecie, to chyba postawię piwo :>

0

Tak sie raczej nie da.

Lecz pobierajac dane z bazy danych, zapisujesz je w tablicy PHP, prawda? Np.:

$query = mysql_query($sql);
while ($row = mysql_fetch_assoc($query))
{
	$result[] = $row;
}
// oczywiscie to tylko przyklad, nie korzystam tutaj z pdo ;)

Mozesz przerobic aplikacje na cos takiego:

$md5 = md5($sql) . '.php';
if (file_exists('cache/' . $md5))
{
	$result = unserialize(file_get_contents('cache/' . $md5));
}
else
{
	$query = mysql_query($sql);
	$result = array();

	while ($row = mysql_fetch_assoc($query))
	{
		$result[] = $row;
	}

	file_put_contents('cache/' . md5($sql) . '.php', serialize($result));
}

Oczywiscie Ty korzystasz z PDO, wiec musisz sobie ten kod przerobic wedlug wlasnego uznania. Generalnie, chodzi o idee.

1 użytkowników online, w tym zalogowanych: 0, gości: 1