Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Cache
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
Stron: 1, 2
nospor
Nie. cache z opcją day kasuje się dokładnie następnego dnia, niezależnie o której był utworzony dnia wcześniejszego.
A dokładnie kasowany jest dnia następnego przy pierwszej próbie jego pobrania. Jeśli pierwsza próba pobrania będzie o północy to skasuje się o północy. Jeśli pierwsza próba pobrania będzie o 02:34 to skasowany zostanie o 02:34
@rtur
Więc chyba pozostaje mi czyszczenie cache imieninowego z crona, przecież jak ktoś wywoła pierwszy raz skrypt jednego dnia o 08:05 a drugiego o 7:02 to o mu się pokaże zawartość wczorajszego cache bo od czasu powstania nie minie 24h.

Dziękuje jeszcze raz za dokładne i rzeczowe wytłumaczenie.
nospor
NIe zrozumiałeś totalnie....
Przecież ci tłumaczę, że day nie oznacza 24h a oznacza nowy dzien.
Jeśli cache utworzy się o 08:05 a następnego dnia ktoś go wywoła o 07:02 to cache się wyczyści i wygeneruje na nowo z dniem aktualnym - będziesz więc miał to co chcesz.
@rtur
Faktycznie, nie zrozumiałem.

to jeszcze spytam o jedna rzecz:
czy jak tak zdefiniujemy grupę w ten sposób:
  1. $cache->AddGroup('@queries', array(
  2. 'driver'=>'fileDriver',
  3. 'hashid'=>true));

to bedzie ok, i moge potem w kodzie zdefiniowac czas 5 sek np tak ?

  1. $val = $cache->Get('zapytanie_mysql', '@queries', 5);


Przepraszam za tyle pytań ale dopiero zaczynam zabawę klasami.
nospor
Tak, gdy określisz czas w Get() to nadpisze on czas z grupy.
Gdy w grupie nie określisz czasu to zostanie przydzielony dla grupy czas domyślny.

Podsumowując: jest tak jak napisałeś smile.gif
brayan.tr
Czy da się tak ustawić aby Cache ogóle nie było kasowane questionmark.gif Tzn tylko na życzenie. Np. podczas gdy dokonuje zmiany w bazie za pomocą kodu php = odpalić czyszczenie cache w przeciwnym wypadku cache nie jest w ogóle kasowane questionmark.gif

Jaki parametr ma przyjść lifetime questionmark.gif
nospor
Ustaw za lifetime np. 5 lat. Podejrzewam, że przez ten czas sam kilka razy skasujesz na żądanie smile.gif
adam882
Bardzo fajna klasa smile.gif Mam jednak problem z grupą "@queries".
Czy da się za pomocą tej klasy zrobić tak, abym dodawał do cache tylko sam wynik zapytania mysql_query() ?
nospor
yyyy, mysql_query() czy mysql_fetch_array()? Do cache zazwyczaj zapisuje się rekordy a nie wynik mysql_query.
Tutaj o tym pisałem:
http://forum.nospor.pl/projekty/cache/cach...nych-ft252.html
adam882
chyba źle sprecyzowałem pytanie, ale dzięki za właściwą odpowiedź i gratuluję napisania świetnej klasy smile.gif
xxdrago
nospor, czy ta klasa nadawała by się do trzymania danych typu:
Kod
Ram: 36 %
0.00 - 0.00 - 0.00
5 %
Stan dysku 762.40 MB / 15.00 GB


Czy lepiej po prostu za każdym razem do maszyny wysyłać komendę?
nospor
W cache trzyma się dane, które przez dany okres czasu nie zmieniają się, a ich pozyskiwanie jest zasobożerne. Jeśli te dane takie są, to tak, można je trzymać w cache.
adam882
Mam problem z klasą.

Mianowicie zrobiłem sobie system komentarzy w ajaxie (lokalizacja pliku do odbierania danych: module/komentarz_ajax.php). Dałem w nim również funkcję czyszczenia cache dla podstrony, na której formularz został wywołany.
Po wywołaniu w pliku takiego kodu:
  1. $cache->ClearObjects('statystyki','@stringi');

Tworzy mi pusty katalog w lokalizacji: module/Cache (moja lokalizacja folderu cache to: Cache/ , a nie module/Cache). Nie wiem czy może mieć to znaczenie, ale plik "module/komentarz_ajax.php includuje" config.php (gdzie zadeklarowana jest klasa) - cofając się o folder ( include('../config.php'); )
nospor
Jeśli jako ścieżkę do katalogu podajesz tak: Cache to jest to ścieżka względne i leci względem aktualnego katalogu. Stąd zapewne masz problem. Musisz więc podawać ścieżkę bezwględną
adam882
W jaki sposób można to zrobić?
Modyfikując kod:
  1. $cache->AddDriver('fileDriver',new CacheFileDriver('Cache'));

chyba nie mogę dopisać ścieżki do 'Cache' bo wywala mi błąd z tworzeniem katalogu
nospor
Albo podajesz złą ścieżkę
Albo skrypt nie ma prawa tworzenia katalogu tam gdzie podajesz

Albo więc podaj prawidłową ścieżkę
Albo nadaj właściwe prawa na tej ścieżce
Albo utwórz katalog Cache ręcznie wówczas skrypt nie będzie musiał go tworzyć
adam882
Wydaje mi się, że problem leży tylko i wyłącznie w ścieżce - po prostu skrypt jakoś nie może się cofnąć do poprzedniego katalogu, gdzie jest folder z Cache i traktuje folder "module" jako folder główny.
Problem dotyczy tylko formularza z ajaxem. W jaki sposób można podać ścieżkę do cache?
nospor
Przecież ci napisałem: masz podać ścieżkę bezwzględną a nie względną. Gdy podasz ścieżkę bezwzględną, to problemu ze ścieżką na 100% nie bedzie.
adam882
ok, ale w którym miejscu się to ustawia ? (bo gdzie próbuję to ustawić, to nie działa) W "example" nie widzę nic o ustawaniu ścieżki. Wybacz, że tak Cię męczę ..
nospor
No tu to się ustawia:
$cache->AddDriver('fileDriver',new CacheFileDriver('Cache'));

Chcesz pełną ściezke to piszesz pełną sciezke:
$cache->AddDriver('fileDriver',new CacheFileDriver('pełnasciezkadotakalogu/Cache'));
adam882
Robiłem tak i coś takiego mi pokazało:

Fatal error: Uncaught exception 'CacheException' with message 'Can't create file/catalog: http://localhost/strony/skrypt/Cache' in C:\xampp\htdocs\strony\skrypt\class\drivers\CacheFileDriver.class.php on line 41

CacheException: Can't create file/catalog: http://localhost/strony/skrypt/Cache in C:\xampp\htdocs\strony\skrypt\class\drivers\CacheFileDriver.class.php on line 41

Czy może chodzi tutaj o podanie ścieżki na serwerze? (czy jak to się nazywa)
nospor
Cytat
Czy może chodzi tutaj o podanie ścieżki na serwerze? (czy jak to się nazywa)
rety.... tak, chodzi właśnie o ścieżke na serwerze. To co ty podajesz to jest URL...
adam882
Wybacz, ciągle się uczę. Dzięki
verio
Czy można liczyć na jakieś wskazówki jak podłączyć tą klasę do OPT v2? rolleyes.gif
nospor
1) Nie wiem jak wygląda OPT
2) Cache za bardzo z OPT nie ma nic wspólnego. cache generuje się przed skorzystaniem do OPT. Do OPT mogą trafiać dane zarówno z bazy jak i z cache.
pitbull82
Tworzę sobie swoją, znacznie prostszą klasę do cachowania, patrzyłem jak to zrobiłeś. Czy w CacheFileDriver w linii 62 zamiast

  1. if ($objectValue === false || is_null($objectValue))

nie powinno być czasem
  1. if ($objectValueS === false || is_null($objectValueS))

?
nospor
Ano powinno smile.gif
Naszczeście serialize rzadko kiedy się nie udaje, więc błąd nie jest straszny, ale masz racje, jest smile.gif
pitbull82
To jeszcze na wszelki wypadek linia 224

  1. $res = rmdir($fileInfo->getPathname());

tutaj nie powinno być wywołanie rekurencyjne? Bo jeśli w podkatalogu będą pliki, to nie usunie katalogu.

Generalnie ładna praca, którą dosyć ciężko szybko przenalizować, ale najważniejsze że działa i jest nią zainteresowanie co widać po tym wątku smile.gif
nospor
Hehe, nie, tym razem wszystko jest ok.
Spójrz pare linijek wyżej:
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dirName), RecursiveIteratorIterator::CHILD_FIRST);
rekurencję mam tu smile.gif
pitbull82
Bez bicia przyznaję się, że nie bawiłem się jeszcze nigdy iteratorami, więc nie domyśliłem się że ten zapis załatwia rekurencję smile.gif
nospor
Hehe, ale słowo "Recursive" mogło dać ci trochę do myślenia wink.gif
Lukaszpl
Ś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?
nospor
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.
Lukaszpl
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?
nospor
A możesz ustawić nawet i dwa lata jak masz taką ochotę smile.gif
jarod21
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
nospor
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.
jarod21
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.
nospor
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
jarod21
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
nospor
Byłoby naprawde miło jakbyś uraczył nas kodem... skad mamy wiedziec gdzie lezy błąd.
jarod21
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.  
Pyton_000
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ć)
nospor
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.
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.