Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> System cache
eai
post
Post #1





Grupa: Zarejestrowani
Postów: 367
Pomógł: 10
Dołączył: 20.05.2005

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


Chciałbym abyście podzielili się doświadczeniami pisania systemu cache.

Ja swój system rozwiązałem w ten sposób:
1. Podczas inicjowania klasy automatyczne skanowanie i usuwanie plikow ktorych czas wygasl.
2. Mozna tworzyc grupy i je konfigurowac(kodowanie,serializowanie,kompresja)
3. Dodawac mozna do grupy, lub trafia do grupy domyslnej
4. Usuwanie automatyczne lub manualne (calosc, grupa, kilka plikow, jeden plik)

I teraz mam dylemat jak zrobic usuwanie przy zmianie tresci. jak narazie przy robieniu jakiegos update elementu daje funkcje do usuwania pliku cache jesli istnieje. W jaki sposob zrobic ze podczas szukania czy istnieje cache sprawdzac czy zawartosc elemntu zrodlowego nie zmienila sie? Jest to mozliwe jesli sie wygeneruje element i porowna z cache ale to mija sie z celem bo cache jest po to zeby ponownie sie nie generowalo.

Druga sprawa to dane cache prywatne. Czy stosowac czy nie?
Np. user dodaje newsa do ktorego mozna dolaczyc kilka zdjec, i teraz czy generowac za pomoca tego samego systemu cache, czyli jako nazwa dac id_sesji_zdjecie1,2,3 itd.. czy robic base64 i trzymac obrazek w zmiennej sesyjnej a potem go odczytac.

Jak narazie moj system sprawuje sie dobrze.
Np 1 pobranie z mysql 40 000 rekordow trwa 4,2s a kolejne dzieki systemu cache trwa 0,9 s
Czyli w pliku cache trzyma 40 000 elementowa tablice i dla kazdego elementu dodatkowo po 3 wartosci (3 kolumny) i to wszystko odczytuje w 0,9 sec wiec chyba jest ok.

Nie wiem jak to bedzie przy np 100 lub wiecej plikach cache z 10 grupami, jesli za kazdym wywolaniem strony bedzie robil skana zeby usuwac stare itd...


Jak wy rozwiazaliscie ten problem? Pozdro
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Athlan
post
Post #2





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

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


Powiem szczeże że dziwnie to zrobiłeś... ja mam po prostu:

(użycie podam przy publikacji okumentacji mojego frameworka)

  1. <?php
  2.  
  3. final class Vcache
  4. {
  5. private static $_sCacheDirectory = NULL;
  6. private $_sCacheName = NULL;
  7. private $_sCachePrefix = 'cache_';
  8. private $_sCacheExtension = '.tmp';
  9. private $_iCacheExpire = 3600;
  10. private $_sCacheFilePatch = NULL;
  11.  
  12. public function __construct($sItemElement)
  13. {
  14. self::_runTemp();
  15. $this->_sCacheName = $sItemElement;
  16. $this->_sCacheFilePatch = self::$_sCacheDirectory . $this->_sCachePrefix . $this->_makeIdentyficator($this->_sCacheName) . $this->_sCacheExtension;
  17. }
  18.  
  19. public function save($mItemHandler)
  20. {
  21. if(is_array($mItemHandler))
  22. $mCachePreparing = serialize($mItemHandler);
  23.  
  24. elseif(is_object($mItemHandler))
  25. $mCachePreparing = serialize(get_class_vars($mmItemHandler));
  26.  
  27. else
  28. $mCachePreparing = $mItemHandler;
  29.  
  30. if(!@file_put_contents($this->_sCacheFilePatch, $mCachePreparing))
  31. throw new VcacheException('Caching "'.$this->_sCacheFilePatch.'" failed!');
  32. }
  33.  
  34. public function load($bUnserialize = FALSE)
  35. {
  36. if(!is_bool($bUnserialize))
  37. throw new VcacheException('Param $bUnserialize must be boolean!');
  38.  
  39. if(Vframe::isUsable($this->_sCacheFilePatch))
  40. {
  41. $sCacheContent = file_get_contents($this->_sCacheFilePatch);
  42.  
  43. if($bUnserialize)
  44. return unserialize($sCacheContent);
  45. else
  46. return $sCacheContent;
  47. }
  48. else
  49. return FALSE;
  50. }
  51.  
  52. public function clear()
  53. {
  54. if($this->ping())
  55. @file_put_contents($this->_sCacheFilePatch, NULL);
  56. }
  57.  
  58. public function delete()
  59. {
  60. if($this->ping())
  61. @unlink($this->_sCacheFilePatch);
  62. }
  63.  
  64. public function expired($iTime = NULL)
  65. {
  66. if(!is_int($iTime) && $iTime !== NULL)
  67. throw new VcacheException('Param $iTime must be integer!');
  68.  
  69. if($iTime === NULL || $iTime === 0)
  70. $iTime = $this->_iCacheExpire;
  71.  
  72. if(!$this->ping())
  73. return TRUE;
  74.  
  75. if((@filemtime($this->_sCacheFilePatch) + $iTime) > time())
  76. return FALSE;
  77. else
  78. return TRUE;
  79. }
  80.  
  81. public function ping()
  82. {
  83. return (bool) Vframe::isUsable($this->_sCacheFilePatch, TRUE, TRUE);
  84. }
  85.  
  86. public function start()
  87. {
  88. }
  89.  
  90. public function stop()
  91. {
  92. $this->save(ob_get_contents());
  93. }
  94.  
  95. public static function clearTemp()
  96. {
  97. $sDirectory = self::_runTemp();
  98.  
  99. if(!($rHandler = @opendir($sDirectory)))
  100. throw new VcacheException('Cannot open "'.$sDirectory.'" cache directory to clear!');
  101.  
  102. while($sCacheItem = @readdir($rHandler))
  103. {
  104. if($sCacheItem != "." && $sCacheItem != "..")
  105. @unlink($sDirectory . $sCacheItem);
  106. }
  107.  
  108. @closedir($rHandler);
  109. }
  110.  
  111. public function setTemp($sTempPatch)
  112. {
  113. if(!Vframe::isUsable($sTempPatch, TRUE, TRUE))
  114. throw new VcacheException('Specified directory "'.$sTempPatch.'" to caching does not exists or it have wrong chmod! Please create this dire
    ctory and set 777 chmod in it.'
    );
  115.  
  116. return self::$_sCacheDirectory = $sTempPatch;
  117. }
  118.  
  119. private static function _runTemp()
  120. {
  121. if(!defined('V_VAR_CACHE'))
  122. throw new VcacheException('Default patch to cache directory has no specified ar V_VAR_CACHE config! Please 
    repair this gap.'
    );
  123.  
  124. return self::setTemp(V_VAR_CACHE);
  125. }
  126.  
  127. private function _makeIdentyficator($sItemName)
  128. {
  129. return md5(base64_encode($sItemName));
  130. }
  131. }
  132.  
  133. ?>
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 7.10.2025 - 11:56