Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> funkaja/procedura/widok - odczyt kesza, jak skeszowac wynik zapytanie i pozniej odczytywac?
ds26
post 8.02.2007, 14:24:50
Post #1





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 25.01.2007

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


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
Zbłąkany
post 8.02.2007, 18:03:09
Post #2


Administrator serwera


Grupa: Developerzy
Postów: 521
Pomógł: 13
Dołączył: 2.04.2004
Skąd: 52°24' N 16°56' E

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


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


--------------------
Środowisko: Gentoo 2008.0 | Apache | PHP5 | PostgreSQL | MySQL | Postfix
Workstation: Gentoo 2008.0 | Firefox
Thomas Alva Edison: "Aby coś wynaleźć wystarczy odrobina wyobraźni i sterta złomu ..."
Odpowiedź na każde pytanie typu "Jak ...": "Nie da się, to nie PostgreSQL"
Go to the top of the page
+Quote Post
ds26
post 8.02.2007, 19:22:37
Post #3





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 25.01.2007

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


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
Go to the top of the page
+Quote Post
Zbłąkany
post 9.02.2007, 08:36:47
Post #4


Administrator serwera


Grupa: Developerzy
Postów: 521
Pomógł: 13
Dołączył: 2.04.2004
Skąd: 52°24' N 16°56' E

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


O ile dobrze pamiętam to na forum Seth przedstawiał podobną koncepcję demona napisanego w php smile.gif


--------------------
Środowisko: Gentoo 2008.0 | Apache | PHP5 | PostgreSQL | MySQL | Postfix
Workstation: Gentoo 2008.0 | Firefox
Thomas Alva Edison: "Aby coś wynaleźć wystarczy odrobina wyobraźni i sterta złomu ..."
Odpowiedź na każde pytanie typu "Jak ...": "Nie da się, to nie PostgreSQL"
Go to the top of the page
+Quote Post
SongoQ
post 9.02.2007, 10:29:07
Post #5





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


@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.


--------------------
Go to the top of the page
+Quote Post
ds26
post 9.02.2007, 11:50:00
Post #6





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 25.01.2007

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


ok, troche sie kiedys bawilem c++, wiec mozemy pogadac. odezwij sie na majla ktory podalem w moim poprzednim poscie.
Go to the top of the page
+Quote Post
Krolik
post 12.02.2007, 11:31:55
Post #7





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 16.11.2004

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


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.


--------------------
Projekty: PLAY, optymalizator baz danych
Go to the top of the page
+Quote Post
envp
post 12.02.2007, 14:31:46
Post #8





Grupa: Zarejestrowani
Postów: 359
Pomógł: 1
Dołączył: 16.04.2006
Skąd: Łódź

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


  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....

Ten post edytował envp 12.02.2007, 14:33:39
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: 19.07.2025 - 20:33