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.
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.
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.
MD5('SELECT * FROM foo... # zapytanie SQL generalnie tutaj nalezy wstawic') . '.txt';
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 :>
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.