Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF] ZF1 - początki cache
Forum PHP.pl > Forum > PHP > Frameworki
IceManSpy
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?
skowron-line
Tyle Ci powinno wystarczyć
http://framework.zend.com/manual/1.12/en/z...troduction.html
IceManSpy
Przeglądałem to, ale nadal nie wiem, gdzie umieścić Zend_Cache::factory. Czy w pliku boostrap, czy w pliku index.php ?
skowron-line
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.
IceManSpy
Ok, troche poczytałem i spróbowałem. Coś tam się zcacheowało 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?
CuteOne
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 smile.gif

ps. pisane z palca, więc musisz zajrzeć do manuala
IceManSpy
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?
CuteOne
  1.  
  2. $a = new My_CacheManager();
  3. $b = $a->getTestCache();
  4.  
  5. if(!$b->start('xxx')) {
  6.  
  7. echo 'widok';
  8. $b->end();
  9. }

IceManSpy
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.
CuteOne
To, że coś się dzieje "automatycznie" nie znaczy, że warto się tego trzymać (chyba, że nie zależy ci na kontroli)tongue.gif

http://zend-framework-community.634137.n4....s-td670907.html
IceManSpy
Ten link też znalazłem, tylko w nim jest opisany Output, dlatego go pominąłem 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 smile.gif
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.