Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Struktura Cachowania
Forum PHP.pl > Forum > PHP
Avatarus
Witam
Dużo się naczytałem ostatnio o cachowaniu itp.
Chciałbym to napisać SAM, tylko mam problem z jedną kwestią (w sumie najważniejszą smile.gif )
Jak zrobić sprawdzanie czy dane w pliku cache są nowsze od tych w bazie?

Prosiłbym o nie pisanie postów stylu " głupi porywa się z motyką na słońce" itp ...Jeśli wskażecie mi metody jak to zrobić to sobie poradzę.
Po prostu logicznie nie potrafię sobie tego efektywnie wyobrazić. A może dlatego że od 5 jestem na nogach...z tego głównie na uczelni (kocham SESJE smile.gif )

Pozdrawiam
pawkow
po każdej zmianie w bazie po prostu cachuj konkretną stronę jeszcze raz smile.gif wtedy cache będzie zawsze aktualny smile.gif
GrayHat
Myślę, że najlepiej zrozumiesz zasadę działania cache na bazie jakiegoś przejrzystego kodu. Poczytaj o Zend_Cache:
http://framework.zend.com/manual/en/zend.cache.html

Pozdrawiam winksmiley.jpg
nospor
Cytat
Jak zrobić sprawdzanie czy dane w pliku cache są nowsze od tych w bazie
No raczej cache nigdy nie bedzie swiezszy od bazy winksmiley.jpg Przeciez cache powstaje z tego co w bazie. To baza moze byc swieższa od cache.
pawkow podał ci jedno rozwiązanie. Ja stosuje inne. Sprawdzam czy jest cache. Jak jest to sprawdzam czy jest wazny czasowo (ustawiam mu np. godzine). Jak nie jest wazny to pobieram dane. Jak jest wazny to biore z cache. Zapytasz: a co jesli w ciagu godziny sie dane zmienily? No coz, jak sie dane zmieniają to czyszcze cache. Wowczas przy sprawdzaniu czy cache jest, widze ze go nie ma, wiec pobieram dane z bazy i wkladam do cache. Proste.
Avatarus
Cytat(nospor @ 2.02.2008, 23:03:40 ) *
No raczej cache nigdy nie bedzie swiezszy od bazy winksmiley.jpg Przeciez cache powstaje z tego co w bazie. To baza moze byc swieższa od cache.


no tak wiem, źle się wyraziłem.

Żeby dobrze to zrozumieć, zapytam inaczej biggrin.gif

Mam phpbb i tam jest dział z forum ktory odpowiada za newsy na stronie (po prostu tematy z tego działu są wyświetlane jako newsy na stronie).
Jeśli chcę wprowadzić cachowanie tych newsów na stronie to muszę postępować tak?:

1. po dodaniu jakiegoś posta na phpbb dodać skrypt który sprawdza czy to nie chodzi o to forum z newsami, jeśli tak to twórz Cache. No i tutaj mam dodać zapytanie SQL które odpowiada za wyświetlenie kilku ostatnich tematów + ich treści. No i to zapisać do pliku cache tak? Z użyciem Seralizacji.
2. Gdy wejdziemy na stronę. To skrypt newsa sprawdza czy istnieje plik cache dla newsów, jeśli nie to wykonuje zapytanie SQL żeby te dane pobrać.

Dobrze to wszystko rozumie?
W takim wypadku nie trzeba korzystać z zewnętrznych kodów typu zend itp..
Poprawcie mnie jeśli się mylę. Naprawdę zależy mi na tym cachu smile.gif
nospor
Cytat
1. po dodaniu jakiegoś posta na phpbb dodać skrypt który sprawdza czy to nie chodzi o to forum z newsami, jeśli tak to twórz Cache. No i tutaj mam dodać zapytanie SQL które odpowiada za wyświetlenie kilku ostatnich tematów + ich treści. No i to zapisać do pliku cache tak? Z użyciem Seralizacji.
Jesli bys jechal wg. mojej ideologii to nie. Jesli dodasz posta, to masz czyscic cache a nie go tworzyc. A cache tworzysz w momencie odczytywania newsow na stronie (jesli go nie ma oczywiscie winksmiley.jpg ).

Cytat
W takim wypadku nie trzeba korzystać z zewnętrznych kodów typu zend itp..
W kazdej sytuacji mozesz korzystac lub nie z zewnetrznych libow. Wszystko zalezy od Ciebie jak ci bedzie wygodniej.
Avatarus
no racja, czasem faktycznie mózg uśmierca szare komórki skoro nie wpadłem na to wcześnie biggrin.gif

Co do bibliotek to raczej staram się z nich nie korzystać jeśli są to duże biblioteki tak jak te Zend Framework. Skoro mogę napisać coś (z wasza pomocą oczywiście) co waży dużo mniej to chyba to lepsze dla serwisu.

Znalazłem dość fajny i kompaktowy skrypt cache.
Czy użylibyście takiego skryptu?

Plik sterownik.php
  1. <?php
  2.  
  3.  define('CACHE_DIR', './sql_cache/');
  4.  
  5.  class sql{
  6. var $connection;
  7. var $result;
  8. var $rows;
  9.  
  10. var $queries = 0;
  11.  
  12. var $cache_state =0;
  13. var $cache_file;
  14. var $cache_buffer;
  15. var $cache_ptr;
  16.  
  17. function sql_connect($host, $user, $pass, $db){
  18.  $this -> connection = mysql_connect($host, $user, $pass);
  19. }
  20.  
  21. function sql_close(){
  22.  mysql_close($this -> connection);
  23. }
  24. function sql_cache($handle = 0){
  25.  if(is_string($handle)){
  26. if(file_exists(CACHE_DIR.'xxx_'.$handle.'.666')){
  27.  $this -> cache_state  = 1;
  28.  $this -> cache_ptr = 0;
  29.  $this -> cache_buffer = unserialize(file_get_contents(CACHE_DIR.'xxx_'.$handle.'.666'));
  30. }else{
  31.  $this -> cache_state = 2;
  32.  $this -> cache_buffer = array();
  33.  $this -> cache_file = CACHE_DIR.'xxx_'.$handle.'.666';
  34. }
  35.  }else{
  36. if($this -> cache_state == 2){
  37.  file_put_contents($this -> cache_file, serialize($this -> cache_buffer));
  38. }
  39. $this -> cache_state = 0;
  40.  }
  41. }
  42. function sql_cache_remove($handle){
  43.  if(file_exists(CACHE_DIR.'xxx_'.$handle.'.666')){
  44. unlink(CACHE_DIR.'xxx_'.$handle.'.666');
  45.  }
  46. }
  47. function sql_query($query){
  48.  if($this -> cache_state != 1){
  49. $this -> result = mysql_query($query);
  50. $this -> queries++;
  51.  
  52. if(mysql_errno() != 0){
  53.  die('Error: '.mysql_error().'<br/>');
  54. }
  55. return 1;
  56.  }
  57. }
  58. function sql_fetch_array(){
  59.  if($this -> cache_state == 1){
  60. if(!isset($this -> cache_buffer[$this -> cache_ptr])){
  61.  return 0;
  62. }
  63. $this -> rows = $this -> cache_buffer[$this -> cache_ptr];
  64. $this -> cache_ptr++;
  65. return 1;
  66.  }else{
  67. if($this -> rows = mysql_fetch_assoc($this -> result)){
  68.  if($this -> cache_state == 2){
  69. // Dodaj do cache
  70. $this -> cache_buffer[] = $this -> rows;
  71.  }
  72.  return 1;
  73. }
  74.  }
  75.  return 0;
  76. }
  77.  
  78. function sql_fetch_row(){
  79.  if($this -> cache_state == 1){
  80. // czy koniec bufora?
  81. if(!isset($this -> cache_buffer[$this -> cache_ptr])){
  82.  return 0;
  83. }
  84. // odczytaj z bufora
  85. $this -> rows = $this -> cache_buffer[$this -> cache_ptr];
  86. $this -> cache_ptr++;
  87. return 1;
  88.  }else{
  89. if($this -> rows = mysql_fetch_row($this -> result)){
  90.  if($this -> cache_state == 2){
  91. // Jeśli tworzymy cache, musimy rekord dodatkowo zapisac w buforze
  92. $this -> cache_buffer[] = $this -> rows;
  93.  }
  94.  return 1;
  95. }
  96.  }
  97.  return 0;
  98. }
  99.  
  100.  } // koniec klasy
  101. ?>


Plik który używa cache.
  1. <?php
  2.  
  3.  require('./sterownik.php');
  4.  
  5.  $sql = new sql;
  6.  
  7.  $sql -> sql_connect('localhost', 'root', '', 'test');
  8.  
  9.  $sql -> sql_cache('uchwyt');
  10.  $sql -> sql_query('SELECT * FROM phpbb_topics');
  11.  
  12.  while($sql -> sql_fetch_row()){
  13. echo $sql -> rows[0].' - '.$sql -> rows[1].'<br/>';
  14.  }
  15.  $sql -> sql_cache();
  16.  
  17.  $sql -> sql_close();
  18. ?>


no dobra cache już działa i sprawuje się bardzo dobrze. Mam jednak pytanie czy powyższy kod da się jakoś "dopieścić"
Gdzieś czytałem o jakimś PHP hypercacher czy cóś. Tam podobno wykorzystuje się kompresje i bufory. Czy tutaj da się to zastosować?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.