Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Cache, [klasa] php5
nospor
post 5.07.2006, 18:32:33
Post #1





Grupa: Moderatorzy
Postów: 36 468
Pomógł: 6300
Dołączył: 27.12.2004




info
pobierz

Prezentuje moją nową klasę Cache. Jak nazwa wskazuje klasa służy do zarządania cachem. Do cache'u można wkładac stringi, tablice, liczby, obiekty. Dany obiekt cache'u należy zawsze do jakiejś grupy lub do kilku grup. Gdy nie podamy grupy, obiekt trafi do grupy domyślnej.

Obiekty w cache'u mają swoją żywotność, którą można regulować według własnych potrzeb. Obiekty moga byc wazne przez sekundy, minuty, godziny, dni itp...
Dodatkowo można uzależnic obiekt od pliku zewnetrznego bądź też od kilku plikow. Cache straci wowczas swoją waznosc, gdy w danym pliku zewnetrznym pojawią sie jakies zmiany. Uzależnienie obiektu od kilku plikow moze byc przydatne, gdy np. tworzymy obiekt na podstawie kilku plikow xml.

Nazwy obiektów mogą byc rownież hashowane. Ma to powiedzmy zastosowanie przy cacheowaniu zapytan. Zamiast nazwy "select * from tabela order by alamakota", pojawi nam sie ladny hash smile.gif

Czyszczenie cache odbywa sie na 4 sposoby:
1) wyczyszczenie calego cache'u
2) skasowanie wybranego(ych) obiektu(ow)
3) wyczyszczenie wybranej (ych) grupy
4) obiekt traci swoją ważność


Zapraszam do używania, testowania i zgłaszania ewentualnych uwag/błędów.

edit:
począwszy od wersji 1.2 Cache dziala na zasadzie sterownikow I/O. Wraz z paczką dołączony jest sterownik działający na plikach oraz sterownik operujacy na pamieci, przez co obsluga Cache jest jeszcze szybsza.
Dodana zostala suma kotrolna, mająca swoje zastosowanie szczegolnie przy operacjach na pamieci.

edit (2006-09-08):
No i jest Cache ver. 2.0
Czemu taki przeskok w numeracji? Ano odszedlem "troche" od sposobu konfiguracji cache.
Wczesniej, aby moc dzialac na plikach i na pamieci trzeba bylo definiowac dwa obiekty Cache. Teraz mozliwe jest zdefiniowanie kilku sterownikow dla jednego obiektu Cache.
Wprowadzilem przymus definiowania grup (domyslnie definiowana jest jedna grupa jesli komus przymus nie odpowiada winksmiley.jpg ). Dzieki takiemu zastosowaniu mozna parametryzowac grupy, a co za tym idzie obiekty do nich przypisane. Mozna dla grupy okreslic jakie sterownik ma ja obslugiwac, jej czas zycia, sprawdzanie sumy, hashowanie i inne. Jesli w jakiejs chwili nam sie odmienia, ze configi zamiast na dysku maja byc zapisywane w pamieci, wystarczy wowczas tylko zmienic sterownik dla grupy, bez latania po wszystkich obiektach i zmieniania. Oczywiscie mozna zdefiniowac czas zycia obiektu w cache tylko dla niego, nadpisujac w ten sposob parametry grupy.
Teraz by pobrac obiekt z cache trzeba okreslic do jakiej grupy nalezy. Wczesniej tego nie trzeba bylo robic. No ale jest to niezbedne by zaladowac chociazby odpowiedni sterownik do obslugi obiektu.
Oczywiscie jak sie nie poda tego parametru, zaczytana zostanie grupa domyslna.


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

"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
5 Stron V  « < 3 4 5  
Start new topic
Odpowiedzi (80 - 93)
nospor
post 11.01.2012, 19:50:43
Post #81





Grupa: Moderatorzy
Postów: 36 468
Pomógł: 6300
Dołączył: 27.12.2004




Hehe, ale słowo "Recursive" mogło dać ci trochę do myślenia wink.gif


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

"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
Lukaszpl
post 23.02.2012, 09:32:44
Post #82





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 12.01.2012

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


Świetna sprawa z tą klasą do cache. Wdrożenie nie jest przesadnie skomplikowane, co mi się podoba. Mam dwa pytania:

1. Jeśli załaduję jakieś dane do pamięci operacyjnej z czasem na 5 minut i później usunę plik php w którym wywołałem klasę z ładowaniem danych do pamięci, co się stanie? Zostaną te dane w pamięci czy zostaną one usunięte po 5 minutach? W przypadku cache z wykorzystaniem danych na dysku one zostają dopóki nie wywołam ponownie danego pliku php z daną grupą cache.
2. Chciałbym pewne dane ładować do pamięci operacyjnej i tutaj pojawia się kwestia tego co się stanie gdy zabraknie miejsca w pamięci operacyjnej serwera? Tak pozatym, w jaki sposób mogę zweryfikować ilość dostępnej pamięci?
Go to the top of the page
+Quote Post
nospor
post 23.02.2012, 09:41:48
Post #83





Grupa: Moderatorzy
Postów: 36 468
Pomógł: 6300
Dołączył: 27.12.2004




Mówisz o sterowniku APC?

ad1) Będzie tak samo jak z plikiem
ad2) To apc zarządza tym. Gdy mu brakuje pamięci to.... nie pamiętam smile.gif Kiedyś się bawiłem chyba na tę okazję, i jakoś sobie radził. Kasował stare wpisy czy może coś podobnego. Naprawdę teraz tego nie pamiętam.


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

"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
Lukaszpl
post 23.02.2012, 14:36:30
Post #84





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 12.01.2012

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


Jaki jest maksymalny czas dla cache w pamięci i dyskowej? Mogę ustawić na przykład wartość 86400 (co będzie oznaczać 24 godziny), albo jeszcze więcej?

Ten post edytował Lukaszpl 23.02.2012, 14:36:52
Go to the top of the page
+Quote Post
nospor
post 23.02.2012, 14:40:50
Post #85





Grupa: Moderatorzy
Postów: 36 468
Pomógł: 6300
Dołączył: 27.12.2004




A możesz ustawić nawet i dwa lata jak masz taką ochotę smile.gif


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

"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
jarod21
post 11.11.2013, 13:34:26
Post #86





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 14.04.2012

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


Witam,
Jestem początkujący i mam pytanie:
Pobieram dane i zapisuje je do pliku w kataogu np Cache/user/user_1/@queries
- dane zapisują się w pliku Cache a nazwy danych w Cache/user/user_1/@queries dlaczego dane nie zapisuję się tam gdzie nazwy danych?
- jeśli chcę wybrać folder w CacheFileDriver("Cache/user/user_1") który nie istnieje to nie tworzy go wyskakuje błąd, muszę sprawdzać czy plik istnieje tworzyć go i dopiero ustawiać ścieżkę w CacheFileDriver . Gdzie zmienić skrypt CacheFileDriver.class.php aby dodawał foldery automatycznie?

edit:
przy ustawieniu CacheFileDriver("Cache/user/user_1") wyskakuje błąd :
Warning: mkdir() [function.mkdir]: No such file or directory in /drivers/CacheFileDriver.class.php on line 39
Can't create file/catalog: Cache/user/user_1

Ten post edytował jarod21 11.11.2013, 17:25:10
Go to the top of the page
+Quote Post
nospor
post 12.11.2013, 07:02:44
Post #87





Grupa: Moderatorzy
Postów: 36 468
Pomógł: 6300
Dołączył: 27.12.2004




Katalogi tworzą sie automatycznie. Widac skrypt nie ma prawa do tworzenia tam katalogow

Cytat
dane zapisują się w pliku Cache a nazwy danych w Cache/user/user_1/@queries dlaczego dane nie zapisuję się tam gdzie nazwy danych?
Dane zapisuja sie tam gdzie im kazesz. Jak w nazwie danej nie podasz sciezki do katalogu to zapisze sie w katalogu glownym. Przejrzyj przyklady dolaczone do paczki.


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

"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
jarod21
post 12.11.2013, 10:40:31
Post #88





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 14.04.2012

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


Wiem przeglądałem kod i dziwi mnie że przy CacheFileDriver("Cache/user/user_1") wyskakuje błąd a przy $cache->AddGroup('user/user_1/@queries', array('lifetime'=>month, 'driver'=>'fileDriver','hashid'=>true)); i zapytaniu $data = $cache->Get($zapytanie1,'user/user_1/@queries'); tworzy katalogi i podkatalogi bez błędu.
Go to the top of the page
+Quote Post
nospor
post 12.11.2013, 10:57:20
Post #89





Grupa: Moderatorzy
Postów: 36 468
Pomógł: 6300
Dołączył: 27.12.2004




Poniewaz CacheFIleDriver nie tworzy zagniezdzonych katalogow ,tylko co najwyzej jeden. Gdy tworzylem klase to w zamysle do cacheFIleDriver mialo sie zapodowac katalog glowny na cache, a dopiero grupy mogly sie zagniezdzac jak im sie podoba


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

"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
jarod21
post 6.01.2015, 22:41:23
Post #90





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 14.04.2012

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


Witam,
Zrobiłem test cache i wygląda, że jest 2x wolniejszy niż zapytania do bazy (baza ponad 130 000 wierszy.)
Zapytuję o 3 wartości w pętli 5000 razy.
Cache ma 4 pliki - zapytania i 3 pliki z danymi.
Zapytania do bazy to ok 4 sek.
Zapytania z cache to ok 8 sek.
Wydawało mi się, że z cache powinno lecieć szybciej.
Z czego wynika taka różnica questionmark.gif

Pozdrawiam Jarek
Go to the top of the page
+Quote Post
nospor
post 7.01.2015, 08:02:27
Post #91





Grupa: Moderatorzy
Postów: 36 468
Pomógł: 6300
Dołączył: 27.12.2004




Byłoby naprawde miło jakbyś uraczył nas kodem... skad mamy wiedziec gdzie lezy błąd.


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

"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
jarod21
post 7.01.2015, 11:30:37
Post #92





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 14.04.2012

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


Kod poniżej

  1.  
  2. require('Cache.class.php');
  3. require('drivers/CacheFileDriver.class.php');
  4.  
  5. $db_server = 'localhost'; // server name
  6. $db_user = ''; // user name
  7. $db_pass = ''; // user password
  8. $db_name = 'baza'; // database name
  9.  
  10.  
  11. function getmicrotime()
  12. {
  13. $microtime = explode(' ', microtime());
  14. return $microtime[1] . substr($microtime[0], 1);
  15. }
  16.  
  17. function sql_connect($db_server, $db_user, $db_pass, $db_name) {
  18. if (mysql_connect($db_server , $db_user, $db_pass) and mysql_select_db($db_name)) {
  19. mysql_query("SET NAMES 'utf8'");
  20. $status = true;
  21. }
  22. else {
  23. $status = false;
  24. }
  25. return $status;
  26. }
  27.  
  28.  
  29. // set_time_limit(1200);
  30.  
  31. if(sql_connect($db_server, $db_user, $db_pass, $db_name)){
  32.  
  33. $data1 = array(92246,72682444,83043112);
  34.  
  35. $ile = count($data1);
  36.  
  37. $opcja = $_GET['o'];
  38.  
  39. $time_start = getmicrotime();
  40.  
  41.  
  42. if($opcja == 1){
  43.  
  44. try {
  45. //stworzenie obiektu cache.
  46. $cache = new Cache();
  47. $cache->AddDriver('fileDriver',new CacheFileDriver('Cache'));
  48.  
  49. $cache->AddGroup('@queries', array(
  50. 'lifetime'=>86400,
  51. 'driver'=>'fileDriver',
  52. 'hashid'=>true
  53. ));
  54.  
  55. for($j=0;$j<5000;$j++){
  56. for($i=0;$i<$ile;$i++){
  57.  
  58. $queries = "select * from katalog WHERE opcja = ".$data1[$i];
  59.  
  60. $val = $cache->Get($queries, '@queries');
  61. if (is_null($val)){
  62. $res = mysql_query($queries);
  63. $data = array();
  64. while ($row = mysql_fetch_array($res)){$data[]= $row;}
  65. $cache->Put($queries, $data, '@queries');
  66. }
  67. else {
  68. }
  69. }
  70. }
  71. }
  72. catch (CacheException $e){
  73. echo '<span style="color:red">'.$e->getMessage().'</span>';
  74. }
  75. }
  76. else {
  77. for($j=0;$j<5000;$j++){
  78. for($i=0;$i<$ile;$i++){
  79. $queries = "select * from katalog WHERE opcja = ".$data1[$i];
  80. $res = mysql_query($queries);
  81. $data = array();
  82. while ($row = mysql_fetch_array($res)){$data[]= $row;}
  83. }
  84. }
  85. }
  86. }
  87.  
  88. $time_stop = getmicrotime();
  89.  
  90. $roznica = $time_stop - $time_start;
  91. echo 'Czas wczytywania pliku: ' . $roznica;
  92.  
Go to the top of the page
+Quote Post
Pyton_000
post 7.01.2015, 11:55:23
Post #93





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Może być szybsze przez to że MySQL robi cache zapytania, a że wykonujesz je xxxx razy pod rząd to już sobie z cache zasysa.
Dodaj SQL_NO_CACHE po SELECT.
Poza tym cache nadaje się do bardziej skomplikowanych zapytań niż zwykły select który pierdnie wink.gif I w tym wypadku minimalizuje ilość zapytań samych w sobie, a nie szybkość (bo tu nie ma co przyspieszać)
Go to the top of the page
+Quote Post
nospor
post 7.01.2015, 11:56:12
Post #94





Grupa: Moderatorzy
Postów: 36 468
Pomógł: 6300
Dołączył: 27.12.2004




1) Do cache powinno się wkładać raczej jakies wieksze kawałki, a nie malutkie pojedyncze rekordy
2) Do cache sie powinno wkladac dane, ktorych generowanie zajmuje stosunkowo duzo czasu a nie ułamek micro sekundy. W takim wypadku czasami cache nie ma sensu


Mi Twoj test wypada na korzysc cache, gdzie czas cache to ok 0.68420791625977 zas czas zapytan to ok 1.0938959121704
Oczywiscie wyniki te mogą być różne w zależnosci od posiadanego dysku, pamieci, procesora itp i moze sie okazac, że przy tak banalnych i szybkich zapytaniach, cache moze dzialac dluzej.


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

"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

5 Stron V  « < 3 4 5
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: 18.05.2024 - 11:07