Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: funkaja/procedura/widok - odczyt kesza
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
ds26
Witam,

jestem dosc nowy w postgresie.. pracowalem glownie w mysql'u..

mam problem tego rodzaju:

prawie kazda strona aplikacji korzysta z zapytania ktore laczy dwie spore tabele (pokazuje one osoby na czacie ktore sa w danej chwili online).. do tej pory bylo ok, ale serwis zyskuje na popularnosci i czasmi przymula baze.

chcialbym napisac jakas funkce ktora bedzie korzystac z kesza co, powiedzmy 30 sekund, i w rezulatcie zamiast za kazdy razem (ta lista z osobowmi onilne znajduje sie na kazdej podstronie), odpolac to zapytanie, brralbym juz tylko wyniki..

nigdy w takie rzeczy sie jeszcez nie bawilem, czy moze mi ktos powiedziec co trzeba wykorzystac? czy procedury, czy widoki..


z gory dzieki.
Zbłąkany
Najlepiej plik albo ram w żadnym razie bazę, jeśli może być kilkadziesiąt połączeń na sekunde. Jeśli lista userów online na czacie to kilka osób to baza pociągnie, im więcej tym gorzej dla maszyny:) Lepiej napisać demona w php/perl/c++/c/java, który się osadzi na porcie i odpytywać bezpośrednio demona przez port smile.gif Demon może to sobie w ramie trzymać, albo w jakimś pliku i na pewno nie zamuli ci maszyny smile.gif A rozwiązanie z cachem jest bez sensu chyba, że chcesz trzymać statystyki czatu/czatów w bazie. Lista userów może się zmieniać dość często więc biorąc pod uwagę rosnącą popularność serwisu odradzam do tego bazę. No chyba, że lista ma być dla picu (nieaktualna) to wtedy jest ok smile.gif . Widok się do tego nie nadaje, bo musiałbyś go często aktualizować, prędzej jakaś tymczasowa tabela jako cache, ale jak już stwierdziłem wcześniej nie warto moim zdaniem kombinować na siłę z bazą smile.gif
ds26
dzieki za odp.

pomysl z demonem brzmi ciekawie, tym b-j ze jest, jak napisalem, zrobienia tego w phpie. nigdy takiego czegos nie pisalem, moglbys cos wiecej powiedziec? jesli chcesz pogadac poza forum to zlapiesz mnie pod macdar at gmail . com
Zbłąkany
O ile dobrze pamiętam to na forum Seth przedstawiał podobną koncepcję demona napisanego w php smile.gif
SongoQ
@ds26 Jesli chodzi i daemona to odradzam php, rowzniez JAVE ale za to polecam C lub C++. Jesli chodzi o Linuxa to sluze z pomoca bo walkowalem ten temat jakis czas temu.
ds26
ok, troche sie kiedys bawilem c++, wiec mozemy pogadac. odezwij sie na majla ktory podalem w moim poprzednim poscie.
Krolik
Gdybyś napisał całą aplikację w Javie, cache zapytań miałbyś za friko - Hibernate + EhCache i śmiga smile.gif

Możesz też zrobić widok zmaterializowany za pomocą triggerów i procedur, ale to jest nieco kłopotliwe, bo postgres nie ma jeszcze wsparcia dla takich zabawek. Zwyły widok (create view) nic Ci nie da, bo jest i tak za każdym razem obliczany. Widoki zmaterializowane mają DB/2 i Oracle.

Jest jeszcze taka możliwość, że wyniki tego zapytania zapiszesz sobie w pliku. Jeśli będziesz ten plik głównie czytał, to i tak będzie w pamięci i będzie to się działo szybko.
envp
  1. <?php
  2. final class Cache
  3. {
  4. private $_sCacheName,
  5. $_sCachePrefix = 'cache_',
  6. $_sCacheExtension = '.tmp',
  7. $_iCacheExpire = 36000,
  8. $_sCachePath = null;
  9.  
  10.  
  11. public function __construct($sCacheName, 
  12.  $iCacheExpire = 36000, 
  13.  $sCachePrefix = 'cache_', 
  14.  $sCacheExtension='.tmp')
  15. {
  16.  
  17. if(self::checkConfig() == false)
  18. throw new CacheException('Cache directory has not been specified in _configure.php');
  19.  
  20. if(!self::checkCacheDirectory())
  21. throw new CacheException('Cache directory does not exist or it is not readable!');
  22.  
  23. $this->_sCacheName = $sCacheName;
  24. $this->_sCachePrefix = $sCachePrefix;
  25. $this->_sCacheExtension = $sCacheExtension;
  26. $this->_sCachePath = $this->createCachePath($sCacheName);
  27.  
  28. }
  29.  
  30. private static function checkCacheDirectory()
  31. {
  32. return(NyssSystem::fileIsReadable(_DIR_APPLICATION_CACHE));
  33. }
  34.  
  35. private static function checkConfig()
  36. {
  37. return(defined('_DIR_APPLICATION_CACHE'));
  38. }
  39.  
  40. private function hashName($sItem)
  41. {
  42. return md5(base64_encode($sItem));
  43. }
  44.  
  45. private function createCachePath($sCacheName)
  46. {
  47. return(_DIR_APPLICATION_CACHE . $this->_sCachePrefix . $this->hashName($this->_sCacheName) . $this->_sCacheExtension);
  48. }
  49.  
  50. public function save($mItem)
  51. {
  52. if(is_array($mItem))
  53. $mCachePrepared = serialize($mItem);
  54.  
  55. elseif(is_object($mItem))
  56. $mCachePrepared = serialize($mItem);
  57.  
  58. else
  59. $mCachePrepared = $mItem;
  60.  
  61.  
  62. if(!file_put_contents($this->_sCachePath, $mCachePrepared))
  63. throw new CacheException('Caching "'.$this->_sCachePath.'" failed!');
  64. }
  65.  
  66. public function load($bUnserialize = true)
  67. {
  68. if(!is_bool($bUnserialize))
  69. throw new CacheException('Param to Cache::load() must be a boolean!');
  70.  
  71. if(NyssSystem::fileIsReadable($this->_sCachePath))
  72. {
  73. $sCacheContent = file_get_contents($this->_sCachePath);
  74.  
  75. if($bUnserialize)
  76. return unserialize($sCacheContent);
  77.  
  78. else
  79. return $sCacheContent;
  80.  }
  81.  
  82.  else
  83.  return false;
  84.  }
  85.  
  86. public function ping()
  87. {
  88. return(NyssSystem::fileIsReadable($this->_sCachePath));
  89. }
  90.  
  91.  
  92. public function start()
  93. {
  94.  ob_clean();
  95.  ob_start();
  96. }
  97.  
  98. public function stop()
  99. {
  100. $this->save(ob_get_contents());
  101. }
  102.  
  103. public static function clearAllCache()
  104.  {
  105.  $sDirectory = _DIR_APPLICATION_CACHE;
  106.  
  107.  if(!($rHandler = @opendir($sDirectory)))
  108.  throw new CacheException('Cannot open "'.$sDirectory.'" cache directory to clear data.');
  109.  
  110. while($sCacheItem = @readdir($rHandler))
  111.  if($sCacheItem != "." && $sCacheItem != "..")
  112.  @unlink($sDirectory . $sCacheItem);
  113.  
  114.  @closedir($rHandler);
  115.  }
  116.  
  117.  public function expired($iTime = null)
  118.  {
  119.  if(!is_int($iTime) && $iTime !== null)
  120.  throw new VcacheException('Param $iTime must be integer!');
  121.  
  122.  if($iTime === null || $iTime === 0)
  123.  $iTime = $this->_iCacheExpire;
  124.  
  125. if(!$this->ping()) 
  126. return true;
  127.  
  128. if((@filemtime($this->_sCachePath) + $iTime) > time())
  129. return false;
  130.  
  131. else
  132. return true;
  133. }
  134.  
  135.  
  136. }
  137. ?>


Prosta klasa, chyba z użyciem nie będzie problemu smile.gif
Najpier usatw sobie tam na górze ile ma cache trzymać, potem ofc przed kazydm pobraniem sprawdzaj czy cache wazny jezli tak to z cache laduj jesli nie to z bazy....
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.