nospor
10.05.2011, 08:14:16
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
10.05.2011, 08:29:25
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
10.05.2011, 08:31:56
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
10.05.2011, 10:16:58
Faktycznie, nie zrozumiałem.
to jeszcze spytam o jedna rzecz:
czy jak tak zdefiniujemy grupę w ten sposób:
$cache->AddGroup('@queries', array( 'driver'=>'fileDriver',
'hashid'=>true));
to bedzie ok, i moge potem w kodzie zdefiniowac czas 5 sek np tak ?
$val = $cache->Get('zapytanie_mysql', '@queries', 5);
Przepraszam za tyle pytań ale dopiero zaczynam zabawę klasami.
nospor
10.05.2011, 10:20:51
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ś
brayan.tr
12.06.2011, 22:18:09
Czy da się tak ustawić aby Cache ogóle nie było kasowane

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

Jaki parametr ma przyjść lifetime
nospor
13.06.2011, 07:18:19
Ustaw za lifetime np. 5 lat. Podejrzewam, że przez ten czas sam kilka razy skasujesz na żądanie
adam882
28.12.2011, 09:27:50
Bardzo fajna klasa

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
28.12.2011, 09:30:01
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
28.12.2011, 09:48:57
chyba źle sprecyzowałem pytanie, ale dzięki za właściwą odpowiedź i gratuluję napisania świetnej klasy
xxdrago
29.12.2011, 10:41:48
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
29.12.2011, 10:48:28
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
30.12.2011, 08:53:14
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:
$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
30.12.2011, 09:00:34
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
30.12.2011, 09:06:03
W jaki sposób można to zrobić?
Modyfikując kod:
$cache->AddDriver('fileDriver',new CacheFileDriver('Cache'));
chyba nie mogę dopisać ścieżki do 'Cache' bo wywala mi błąd z tworzeniem katalogu
nospor
30.12.2011, 09:10:03
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
30.12.2011, 09:22:40
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
30.12.2011, 09:26:10
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
30.12.2011, 09:34:49
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
30.12.2011, 09:43:17
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
30.12.2011, 09:49:16
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
30.12.2011, 09:53:12
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
30.12.2011, 09:54:40
Wybacz, ciągle się uczę. Dzięki
verio
5.01.2012, 23:44:43
Czy można liczyć na jakieś wskazówki jak podłączyć tą klasę do OPT v2?
nospor
6.01.2012, 13:03:01
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
11.01.2012, 19:28:20
Tworzę sobie swoją, znacznie prostszą klasę do cachowania, patrzyłem jak to zrobiłeś. Czy w CacheFileDriver w linii 62 zamiast
if ($objectValue === false || is_null($objectValue))
nie powinno być czasem
if ($objectValueS === false || is_null($objectValueS))
?
nospor
11.01.2012, 19:40:46
Ano powinno

Naszczeście serialize rzadko kiedy się nie udaje, więc błąd nie jest straszny, ale masz racje, jest
pitbull82
11.01.2012, 19:44:41
To jeszcze na wszelki wypadek linia 224
$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
nospor
11.01.2012, 19:46:42
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
pitbull82
11.01.2012, 19:48:46
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ę
nospor
11.01.2012, 19:50:43
Hehe, ale słowo "Recursive" mogło dać ci trochę do myślenia
Lukaszpl
23.02.2012, 09:32:44
Ś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
23.02.2012, 09:41:48
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

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
23.02.2012, 14:36:30
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
23.02.2012, 14:40:50
A możesz ustawić nawet i dwa lata jak masz taką ochotę
jarod21
11.11.2013, 13:34:26
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
12.11.2013, 07:02:44
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
12.11.2013, 10:40:31
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
12.11.2013, 10:57:20
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
6.01.2015, 22:41:23
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

Pozdrawiam Jarek
nospor
7.01.2015, 08:02:27
Byłoby naprawde miło jakbyś uraczył nas kodem... skad mamy wiedziec gdzie lezy błąd.
jarod21
7.01.2015, 11:30:37
Kod poniżej
require('Cache.class.php');
require('drivers/CacheFileDriver.class.php');
$db_server = 'localhost'; // server name
$db_user = ''; // user name
$db_pass = ''; // user password
$db_name = 'baza'; // database name
function getmicrotime()
{
return $microtime[1
] . substr($microtime[0
], 1
); }
function sql_connect($db_server, $db_user, $db_pass, $db_name) {
$status = true;
}
else {
$status = false;
}
return $status;
}
// set_time_limit(1200);
if(sql_connect($db_server, $db_user, $db_pass, $db_name)){
$data1 = array(92246
,72682444
,83043112
);
$opcja = $_GET['o'];
$time_start = getmicrotime();
if($opcja == 1){
try {
//stworzenie obiektu cache.
$cache = new Cache();
$cache->AddDriver('fileDriver',new CacheFileDriver('Cache'));
$cache->AddGroup('@queries', array( 'lifetime'=>86400,
'driver'=>'fileDriver',
'hashid'=>true
));
for($j=0;$j<5000;$j++){
for($i=0;$i<$ile;$i++){
$queries = "select * from katalog WHERE opcja = ".$data1[$i];
$val = $cache->Get($queries, '@queries');
$cache->Put($queries, $data, '@queries');
}
else {
}
}
}
}
catch (CacheException $e){
echo '<span style="color:red">'.$e->getMessage().'</span>'; }
}
else {
for($j=0;$j<5000;$j++){
for($i=0;$i<$ile;$i++){
$queries = "select * from katalog WHERE opcja = ".$data1[$i];
}
}
}
}
$time_stop = getmicrotime();
$roznica = $time_stop - $time_start;
echo 'Czas wczytywania pliku: ' . $roznica;
Pyton_000
7.01.2015, 11:55:23
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

I w tym wypadku minimalizuje ilość zapytań samych w sobie, a nie szybkość (bo tu nie ma co przyspieszać)
nospor
7.01.2015, 11:56:12
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.