Świetna mała biblioteka służąca do zapisywania wyników zapytań z bazy do pliku TXT, dzięki temu odciążamy baze co ma kluczowe zaczenie wprzy dużysz obciążeniach serwisu.
Strona projektu: http://www.rooftopsolutions.nl/article/107
Zasada działania jest prosta przed wywołaniem zapytania sprawdzamy czy w katalogu s_cache nie ma pliku dla zapytania z takim kluczem w naszym wypadku klucz to getUsers:selectAll moze on miec dowolną wartość np zobaczUserow itd,
jeśli nie ma pliku wykonujemy zapytanie a jago wynik zapisujemy do katalogu s_cache
jeśli jest i nie jest już nie aktualny to pobieramy wynik z pliku a nie z bazy
Jak widac zasada jest prosta a daje ogromne wyniki przy optymalizacji
Użycie:
// konstrukcja silnika cache
$cache = new Sabre_Cache_Filesystem();
//tutatj funkcja np do pobrania użytkowników
function getUsers() {
global $cache;
// unikalny kod dla tego zapytania
$key = 'getUsers:selectAll';
// sprawdzić, czy dane nie są już w pamięci cache
if (!$data = $cache->fetch($key)) {
//nie istnieje wersja z pamięci podręcznej, pobieramy dane z bazy
$db = new mysqli('localhost','nazwa_usera','haslo','nazwa_tabeli');
$zapytanie = "SELECT * FROM users ORDER BY RAND() LIMIT 30";
$wynik = $db->query($zapytanie);
while($wiersz = $wynik->fetch_assoc()) { $data[] = $wiersz; }
// czas życia cahce 10 min (w sekundach)
$cache->store($key,$data,600);
}
return $data;
}
$users = getUsers();
print_r($users);
?>
Listing
//--------------KOD BIBLIOTEKI
<?php
abstract class Sabre_Cache_Abstract {
abstract function fetch($key);
abstract function store($key,$data,$ttl);
abstract function delete($key);
}
class Sabre_Cache_Filesystem extends Sabre_Cache_Abstract {
// To jest funkcja do przechowywania informacji o:
function store($key,$data,$ttl) {
// Otwarcie pliku w trybie do odczytu / zapisu
$h = fopen($this->getFileName($key),'a+');
if (!$h) throw new Exception('Nie moge zapisach cache');
flock($h,LOCK_EX); // blokada wyłączna, uwolnić, gdy plik jest zamknięty
fseek($h,0); // przejść do początku pliku
// obcina plik
ftruncate($h,0);
// Serializacja wraz z TTL (czas potrzebny na wygaśnięcie cache)
$data = serialize(array(time()+$ttl,$data));
if (fwrite($h,$data)===false) {
throw new Exception('Nie moge zapisach cache');
}
fclose($h);
}
// Funkcja pobierania danych zwraca FALSE w przypadku porażki
function fetch($key) {
$filename = $this->getFileName($key);
if (!file_exists($filename)) return false;
$h = fopen($filename,'r');
if (!$h) return false;
// pierwsza blokada
flock($h,LOCK_SH);
$data = file_get_contents($filename);
fclose($h);
$data = @unserialize($data);
if (!$data) {
//Jeśli unserialize nie powiodło się usuwamy plik
unlink($filename);
return false;
}
if (time() > $data[0]) {
// usuwamy plik z cache który jest już stary
unlink($filename);
return false;
}
return $data[1];
}
function delete( $key ) {
$filename = $this->getFileName($key);
if (file_exists($filename)) {
return unlink($filename);
} else {
return false;
}
}
private function getFileName($key) {
return 's_cache/s_cache'.md5($key);
}
}
?>
Ranga: Administrator serwisu Punktów: 0