Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Struktura Cachowania
Avatarus
post 2.02.2008, 21:08:59
Post #1





Grupa: Zarejestrowani
Postów: 304
Pomógł: 0
Dołączył: 12.12.2006
Skąd: Pszów

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
pawkow
post 2.02.2008, 21:16:03
Post #2





Grupa: Zarejestrowani
Postów: 76
Pomógł: 7
Dołączył: 30.09.2006

Ostrzeżenie: (0%)
-----


po każdej zmianie w bazie po prostu cachuj konkretną stronę jeszcze raz smile.gif wtedy cache będzie zawsze aktualny smile.gif
Go to the top of the page
+Quote Post
GrayHat
post 2.02.2008, 22:36:52
Post #3





Grupa: Zarejestrowani
Postów: 566
Pomógł: 18
Dołączył: 23.08.2003
Skąd: Łomża

Ostrzeżenie: (0%)
-----


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


--------------------
*Note: No animals were killed durning the construction of this post.
Go to the top of the page
+Quote Post
nospor
post 2.02.2008, 23:03:40
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Avatarus
post 4.02.2008, 12:38:52
Post #5





Grupa: Zarejestrowani
Postów: 304
Pomógł: 0
Dołączył: 12.12.2006
Skąd: Pszów

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
nospor
post 4.02.2008, 12:50:50
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Avatarus
post 4.02.2008, 22:08:47
Post #7





Grupa: Zarejestrowani
Postów: 304
Pomógł: 0
Dołączył: 12.12.2006
Skąd: Pszów

Ostrzeżenie: (0%)
-----


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ć?


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 13.08.2025 - 23:02