Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [ZF] ZF1 - początki cache
IceManSpy
post
Post #1





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


Cześć

Mam już wykonaną aplikację w Z1. Nie jest ona jakaś wielka, lecz mam dorobić do niej cacheowanie danych. Jednak nie za bardzo wiem, od czego rozpocząć i jak dorobić do już istniejącej aplikacji taką funkcjonalność. Aplikacja jest podzielona na moduły jeśli ma to znaczenie.

Przeglądając różne informacje, nie znajduję przykładów z aplikacji wziętych. Tylko jakiś cache w pętach for. Znalazłem u nas na forum coś takiego:
http://forum.php.pl/index.php?showtopic=122459

Ale jak w tym wypadku wygląda sprawa routingu? Czy przy cache podaje się ścieżki zendowskie np. galery/index/show/id/2 czy można swoje np. galeria/2 ?

Co oczekuję od cache, tzn co chcę cacheować. Zapytania z DB oraz widoki w pewnych przypadkach i trzymać to w plikach. Np. mam galerię o ID 2, gdzie pobierane z bazy są obrazki (nazwy plików) i wyświetlane w widoku. I ten widok chciałbym cały zcacheować, ponieważ nie będą się tam tak często dane zmieniać – praktycznie w ogóle.

Mogę liczyć na jakieś wskazówki? Jakich klas używać? Czy definiuje to w controlera, bootstrapie, pindex.php czy gdzie?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
skowron-line
post
Post #2





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


Tyle Ci powinno wystarczyć
http://framework.zend.com/manual/1.12/en/z...troduction.html
Go to the top of the page
+Quote Post
IceManSpy
post
Post #3





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


Przeglądałem to, ale nadal nie wiem, gdzie umieścić Zend_Cache::factory. Czy w pliku boostrap, czy w pliku index.php ?
Go to the top of the page
+Quote Post
skowron-line
post
Post #4





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


Nie wszystko będziesz cachował więc tam gdzie chcesz coś zcachować.
Jeżeli chcesz zcachować widok to w kontrolerze, jeżeli wynik zapytania to w modelu.
Go to the top of the page
+Quote Post
IceManSpy
post
Post #5





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


Ok, troche poczytałem i spróbowałem. Coś tam się zcacheowało (IMG:style_emoticons/default/smile.gif) Zastanawiam się jednak nad poprawnością mojego rozwiązania. Chcę w każdym miejscu mieć możliwość odwołania sie do cache, więc napisałem sobie plugin:
  1. class My_CacheManager
  2. {
  3. public function getCacheManager()
  4. {
  5. $bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap');
  6. $cacheManager = $bootstrap->getResource('cachemanager');
  7. $cache = $cacheManager->getCache('database');
  8. return $cache;
  9. }
  10. }


Potem w kontrolerze tworzę nowy obiekt tego pluginu i na nim wywołuje metody load, save itd. Czy takie rozwiązanie jest dość dobre? Dodam, że w przyszłości rozbuduję ten plugin do cacheowania innych elementów albo o innych parametrach.

Czy takie rozwiązanie jest akceptowalne? Czy może są lepsze?
Go to the top of the page
+Quote Post
CuteOne
post
Post #6





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


Tylko po co angażować w to pluginy? Lepiej zainicjować cache w bootstrapie i dodać go do rejestru.

Bootstrap.php
  1. public function _initCache() {
  2.  
  3. $config = Zend_Config('path');
  4. $cache = new Zend_Cache($config);
  5. Zend_Registry:: set('cache', $cache);
  6. }


IndexController.php
  1.  
  2. public function viewAction() {
  3.  
  4. $cache = Zend_Registry:: get('cache');
  5.  
  6. if(!$rows = $cache->load('xxx')) {
  7.  
  8. $rows = $model->fetchAll();
  9. $cache->save('xxx', $rows);
  10. }
  11. }


Ot i cała filozofia (IMG:style_emoticons/default/smile.gif)

ps. pisane z palca, więc musisz zajrzeć do manuala
Go to the top of the page
+Quote Post
IceManSpy
post
Post #7





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


Też myślałem o bootstrapie i chyba jednak tam przeniosę uruchamianie.
Jeszcze przeprowadzam nauko-test z cache całej strony (na razie zapisane mam jako plugin i chce cache'ować wszystkie podstrony - na wyrost też są wszystkie parametry).
  1. public function getTestCache()
  2. {
  3. $frontendOptions = array(
  4. 'lifetime' => 7200,
  5. 'debug_header' => true, // for debugging
  6. 'default_options' => array(
  7. 'cache_with_get_variables' => true,
  8. 'cache_with_post_variables' => true,
  9. 'cache_with_session_variables' => true,
  10. 'cache_with_files_variables' => true,
  11. 'cache_with_cookie_variables' => true,
  12. 'make_id_with_get_variables' => true,
  13. 'make_id_with_post_variables' => true,
  14. 'make_id_with_session_variables' => true,
  15. 'make_id_with_files_variables' => true,
  16. 'make_id_with_cookie_variables' => true,
  17. 'cache'=>true)
  18. );
  19.  
  20. $backendOptions = array(
  21. 'cache_dir' => APPLICATION_PATH.'/../cache/views'
  22. );
  23.  
  24. $cache = Zend_Cache::factory('Page',
  25. 'File',
  26. $frontendOptions,
  27. $backendOptions);
  28.  
  29. return $cache;
  30. }

A kontrolerze dla wybranej akcji robię tak:
  1. $a = new My_CacheManager();
  2. $b = $a->getTestCache();
  3. $b->start();

Tworzy się plik cache, ale mogę to zrobić tylko raz! Potem pojawia mi się biała strona i przy włączonym debugowaniu mam info, że strona jest zcache'owana.

Ale jak przeniosę kod z wybranej akcji do init, to (po wyczyszczeniu cache) działa bez problemów. Czym się to tak na prawdę różni (wiem, że init odpala się przed każdą akcja)?
Czy jakbym chciał zdefiniować wybrane akcje do cache, to muszę robić to w tablicy frontendOptions jako regexps'y?

Ten post edytował IceManSpy 15.12.2012, 23:42:48
Go to the top of the page
+Quote Post
CuteOne
post
Post #8





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


  1.  
  2. $a = new My_CacheManager();
  3. $b = $a->getTestCache();
  4.  
  5. if(!$b->start('xxx')) {
  6.  
  7. echo 'widok';
  8. $b->end();
  9. }

Go to the top of the page
+Quote Post
IceManSpy
post
Post #9





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


No właśnie, ale jak dobrać się do widoku?
  1. $this->render();

Nie bardzo działało.
Poza tym Zend_Cache_Frontend_Page nie ma zdefiniowanej metody end, ponieważ wg dokumentacji nie muszę jej wywoływać - Zend robi to samo i sam nadaje ID dla cache.
Go to the top of the page
+Quote Post
CuteOne
post
Post #10





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


To, że coś się dzieje "automatycznie" nie znaczy, że warto się tego trzymać (chyba, że nie zależy ci na kontroli)(IMG:style_emoticons/default/tongue.gif)

http://zend-framework-community.634137.n4....s-td670907.html
Go to the top of the page
+Quote Post
IceManSpy
post
Post #11





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


Ten link też znalazłem, tylko w nim jest opisany Output, dlatego go pominąłem (IMG:style_emoticons/default/smile.gif) Masz też dużą rację z kontrolą - teraz przynajmniej mogę tworzyć sobie cache o jakich chce tagach czy nazwach.
Ostatecznie robię to tak, gdzie getViewCacheManager to metoda pobierająca config - w przyszłości przerzucę ją na boostrapa:
  1. $a = new My_CacheManager();
  2. $b = $a->getViewCacheManager();
  3. $cached = $b->load($this->_request->getActionName());
  4.  
  5. if(!$cached)
  6. {
  7. $cached = $this->view->render($this->getViewScript());
  8. $b->save($cached, $this->_request->getActionName());
  9. }
  10. else
  11. {
  12. $this->_helper->viewRenderer->setNoRender();
  13. echo $cached;
  14. }

Wielkie dzięki za rady i wskazówki (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

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: 24.08.2025 - 00:32