Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP] Klasa do "keszowania" zapytań
adam882
post
Post #1





Grupa: Zarejestrowani
Postów: 289
Pomógł: 1
Dołączył: 2.11.2007

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


Witam

Prosiłbym o sprawdzenie poprawności w napisaniu klasy do "keszowania" zapytań mysql (czy chociaż dobrze zacząłem ją pisać), gdyż nie mam wiedzy na temat zaawansowanego programowania w php (którego trochę mogłem już zapomnieć) i zawsze używałem gotowych klas mysql. Klasa nie jest jeszcze dopracowana.
  1. //Klasa mysql cache
  2. class mysql
  3. {
  4. //Ustawienia
  5. private $folder='temp/'; //Folder cache
  6.  
  7. //Pomocne w klasie
  8. private $connect; //Do połączenia i zamykania połączenia z mysql
  9. public $row=array(); //Do pobierania wyników z bazy
  10. private $cache_buffer=array(); //Przechowuje tutaj dane z cache
  11. public $cache_stan=0; //Pomaga w zakończeniu pętli w fetch_assoc()
  12. public $array_num=0; //Ostatni numer tablicy
  13. private $zapytanie_bez_cache; //Gdy cache jest nieaktywne przypisuje mu wyniki z mysql_query(), aby móc odtworzyć rekordy z użyciem w funkcji klasy: fetch_assoc
  14. private $cache_name; //Nazwa pliku cache
  15. public $queries=0; //Zlicza zapytania
  16.  
  17.  
  18. ########## Konstruktor ##########
  19. function __construct($host,$user,$pass,$baza)
  20. {
  21. $this->connect=@mysql_connect($host,$user,$pass) or die('Nie mogę się połączyć z mysql <br /> Błąd: '.mysql_error());
  22. @mysql_select_db($baza) or die('Nie mogę wybrać bazy <br /> Błąd: '.mysql_error());
  23.  
  24. }
  25. ##############################
  26.  
  27.  
  28.  
  29. ########## Destruktor
  30. function __destruct()
  31. {
  32. @mysql_close($this->connect);
  33. }
  34. ##############################
  35.  
  36.  
  37.  
  38. ########## Zapytanie ##########
  39. public function query($zapytanie, $cache=false) //Drugi parametr określa, czy włączyć cache i jednocześnie przypisuje nazwę pliku
  40. {
  41.  
  42. $this->cache_name=$cache; //Daje znać, czy użyć cache jednocześnie tworząc nazwę pliku
  43.  
  44. if($this->cache_name) //Z cachowaniem (czy nazwa pliku cache została podana)
  45. {
  46.  
  47. if(file_exists(''.$this->folder.''.$this->cache_name.'.plik')) //Gdy plik cache istnieje
  48. {
  49. $this->cache_buffer=unserialize(file_get_contents(''.$this->folder.''.$this->cache_name.'.plik')); //Wczytuje tablice z pliku
  50. $this->array_num=count($this->cache_buffer); //Liczba elementów tablicy
  51. }
  52. else //Gdy nie ma pliku cache, to tworzymy go
  53. {
  54. $temp=array();
  55. $wynik=mysql_query($zapytanie) or die('Problem z zapytaniem <br /> Błąd: '.mysql_error()); //Zapytanie do bazy
  56. $this->queries++; //Liczba zapytań rośnie
  57.  
  58. while($r=mysql_fetch_assoc($wynik))
  59. {
  60. $temp[]= $r;
  61. }
  62. ignore_user_abort(1); //Gdzieś spotkałem się z takim zaleceniem
  63. $this->cache_buffer=$temp; //Przenosi tablicę z wynikami do buffera
  64. $this->array_num=count($this->cache_buffer); //Liczba elementów tablicy
  65. @file_put_contents(''.$this->folder.''.$this->cache_name.'.plik',serialize($temp)); //umieszczenie pliku
  66. }
  67. return 1;
  68. }
  69. else //Bez cachowania
  70. {
  71. $this->zapytanie_bez_cache=mysql_query($zapytanie) or
  72. die('Problem z zapytaniem<br /> Błąd: '.mysql_error()); //Zapytanie do bazy, przypisuje je zmiennej, aby móc potem pobrać rekordy
  73. $this->queries++; //Liczba zapytań rośnie
  74. }
  75.  
  76. }
  77. ##############################
  78.  
  79.  
  80.  
  81. ########## Pobieranie wyników ##########
  82. public function fetch_assoc()
  83. {
  84. if($this->cache_name) //Z cachowaniem
  85. {
  86.  
  87. if($this->array_num==$this->cache_stan){ //Czy ilość elementów jest równa numerowi tablicy, jeśli nie, to numer tablicy się zwiększa
  88. return 0; //Pobrano wszystkie elementy tablicy - koniec pętli
  89. }
  90. else
  91. {
  92. $this->row = $this->cache_buffer[$this->cache_stan]; //Tworzy tablicę do wyświetlania wyników, począwszy od tablicy z numerem 0
  93. $this->cache_stan++; return 1; //Pobiera elementy, indeks zwiększa się, pętla trwa
  94. }
  95. }
  96. else //Bez cachowania
  97. {
  98. $this->row = mysql_fetch_assoc($this->zapytanie_bez_cache);
  99. return $this->row;
  100. }
  101. }
  102. ########################################
  103.  
  104.  
  105.  
  106. ########## Mysql_num_rows ##########
  107. public function num_rows()
  108. {
  109. if($this->cache_name) //Z cachowaniem
  110. {
  111. return $this->array_num;
  112. }
  113. else //Bez cachowania
  114. {
  115. return mysql_num_rows($this->zapytanie_bez_cache);
  116. }
  117. }
  118. ####################################
  119.  
  120.  
  121. }
  122.  
  123. ##################################################
  124. ###################### TEST ######################
  125. ##BENCHMARK
  126. function czas()
  127. {
  128. $time = explode(" ", microtime());
  129. $a= (double)$time[0];
  130. $b= (double)$time[1];
  131. return $b + $a;
  132. }
  133. ##BENCHMARK
  134.  
  135. $poczatek = czas();
  136. $x=0;
  137.  
  138. $sql=new mysql('localhost','root','krasnal','baza');
  139. $sql->query('SELECT nazwa FROM rekordy ORDER BY id DESC LIMIT 100','NazwaPlikuCache'); //Drugi parametr tworzy plik cache o takiej nazwie, nie podając go cache się wyłącza
  140. if($sql->num_rows()>0){echo 'Są rekordy ('.$sql->num_rows().')<br />';}else{echo 'brak rekordów!<br />';} //Test mysql_num_rows
  141. while($sql->fetch_assoc())
  142. {
  143. $x++;
  144. echo $x.') '.$sql->row['nazwa'].'<br />';
  145.  
  146. }
  147. $koniec= czas();
  148. $c = $koniec - $poczatek;
  149. echo "<br /><br />czas generowania " . substr($c, 0, 5) . " sek.<br />Zapytań: ".$sql->queries;
  150. ##################################################
  151. ###################### TEST ######################
Powód edycji: [erix]: przeniosłem
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: 19.09.2025 - 19:26