2012-01-17 27 views
40

Potrzebuję buforować niektóre dane specyficzne dla aplikacji za pomocą systemu buforowania Symfony 2, aby móc uruchomić cache:clear, aby go wyczyścić. Cache cache opiera się na numerze app/cache, ale w jaki sposób mogę cachować dane?Jak buforować w Symfony 2?

http://symfony.com/doc/current/cookbook/index.html

Jedyne co widzę to temat o buforowanie HTML lakierem.

+0

Symfony2 może to również buforować wewnętrznie za pomocą implementacji ESI. Z początku może wydawać się nieco zawiłe, ale czyni krok do skalowania lakierem o wiele mniejszym. –

+0

@ Louis-PhilippeHuberdeau Interesuje mnie buforowanie określonych danych aplikacji, a nie szablonu/HTML. – Tower

Odpowiedz

77

Jeśli używasz Doctrine już po prostu korzystaj z tych klas pamięci podręcznej.

Dodaj serwis do config.yml:

services: 
    cache: 
     class: Doctrine\Common\Cache\ApcCache 

i używać go w kontrolerze:

if ($fooString = $this->get('cache')->fetch('foo')) { 
    $foo = unserialize($fooString); 
} else { 
    // do the work 
    $this->get('cache')->save('foo', serialize($foo)); 
} 
+20

Co, jeśli nie używam Doctrine? Dlaczego ta część Doctrine? – Tower

+2

@Tower Nadal nie ma na to odpowiedzi? – ChocoDeveloper

+1

@Tower Odpowiedź wydaje się być taka, że ​​Doctrine potrzebowała tego komponentu i stworzyła cholernie dobry, więc Symfony2 go nie wymyśli, ale nie rozdzielili go na inne repozytorium, więc jesteśmy tutaj. – ChocoDeveloper

0

Brak częściowej pamięci podręcznej w Symfony2, wbudowana pamięć podręczna jest pełna tylko HTTP. Musisz użyć odwrotnego proxy, a jeśli chcesz tylko buforować fragment kodu, musisz użyć ESI. To może więcej pracy niż z symfony 1, ale warte są tego występy.

W każdym razie, nic nie zatrzyma się korzystać z memcached i przechowywać kilka rzeczy w nim, patrzeć at this Bundle tj Jeżeli w danym stanie zapytania to, tylko masz danych do sklepu, który jest idealny (a memcache cache jest znacznie szybsze niż system plików jeden).

+3

Jestem zainteresowany buforowaniem danych specyficznych dla aplikacji, np. Kosztownymi obliczeniowo rezultatami itd. Cykluję je już na APC, ale jaki jest sens posiadania dwóch różnych systemów pamięci podręcznej? Też muszę wyczyścić dwie pamięci podręczne teraz, chociaż zrobiłem jedno własne polecenie, które usuwa oba, ale nadal. – Tower

+0

Mówi się, że APC nie powinien być używany do buforowania danych (np. Z DB), gdy jest używany jako pamięć podręczna opcode, ponieważ wpływa na jej wydajność. Istnieje kwestia, dlaczego należy używać oddzielnej pamięci podręcznej do przechowywania niestandardowych danych. – forsberg

32

Proste użycie sposób Doktryna dostawcy cache. Początkowo zarejestrować usługę (próbkę w config.yml):

services: 
    memcached: 
     class: Memcached 
     calls: 
      - [ addServer, ['localhost', 11211] ] 
    memcached_cache: 
     class: Doctrine\Common\Cache\MemcachedCache 
     calls: 
      - [ setMemcached, [@memcached] ] 

Następnie do wykorzystania dostać usługę, na przykład kontroler:

$cache = $this->get('memcached_cache'); 

wysłać do innego wykorzystania usług nazywa :

calls: 
    - [ setCacheProvider, [@memcached_cache] ] 

lub argumenty:

arguments: 
    - @memcached_cache 

W ten sam sposób można użyć innych interfejsów pakietu Doctrine Cache. Nauki Pamięć podręczna zapewnia bardzo prosty interfejs dla których kilka z implementacji skrzynkowych są przewidziane:

  • ApcCache (wymaga wew/APC)
  • ArrayCache (w pamięci, czas życia żądanie)
  • FilesystemCache (nie jest optymalna dla dużej współbieżności)
  • MemcacheCache (wymaga ext/memcache)
  • MemcachedCache (wymaga ext/memcached)
  • PhpFileCache (nie jest optymalna dla dużej concurrenc r)
  • RedisCache.php (wymaga ext/phpredis)
  • WinCacheCache.php (wymaga ext/wincache)
  • XcacheCache.php (wymaga ext/XCache)
  • ZendDataCache.php (wymaga Zend Server Platform)

Jeśli nie używałeś Doktryna, można wymagać Common Biblioteka dla projektów Doktryny: php composer.phar require doctrine/common lub wymagają tylko buforowanie biblioteki oferując obiektowe API dla wielu backendów cache: php composer.phar require doctrine/cache

Jak korzystać Doctrine buforowania można przeczytać w Doctrine Common documentation na Doctrine Project web site

+0

dziękuję bardzo za tę odpowiedź, w końcu działa, po prostu miałem mały błąd z YAML , wydaje się, że @memcached wymaga cytatów - [setMemcached, ['memcached ']] (używam Symfony 3.0) – ThomasP1988

8

Symfony2 nie zapewnia żadnego komponentu do buforowania warstwy aplikacji.

jakbyś już powiedziano, można użyć doktryny Common buforowania biblioteki http://docs.doctrine-project.org/projects/doctrine-common/en/latest/reference/caching.html

Jeśli chcesz coś bardziej zaawansowane, można również skorzystać z jednej wiązki cache dostarczonych przez społeczność. Na przykład: https://github.com/TheBigBrainsCompany/TbbcCacheBundle#cachebundle, który zapewnia narzędzia do dobrej strategii buforowania.